Gazebo系列教程< 构建一个机器人 2.1> 创建本体

本文介绍如何使用Gazebo创建机器人模型,包括模型结构、SDF文件编写及构建差动驱动机器人等关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、模型结构与要求

1.模型数据库结构

二、设计一个模型

1.SDF模型组成

2.构建一个模型

三、构建一个可移动的机器人

1.建立模型路径

2.建立模型的结构


 

一、模型结构与要求

gazebo可以通过GUI或者编程方式动态的加载模型。

Gazebo中的模型定义了具有动态、运动学和视觉属性的物理实体。另外,一个模型可能有一个或多个插件,这些插件会影响模型的行为。

模型可以代表任何东西,从简单的形状到复杂的机器人;甚至地面也是一个模型。

可以通过一下方式下载模型数据库:

 git clone https://github.com/osrf/gazebo_models

1.模型数据库结构

 为了更好的管理以及设计,模型数据库必须遵循特定的目录和文件结构。

数据库的结构如下所示(仅有一个model_1的情况下):

模型数据库的根目录包含两部分:(1)一个保存数据库信息的database.config配置文件;(2)所有模块的目录;

在每个模块的目录之下也包含一个model.config,内部是关于每个model的meta-data(应该翻译成元数据吧,我理解的就是原始数据吧)。

同时模型的目录下还包含模型、任何材质和插件的SDF文件。

以下是针对上述根目录包含的两部分,分别就具体内容进行说明:

(1)database 配置

注意编辑这里采用gedit,如果采用gvim编辑config与sdf可能存在gazebo不识别模型的情况。

database.config的格式如下:

<?xml version='1.0'?>
<database>
  <name>name_of_this_database</name>
  <license>Creative Commons Attribution 3.0 Unported</license>
  <models>
    <uri>file://model_directory</uri>
  </models>
</database>

database.config包含了数据库名字、模型的license信息,以及一个有效模型的列表。

(2)模型配置

每个模块必须在其根目录包含一个模型的配置文件

model.config的格式如下所示:

<?xml version="1.0"?>

<model>
  <name>My Model Name</name>
  <version>1.0</version>
  <sdf version='1.5'>model.sdf</sdf>

  <author>
    <name>My name</name>
    <email>name@email.address</email>
  </author>

  <description>
    A description of the model
  </description>
</model>

关于name、version、author这几项参数此处不解释,相信大家也能明白。

sdf参数,需要填入sdf文件,这里的sdf文件可以是网上下载的也可以是自己编辑的,description则是对于该模型的描述;

 

二、设计一个模型

SDF模型可以从简单的形状到复杂的机器人。其本质上就是连接(link),关节(joint)、碰撞对象、视觉效果和插件的集合。

1.SDF模型组成

sdf的模型组成主要包括links、joints、plugins,其中links又包括collision、visual、inertial、sensor、light。

(1)links

是一个模型的实体的物理特性,links可以是一个车轮、一个链环。每个link又可能包含可视化与碰撞部分。

因为碰撞检测的计算量非常大,甚至占到整个机器人控制中的90%以上,所以往往会通过简化模型的方式来降低碰撞检测的运算量。

所以才会有碰撞模型与可视化模型,可视化模型一般就是实际的模型外观,而碰撞模型则尽量采用规则的形状,力求简单。

(2)joints

joint是连接两个link的节点,也就是关节,关节参数主要包括子节点、父节点、旋转轴以及关节角限制。

(3)plugins

插件是由第三方创建的库

2.构建一个模型

gazebo到这里才开始涉及到实际的东西,终于可以动手操作一些东西了!

gazebo提供一些简单的例如长方体、球、圆柱基本的模型,在不满足设计要求的情况下,也可以通过绘图软件自己设计。

gazebo需要的模型文件的格式包括:STL,Collada,OBJ

产生一个简单的SDF文件:

