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

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

目录

一、模型结构与要求

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 na
<think>我们正在讨论如何配置Gazebo中的differential_drive插件参数。根据用户的问题,他需要了解如何正确配置包括rosDebugLevel、publishWheelTF、robotNamespace、publishTf等选项。根据引用[1]和引用[3],我们知道在Gazebo中配置机器人模型通常使用URDF或Xacro文件,并且会涉及到在Gazebo中运行所需的特定标签和插件。特别是,differential_drive插件是用于差分驱动机器人Gazebo插件,它负责控制机器人的运动并发布相关的ROS话题和TF变换。现在,我将详细解释每个参数:1.rosDebugLevel:用于设置ROS调试信息的输出级别。通常有多个级别,例如Debug,Info,Warn,Error。设置为Debug会输出最详细的信息,适用于调试阶段;而生产环境中可能使用Info或更高级别以减少输出。2.publishWheelTF:布尔值(true或false),用于指定是否发布轮子的TF变换。如果设置为true,插件会发布轮子关节的变换(通常是从底盘到轮子的变换)。如果不需要轮子的独立变换(例如,轮子只是作为底盘的一部分),可以设置为false以减少TF树的复杂度。3.robotNamespace:字符串,用于设置插件使用的ROS命名空间。这允许在同一个Gazebo仿真中运行多个相同的机器人时,通过不同的命名空间来区分它们的话题和服务。如果不设置,默认使用全局命名空间。4.publishTf:布尔值,用于指定是否发布从odom坐标系到机器人底盘坐标系的变换(通常称为odom->base_link的变换)。这个变换是由插件根据轮子的运动学计算出来的,用于机器人的定位(作为里程计信息)。如果设置为false,则不会发布此变换,需要用户自行提供。此外,differential_drive插件还有其他重要参数,例如:-wheelSeparation:两个驱动轮之间的距离(单位:米)-wheelDiameter:驱动轮的直径(单位:米)-torque:施加在轮子上的扭矩(单位:牛米)-topicName:订阅的命令话题名称(通常是cmd_vel)-odometryTopic:发布的里程计话题名称(默认是odom)-odometryFrame:里程计坐标系(通常是odom)-robotBaseFrame:机器人底盘坐标系(例如base_link或base_footprint)配置步骤:1.机器人的URDF或Xacro文件中,为底盘链接(base_link)添加Gazebo插件标签。2.在<gazebo>标签内添加<plugin>标签,指定插件名称为"libgazebo_ros_diff_drive.so"(对于ROS1)或根据ROS2版本有所不同。3.在<plugin>标签内,使用<ros>和<namespace>元素来设置robotNamespace(如果使用ROS2,则可能用不同的方式)。4.使用<rosDebugLevel>、<publishWheelTF>、<publishTf>等参数进行配置。示例配置(在Xacro文件中):```xml<gazebo><pluginname="differential_drive_controller"filename="libgazebo_ros_diff_drive.so"><!--ROS参数--><ros><!--设置命名空间--><namespace>/my_robot</namespace><!--设置调试级别,可选:Debug,Info,Warn,Error--><debugLevel>Debug</debugLevel></ros><!--插件参数--><publishWheelTF>true</publishWheelTF><publishTf>true</publishTf><robotNamespace>/my_robot</robotNamespace><!--如果<ros>中已经设置,这里可以省略--><!--运动学参数--><leftJoint>left_wheel_joint</leftJoint><rightJoint>right_wheel_joint</rightJoint><wheelSeparation>0.3</wheelSeparation><!--轮距,单位:米--><wheelDiameter>0.1</wheelDiameter><!--轮子直径,单位:米--><torque>10</torque><!--扭矩--><topicName>cmd_vel</topicName><!--订阅的速度命令话题--><odometryTopic>odom</odometryTopic><!--发布的里程计话题--><odometryFrame>odom</odometryFrame><robotBaseFrame>base_footprint</robotBaseFrame></plugin></gazebo>```注意:在同一个插件中,如果同时设置了<ros>内的<namespace>和<robotNamespace>,可能会冲突。通常,我们使用<robotNamespace>或者<ros><namespace>,建议只使用一种方式。另外,根据引用[5],如果出现坐标系缺失(比如map和odom之间没有连接),我们可以使用static_transform_publisher来发布静态变换。但是,differential_drive插件本身只负责发布从odom到base_frame的变换。因此,如果需要map到odom的变换(例如由定位模块提供),则需要额外的节点。关于TF变换:如果设置了publishTf为true,那么插件会发布odom->base_frame的变换。但是,如果机器人有多个轮子,且publishWheelTF为true,那么每个轮子关节的变换也会被发布。调试建议:如果机器人没有按预期运动,可以检查以下步骤:-确保轮子关节的名称(leftJoint和rightJoint)与URDF中定义的完全一致。-检查轮距和轮子直径是否正确。-查看调试输出(设置debugLevel为Debug)以获取更多信息。以上配置基于ROS1Gazebo。对于ROS2,插件名称可能不同(如libgazebo_ros_diff_drive.so变为libgazebo_ros_diff_drive系统),但参数配置类似。最后,关于引用[2]和[4],在Gazebo中配置URDF时,需要确保每个link都有<collision>和<inertial>标签,否则Gazebo无法正确模拟物理特性。同时,颜色设置需要使用Gazebo特定的<material>标签(如引用[4]所示)。因此,在配置differential_drive插件之前,请确保机器人的URDF模型已经正确设置了这些物理属性。如果用户需要更具体的帮助,可以提供当前配置的片段,以便进一步诊断问题。现在,我将生成相关问题。</think>### Gazebo差分驱动插件参数配置指南 在Gazebo中配置`differential_drive`插件需要正确设置URDF/Xacro文件中的参数。以下是关键参数的解释和配置方法: #### 核心参数说明 1. **`rosDebugLevel`** - 作用:控制ROS调试信息输出级别 - 可选值:`Debug`(最详细)、`Info`、`Warn`、`Error` - 示例:`<rosDebugLevel>Debug</rosDebugLevel>` - 建议:调试阶段用`Debug`,正式运行用`Info`或`Warn` 2. **`publishWheelTF`** - 作用:是否发布轮子关节的TF变换 - 类型:布尔值(`true`/`false`) - 示例:`<publishWheelTF>true</publishWheelTF>` - 注意:设为`true`时需确保URDF中有完整的轮子关节定义[^2] 3. **`robotNamespace`** - 作用:指定ROS话题的命名空间 - 示例:`<robotNamespace>/robot1</robotNamespace>` - 应用场景:多机器人仿真时隔离话题(如`/robot1/cmd_vel`) 4. **`publishTf`** - 作用:是否发布里程计到基座的TF变换 - 类型:布尔值 - 示例:`<publishTf>true</publishTf>` - 关键:必须设为`true`才能生成`odom→base_link`变换[^5] #### 完整配置示例(Xacro文件) ```xml <gazebo> <plugin name="differential_drive" filename="libgazebo_ros_diff_drive.so"> <!-- 基础参数 --> <rosDebugLevel>Info</rosDebugLevel> <publishWheelTF>true</publishWheelTF> <robotNamespace>/mbot</robotNamespace> <publishTf>true</publishTf> <!-- 运动学参数 --> <wheelSeparation>0.25</wheelSeparation> <!-- 轮距(米) --> <wheelDiameter>0.1</wheelDiameter> <!-- 轮直径(米) --> <torque>5.0</torque> <!-- 轮扭矩(N·m) --> <!-- 坐标系设置 --> <odometryTopic>odom</odometryTopic> <odometryFrame>odom</odometryFrame> <robotBaseFrame>base_footprint</robotBaseFrame> <!-- 话题配置 --> <topicName>cmd_vel</topicName> <!-- 速度指令订阅 --> </plugin> </gazebo> ``` #### 关键注意事项 1. **TF树完整性** - 若出现坐标系断裂(如`map→odom`缺失),需添加静态TF发布器: ```xml <node pkg="tf" type="static_transform_publisher" name="map_odom_bridge" args="0 0 0 0 0 0 map odom 100" /> ```[^5] 2. **物理属性要求** - Gazebo模型必须包含完整的`<collision>`和`<inertial>`标签[^2] - 材料颜色需使用Gazebo专用标签: ```xml <gazebo reference="base_link"> <material>Gazebo/Blue</material> </gazebo> ```[^4] 3. **启动文件集成** - 确保在launch文件中正确加载Xacro模型: ```xml <param name="robot_description" command="$(find xacro)/xacro '$(find pkg)/urdf/mbot_gazebo.xacro'" /> ```[^3] #### 调试建议 - 使用`rqt_tf_tree`检查TF链路完整性 - 通过`rostopic echo /odom`验证里程计输出 - 当`rosDebugLevel=Debug`时,在终端查看详细插件日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值