ROS探索总结(二十四)——使用gazebo中的插件

  • 内容
  • 评论
  • 相关

URDF文件完成后,可以在rviz中显示机器人的模型,如果要在gazebo中进行物理环境仿真,还需要为URDF文件加入一些gazebo相关的标签。既然是仿真,那么机器人应该像真在真实环境中一样,可以通过传感器感知周围环境,还可以根据指令进行运动。

gazebo中可以通过插入一些插件,来仿真机器人的传感器、执行器的特性,这些插件通过<gazebo>元素中的<plugin>标签描述,使用下边的格式加入到URDF文件中:

  1. <gazebo>
  2.   <plugin name="differential_drive_controller" filename="libdiffdrive_plugin.so">
  3.     ... plugin parameters ...
  4.   </plugin>
  5. </gazebo>

当然,这些插件常常需要附着于机器人的某个部分,比如要加入一个激光传感器的插件,那么我们需要将这个插件与机器人模型中的激光传感器link绑定:

  1. <gazebo reference="your_link_name">
  2.   <plugin name="your_link_laser_controller" filename="libgazebo_ros_laser.so">
  3.     ... plugin parameters ...
  4.   </plugin>
  5. </gazebo>

gazebo默认支持不少常用的设备,可以找到ros安装目录中的gazebo_plugins功能包,里边就是所有支持的插件。当然,你也可以自己编写需要的gazebo插件。

下边列出一些常用插件的使用方法:

1.差速驱动插件

很多机器人本体都采用差速驱动的方式,gazebo提供差速机器人的仿真插件,可以直接将下边的代码放到URDF文件中,修改相应的参数,指定运动控制需要订阅的主题,让机器人在gazebo中动起来。

  1. <gazebo>
  2.   <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
  3.     <alwaysOn>true</alwaysOn>
  4.     <updateRate>${update_rate}</updateRate>
  5.     <leftJoint>base_link_right_wheel_joint</leftJoint>
  6.     <rightJoint>base_link_left_wheel_joint</rightJoint>
  7.     <wheelSeparation>0.5380</wheelSeparation>
  8.     <wheelDiameter>0.2410</wheelDiameter>
  9.     <torque>20</torque>
  10.     <commandTopic>cmd_vel</commandTopic>
  11.     <odometryTopic>odom</odometryTopic>
  12.     <odometryFrame>odom</odometryFrame>
  13.     <robotBaseFrame>base_footprint</robotBaseFrame>
  14.   </plugin>
  15. </gazebo>

2.摄像头

   gazebo中也可以让机器人的摄像头看到虚拟的环境,将下边的代码放到URDF文件中,“reference”修改成机器人的摄像头link,还有一些分辨率、刷新率、发布的图像主题等等参数。把机器人模型在gazebo中运行起来后,用image_view或者rviz就可以看到机器人在虚拟环境中的视野了。

  1. <!-- camera -->
  2.   <gazebo reference="camera_link">
  3.     <sensor type="camera" name="camera1">
  4.       <update_rate>30.0</update_rate>
  5.       <camera name="head">
  6.         <horizontal_fov>1.3962634</horizontal_fov>
  7.         <image>
  8.           <width>800</width>
  9.           <height>800</height>
  10.           <format>R8G8B8</format>
  11.         </image>
  12.         <clip>
  13.           <near>0.02</near>
  14.           <far>300</far>
  15.         </clip>
  16.         <noise>
  17.           <type>gaussian</type>
  18.           <!-- Noise is sampled independently per pixel on each frame.
  19.                That pixel's noise value is added to each of its color
  20.                channels, which at that point lie in the range [0,1]. -->
  21.           <mean>0.0</mean>
  22.           <stddev>0.007</stddev>
  23.         </noise>
  24.       </camera>
  25.       <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
  26.         <alwaysOn>true</alwaysOn>
  27.         <updateRate>0.0</updateRate>
  28.         <cameraName>rrbot/camera1</cameraName>
  29.         <imageTopicName>image_raw</imageTopicName>
  30.         <cameraInfoTopicName>camera_info</cameraInfoTopicName>
  31.         <frameName>camera_link</frameName>
  32.         <hackBaseline>0.07</hackBaseline>
  33.         <distortionK1>0.0</distortionK1>
  34.         <distortionK2>0.0</distortionK2>
  35.         <distortionK3>0.0</distortionK3>
  36.         <distortionT1>0.0</distortionT1>
  37.         <distortionT2>0.0</distortionT2>
  38.       </plugin>
  39.     </sensor>
  40.   </gazebo>

     我们来解释一下这个插件中的参数含义:

  1.   <gazebo reference="camera_link">