<?xml version='1.0'?>
<sdf version="1.4">
  <model name="my_model">
    <pose>0 0 0.5 0 0 0</pose>
    <static>true</static>
    <link name="link">
      <inertial>
        <mass>1.0</mass>
        <inertia> <!-- inertias are tricky to compute -->
          <!-- http://gazebosim.org/tutorials?tut=inertia&cat=build_robot -->
          <ixx>0.083</ixx>       <!-- for a box: ixx = 0.083 * mass * (y*y + z*z) -->
          <ixy>0.0</ixy>         <!-- for a box: ixy = 0 -->
          <ixz>0.0</ixz>         <!-- for a box: ixz = 0 -->
          <iyy>0.083</iyy>       <!-- for a box: iyy = 0.083 * mass * (x*x + z*z) -->
          <iyz>0.0</iyz>         <!-- for a box: iyz = 0 -->
          <izz>0.083</izz>       <!-- for a box: izz = 0.083 * mass * (x*x + y*y) -->
        </inertia>
      </inertial>
      <collision name="collision">
        <geometry>
          <box>
            <size>1 1 1</size>
          </box>
        </geometry>
      </collision>
      <visual name="visual">
        <geometry>
          <box>
            <size>1 1 1</size>
          </box>
        </geometry>
      </visual>
    </link>
  </model>
</sdf>

产生了一个可视化尺寸与碰撞尺寸均是1的立方体。由于该立方体的原点在中心,所以为了方立方体平放在地面上,需要在z轴方向向上偏移0.5,设置为该model的位置。

 

三、构建一个可移动的机器人

第三部分主要解释gazebo的基本模型管理,通过一步一步的创建一个差动驱动两轮式移动机器人来练习熟悉模型数据库中的基本模型的表示。

1.建立模型路径

(1)产生一个模型的路径:

mkdir -p ~/.gazebo/models/my_robot

(2)产生一个配置文件:

gedit ~/.gazebo/models/my_robot/model.config

(3)将以下内容写入配置文件:

<?xml version="1.0"?>
<model>
  <name>My Robot</name>
  <version>1.0</version>
  <sdf version='1.4'>model.sdf</sdf>

  <author>
   <name>My Name</name>
   <email>me@my.email</email>
  </author>

  <description>
    My awesome robot.
  </description>
</model>

(4)产生一个sdf文件

gedit ~/.gazebo/models/my_robot/model.sdf

(5)将以下内容写入sdf文件

<?xml version='1.0'?>
<sdf version='1.4'>
  <model name="my_robot">
  </model>
</sdf>

至此,已经有一个模型的基本内容。

2.建立模型的结构

通过这一部分,会构建一个简单的车子,车身是一个长方体,并带有两个轮子。

(1)首先是将模型设置为静态,此种情况下会被物理引擎忽略。因此,模型会保持在一个位置,同时可以让我们把所有组件正确的对其。

在原有的model.sdf的

上图所示代码的后面插入<static>true</static>后,model.sdf内容如下:

<?xml version='1.0'?>
<sdf version='1.4'>
  <model name="my_robot">
  <static>true</static>
  </model>
</sdf>

(2)添加矩形的车体

添加之后的model.sdf文件如下:

<?xml version='1.0'?>
<sdf version='1.4'>
	<model name="my_robot">
	<static>true</static>
		<link name='chassis'>
			<pose>0 0 .1 0 0 0</pose>

			<collision name='collision'>
				<geometry>
					<box>
						<size>.4 .2 .1</size>
					</box>
				</geometry>
			</collision>

			<visual name='visual'>
				<geometry>
					<box>
						<size>.4 .2 .1</size>
					</box>
				</geometry>
			</visual>
		</link>
	</model>
</sdf>

设置的碰撞尺寸是碰撞检测用到的形状,视觉尺寸是渲染时使用的形状。就如前面所提到的碰撞检测的特点一样,实际碰撞检测用的尺寸是跟我们在GUI中看到的外形有些区别的。

(3)测试一下设计好的模块

输入:gazebo

然后点左上角菜单栏Insert

下拉菜单中找到My Robot单击后,鼠标移到右侧显示界面,就会出现原来编辑的立方体,

选择想放置的位置即可。如下图所示:

(4)现在在原来立方体的基础上添加车轮

车轮设置的是一个没有摩擦力的球体。

