使用 ROS中的插件

来源:互联网 发布:判决禁止使用域名 编辑:程序博客网 时间:2024/06/06 07:49

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和自主导航。