插件都是用来描述linkjoint的,是一种虚无的属性描述,需要关联相应的实体,所以首先我们需要通过reference参数来定义关联的link或者joint。这里我们关联的是camera_link

  1. <sensor type="camera" name="camera1">

       然后声明插件的类型,并为该插件取一个唯一的名称。

  1. <update_rate>30.0</update_rate>

       设置摄像头数据更新的最大频率。

  1.         <horizontal_fov>1.3962634</horizontal_fov>
  2.         <image>
  3.           <width>800</width>
  4.           <height>800</height>
  5.           <format>R8G8B8</format>
  6.         </image>
  7.         <clip>
  8.           <near>0.02</near>
  9.           <far>300</far>
  10.         </clip>

再来设置一些摄像头相关的参数,尽量让这些仿真的参数与实际使用的硬件相同。

  1. <plugin name="camera_controller" filename="libgazebo_ros_camera.so">

关联摄像头插件,该插件已经在gazebo中实现,所以直接关联即可。

  1.         <cameraName>rrbot/camera1</cameraName>
  2.         <imageTopicName>image_raw</imageTopicName>
  3.         <cameraInfoTopicName>camera_info</cameraInfoTopicName>
  4.         <frameName>camera_link</frameName>

声明摄像头发布的消息话题,以及数据所在的参考系。

clip_image002[4]

clip_image004[4]

3.Kinect

Kinect在机器人导航中用的也很多,为机器人的kinect link绑定这个kinect插件,我们就可以在gazebo中进行SLAM、导航了,对于一些初学者,就算没有实体机器人,也可以在仿真器中玩转机器人。

  1. <gazebo>
  2.   <plugin name="${link_name}_controller" filename="libgazebo_ros_openni_kinect.so">
  3.     <baseline>0.2</baseline>
  4.     <alwaysOn>true</alwaysOn>
  5.     <updateRate>1.0</updateRate>
  6.     <cameraName>${camera_name}_ir</cameraName>
  7.     <imageTopicName>/${camera_name}/depth/image_raw</imageTopicName>
  8.     <cameraInfoTopicName>/${camera_name}/depth/camera_info</cameraInfoTopicName>
  9.     <depthImageTopicName>/${camera_name}/depth/image_raw</depthImageTopicName>
  10.     <depthImageInfoTopicName>/${camera_name}/depth/camera_info</depthImageInfoTopicName>
  11.     <pointCloudTopicName>/${camera_name}/depth/points</pointCloudTopicName>
  12.     <frameName>${frame_name}</frameName>
  13.     <pointCloudCutoff>0.5</pointCloudCutoff>
  14.     <distortionK1>0.00000001</distortionK1>
  15.     <distortionK2>0.00000001</distortionK2>
  16.     <distortionK3>0.00000001</distortionK3>
  17.     <distortionT1>0.00000001</distortionT1>
  18.     <distortionT2>0.00000001</distortionT2>
  19.     <CxPrime>0</CxPrime>
  20.     <Cx>0</Cx>
  21.     <Cy>0</Cy>
  22.     <focalLength>0</focalLength>
  23.     <hackBaseline>0</hackBaseline>
  24.   </plugin>
  25. </gazebo>

4.激光

有没有感叹过激光传感器太贵了!现在不要9999,不要999,只要把激光传感器的插件放到URDF模型中,上万的激光传感器在gazebo里随便用,妈妈再也不用担心玩机器人败家了。

  1. <gazebo reference="hokuyo_link">
  2.     <sensor type="ray" name="head_hokuyo_sensor">
  3.       <pose>0 0 0 0 0 0</pose>
  4.       <visualize>false</visualize>
  5.       <update_rate>40</update_rate>
  6.       <ray>
  7.         <scan>
  8.           <horizontal>
  9.             <samples>720</samples>
  10.             <resolution>1</resolution>
  11.             <min_angle>-1.570796</min_angle>
  12.             <max_angle>1.570796</max_angle>
  13.           </horizontal>
  14.         </scan>
  15.         <range>
  16.           <min>0.10</min>
  17.           <max>30.0</max>
  18.           <resolution>0.01</resolution>
  19.         </range>
  20.         <noise>
  21.           <type>gaussian</type>
  22.           <!-- Noise parameters based on published spec for Hokuyo laser
  23.                achieving "+-30mm" accuracy at range < 10m.  A mean of 0.0m and
  24.                stddev of 0.01m will put 99.7% of samples within 0.03m of the true
  25.                reading. -->
  26.           <mean>0.0</mean>
  27.           <stddev>0.01</stddev>
  28.         </noise>
  29.       </ray>
  30.       <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
  31.         <topicName>/rrbot/laser/scan</topicName>
  32.         <frameName>hokuyo_link</frameName>
  33.       </plugin>
  34.     </sensor>
  35.   </gazebo>