需要添加的代码段是:

          <collision name='caster_collision'>
            <pose>-0.15 0 -0.05 0 0 0</pose>
            <geometry>
                <sphere>
                <radius>.05</radius>
              </sphere>
            </geometry>

            <surface>
              <friction>
                <ode>
                  <mu>0</mu>
                  <mu2>0</mu2>
                  <slip1>1.0</slip1>
                  <slip2>1.0</slip2>
                </ode>
              </friction>
            </surface>
          </collision>

          <visual name='caster_visual'>
            <pose>-0.15 0 -0.05 0 0 0</pose>
            <geometry>
              <sphere>
                <radius>.05</radius>
              </sphere>
            </geometry>
          </visual>

(5)添加左轮

需要添加的代码:

      <link name="left_wheel">
        <pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
        <collision name="collision">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </visual>
      </link>

(6)添加右轮

需要添加的代码:

      <link name="right_wheel">
        <pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
        <collision name="collision">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </visual>
      </link>

(7)编写代码的最后一步

将模型设置为动态,就是(1)中的<static>true</static>修改成<static>false</static>

给左右轮分别增加一个铰链节点,代码如下:

      <joint type="revolute" name="left_wheel_hinge">
        <pose>0 0 -0.03 0 0 0</pose>
        <child>left_wheel</child>
        <parent>chassis</parent>
        <axis>
          <xyz>0 1 0</xyz>
        </axis>
      </joint>

      <joint type="revolute" name="right_wheel_hinge">
        <pose>0 0 0.03 0 0 0</pose>
        <child>right_wheel</child>
        <parent>chassis</parent>
        <axis>
          <xyz>0 1 0</xyz>
        </axis>
      </joint>

然后完整的代码如下:

<?xml version='1.0'?>
<sdf version='1.4'>
	<model name="my_robot">
	<static>false</static>
		<link name='chassis'>
			<pose>0 0 .1 0 0 0</pose>

			<collision name='collision'>
				<geometry>
					<box>
						<size>.4 .2 .1</size>
					</box>
				</geometry>
			</collision>

			<visual name='visual'>
				<geometry>
					<box>
						<size>.4 .2 .1</size>
					</box>
				</geometry>
			</visual>

         <collision name='caster_collision'>
            <pose>-0.15 0 -0.05 0 0 0</pose>
            <geometry>
					<sphere>
					<radius>.05</radius>
					</sphere>
            </geometry>

            <surface>
					<friction>
						<ode>
							<mu>0</mu>
							<mu2>0</mu2>
							<slip1>1.0</slip1>
							<slip2>1.0</slip2>
						</ode>
					</friction>
				</surface>
			</collision>

         <visual name='caster_visual'>
				<pose>-0.15 0 -0.05 0 0 0</pose>
            <geometry>
					<sphere>
						<radius>.05</radius>
					</sphere>
            </geometry>
         </visual>
		</link>
		
		<link name="left_wheel">
			<pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
			<collision name="collision">
				<geometry>
					<cylinder>
						<radius>.1</radius>
						<length>.05</length>
					</cylinder>
				</geometry>
			</collision>
			<visual name="visual">
				<geometry>
					<cylinder>
						<radius>.1</radius>
						<length>.05</length>
					</cylinder>
				</geometry>
			</visual>
      </link>

		<link name="right_wheel">
			<pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
			<collision name="collision">
				<geometry>
					<cylinder>
						<radius>.1</radius>
						<length>.05</length>
					</cylinder>
				</geometry>
			</collision>
			<visual name="visual">
				<geometry>
					<cylinder>
						<radius>.1</radius>
						<length>.05</length>
					</cylinder>
				</geometry>
			</visual>
		</link>
		<joint type="revolute" name="left_wheel_hinge">
			<pose>0 0 -0.03 0 0 0</pose>
			<child>left_wheel</child>
			<parent>chassis</parent>
			<axis>
				<xyz>0 1 0</xyz>
			</axis>
      </joint>

      <joint type="revolute" name="right_wheel_hinge">
			<pose>0 0 0.03 0 0 0</pose>
			<child>right_wheel</child>
			<parent>chassis</parent>
			<axis>
				<xyz>0 1 0</xyz>
			</axis>
      </joint>
	</model>
</sdf>

(8)启动gazebo,然后按照刚才方式插入设置好的模型

根据gazebo官方的说话,在force栏设置力的大小,做左侧窗口中,点上模型鼠标右键选择,如下图

单击Apply Force/Torque,弹出的菜单就可以设置力了。

 

 

 

 

 

<think>好的,我现在要解决用户在Gazebo中配置libLinkPlot3DPlugin.so插件来发布一个点的节点的问题。首先,我需要回忆一下Gazebo插件的基本配置方法。用户提到的libLinkPlot3DPlugin.so可能是一个用于绘制3D点或轨迹的插件,但我不太确定它的具体功能。可能需要查看Gazebo的文档或相关源码。 根据用户提供的引用内容,他们之前可能编译并安装过类似的插件,比如ActorCollisionsPlugin。所以步骤可能类似:下载源码、编译插件、配置模型文件。但需要确认libLinkPlot3DPlugin是否存在于某个Gazebo的示例或仓库中。 接下来,我需要思考如何在Gazebo中加载插件。通常,插件可以通过模型或世界的SDF文件来配置。用户可能需要在模型的SDF文件中添加<plugin>标签,指定插件库路径和参数,比如要发布的点的名称、话题名称等。此外,可能需要设置ROS的话题发布,如果用户在使用ROS的话。 然后,考虑插件的具体配置参数。例如,是否需要在插件中指定链接名称、更新速率、点的坐标等。用户想发布一个点的节点,可能需要设置该点的位置信息,并通过某个ROS话题发布出去。 还需要检查插件的编译和安装是否正确。确保插件库文件(.so)被正确放置到Gazebo的插件目录,比如/usr/lib/x86_64-linux-gnu/gazebo-9/plugins。如果用户自己编译插件,可能需要按照类似之前ActorCollisionsPlugin的步骤:克隆对应分支的仓库,进入相应目录,使用CMake编译,然后复制.so文件到正确位置。 最后,测试插件是否生效。运行包含该插件的世界文件,使用rostopic list或echo查看是否有预期的ROS话题发布,或者Gazebo的GUI中是否显示该点。 可能的陷阱包括插件版本不匹配、SDF文件配置错误、话题名称不正确等。需要确保Gazebo版本与插件分支对应,比如用户之前使用的是gazebo9,那么libLinkPlot3DPlugin也应该来自gazebo9的分支。 总结步骤可能为:下载对应源码,编译插件,配置模型的SDF文件添加插件参数,运行测试。同时需要指导用户如何验证节点是否正确发布,比如使用rostopic或查看Gazebo日志。</think>在Gazebo中配置libLinkPlot3DPlugin插件发布节点需要以下步骤: ### 1. **插件编译与安装** 1.1 下载对应版本的Gazebo源码(以gazebo9为例): ```bash git clone -b gazebo9 https://github.com/gazebosim/gazebo-classic ``` 1.2 进入插件源码目录: ```bash cd gazebo-classic/examples/plugins/link_plot3d ``` 1.3 编译插件: ```bash mkdir build && cd build cmake .. && make ``` 1.4 安装到系统插件目录: ```bash sudo cp libLinkPlot3DPlugin.so /usr/lib/x86_64-linux-gnu/gazebo-9/plugins ``` ### 2. **模型SDF配置** 在模型文件中添加插件声明(需指定发布数据的链接名称和话题名称): ```xml <link name="target_link"> <plugin name="link_plot3d" filename="libLinkPlot3DPlugin.so"> <topic_name>/point_data</topic_name> <update_rate>30</update_rate> <reference_link>world</reference_link> <offset>0 0 0</offset> </plugin> </link> ``` - `topic_name`:发布的ROS话题名称 - `offset`:相对链接的坐标偏移量[^1] ### 3. **运行与验证** 3.1 启动包含该模型Gazebo场景: ```bash gazebo your_model.world ``` 3.2 检查话题数据: ```bash rostopic echo /point_data ``` 应输出类似`geometry_msgs/Point`类型的三维坐标信息 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值