当然,实践是第一要义,这些插件用起来效果到底怎么样,还得你上手来试试。ROS中的很多机器人也提供了gazebo中仿真的模型和实验的案例,如果你还不太明白,直接运行这些已有的模型,看看别人写的代码,理解会更快。这里,推荐一个husky机器人的案例,可以在gazeboSLAM和自主导航。

clip_image006[4]

    husky机器人的主页是http://wiki.ros.org/Robots/Husky,仿真案例在Demo Applications那里。

 

 

参考链接:

http://gazebosim.org/tutorials?tut=ros_gzplugins

http://wiki.ros.org/Robots/Husky

 

 


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS探索总结(二十四)——使用gazebo中的插件

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

19条评论
  1. Gravatar 头像

    姚~ 回复

    你好,博文中描述的摄像头,我怎么才能才ros里面获取这个摄像头的视频流呢~

    • Gravatar 头像

      姚~ 回复

      @姚~ 已经知道,谢谢

  2. Gravatar 头像

    小菜鸡 回复

    请问,下载好的模型放在哪里啊 ?有说gazebo/model,可是没有找到。。

      • Gravatar 头像

        小菜鸡 回复

        @古月 在home里面建就可以吗?在usr-share-gazebo里面新建不了文件夹,usr-include-gazebo7-gazebo里面也新建不了。。

        • Gravatar 头像

          .-' _..`. / .'_.'.' | .' (.)`. ;' ,_ `. .--.__________.' ; `.;-' | ./ / | | / `..'`-._ _____, ..' / | | | |\ \ / /| | 回复

          @小菜鸡 ctrl+h 可以显示隐藏文件夹,那个是.gazebo

  3. Gravatar 头像

    一代瓜皮 回复

    古月老师,我写了一个3轮的小车模型,左右各一个动力轮,前面一个万向轮。现在,轮子走一步卡一步,不知道给万向轮添加什么插件合适。

    • 古月

      古月 回复

      @一代瓜皮 万向轮是被动运动的,不需要插件,做一个固定关节或者转动关节就可以了

  4. Gravatar 头像

    王涛 回复

    古月大哥,你好,我在 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch 时,报如下错误,月哥能否知道什么原因

    Warning [parser.cc:478] XML Attribute[frame] in element[pose] not defined in SDF, ignoring.
    Error [parser.cc:697] XML Element[torsional], child of element[friction] not defined in SDF. Ignoring.[friction]
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:348] Unable to read element

    • 古月

      古月 回复

      @王涛 你用的ros版本或者gazebo版本是不是不一样,看上去是版本导致的,先把这个launch里调用的地图删掉,用空环境试试。空环境可以的话,应该就是版本导致,那就自己做一个环境。

  5. Gravatar 头像

    小峰峰 回复

    古神,请问请问,怎么在gazebo中搭建道路公路模型??

    • 古月

      古月 回复

      @小峰峰 这个要看gazebo官网的教程,或者使用solidworks建模导出

  6. Gravatar 头像

    朱洪彪 回复

    你好,我现在在做实际的小车,想用实际的激光雷达代替虚拟的激光雷达,但是不明白怎么把实际的激光雷达和urdf中的相应关节联系起来,就像gazebo是用reference直接关联虚拟的传感器关节那样。

    • 古月

      古月 回复

      @朱洪彪 URDF模型中的激光雷达模型有一个激光坐标系,激光数据发布在这个坐标系下就可以了

  7. Gravatar 头像

    y 回复

    月哥,我用move_group和gazebo已经连接成功了,目标点位置,随机位置都没有问题,但只有笛卡尔坐标系的不行,我的圆弧,直线和样条曲线都是在笛卡尔坐标系中实现的,不知道是我不应该用笛卡尔坐标系规划不对,还是对于笛卡尔坐标系规划的设置有问题。

    • 古月

      古月 回复

      @y 笛卡尔空间的运动,最终还是通过IK反解为关节角度,才能驱动机器人运动

  8. Gravatar 头像

    丿灬安 回复

    “当然,你也可以自己编写需要的gazebo插件。”
    如果要自己编写gazebo插件,要怎么操作呢。。。网上好像都找不到相关教程啊

    • 古月

      古月 回复

      @丿灬安 gazebo插件暂时我也没写过,在gazebo的官网上找找看

发表评论

电子邮件地址不会被公开。 必填项已用*标注