Gazebo与ros_control(2):七自由度机械臂和差分驱动小车
learningros
learningros 10154 0
2016-08-01 17:50
版权声明:本文为博主原创文章,如需转载,有劳您注明出处,谢谢O(∩_∩)O~

http://blog.csdn.net/yaked/article/details/51417742


在上一篇文章里,结合Gazebo官方的RRBot(2自由度机械臂)的相关配置文件,介绍了一些关于ros_control的基本知识。这里结合《Mastering ROS for Robotics Programming》这本书里的7自由度机械臂和一个差分驱动的底座再来探究一番。
首先根据上篇博客和书中的内容我们来总览一下,随后的操作都是基于这个来设置的。因为要仿真所以需要机器人模型,所以先得有urdf或者urdf.xacro文件。
  1. 接着,要想模型在Gazebo里运动起来,又需要在xacro里设置一些运动关节的 transmission;
  2. 其次,为了让它在gazebo里显示出来,需要借助于gazebo_ros这个package的node:spawn_model来加载一个empty_world;
  3. 随后,关节的pid设置是需要一个配置文件的robot_control.yaml;
  4. 最后则是利用launch来启动controller_manager这个package中的spawner这个node,加载第三步的配置并输入设定的controller以及发布robot的state到tf。


一、七自由度机械臂



1. transmission和gazebo_ros_control plugin——xacro文件


点击打开链接
定义transmission宏的地方,type用的是:transmission_interface/SimpleTransmission,hardwareInterface用的是:PositionJointInterface

  1. <xacro:macro name="transmission_block" params="joint_name">  
  2. <transmission name="tran1">  
  3.  <type>transmission_interface/SimpleTransmission</type>  
  4.  <joint name="${joint_name}">  
  5.    <hardwareInterface>PositionJointInterface</hardwareInterface>  
  6.  </joint>  
  7.  <actuator name="motor1">  
  8.    <hardwareInterface>PositionJointInterface</hardwareInterface>  
  9.    <mechanicalReduction>1</mechanicalReduction>  
  10.  </actuator>  
  11. </transmission>  
  12. </xacro:macro>  

调用transmission宏的地方并加入gazebo_ros_control pluginlibgazebo_ros_control.so它的另外一个plugin是:libgazebo_ros_openni_kinect.so在~/catkin_ws/src/mastering_ros_robot_description_pkg/urdf/sensors/xtion_pro_live.gazebo.xacro这个文件中


  1. <!-- Transmissions for ROS Control -->  
  2.  
  3. <xacro:transmission_block joint_name="shoulder_pan_joint"/>  
  4. <xacro:transmission_block joint_name="shoulder_pitch_joint"/>  
  5. <xacro:transmission_block joint_name="elbow_roll_joint"/>  
  6. <xacro:transmission_block joint_name="elbow_pitch_joint"/>  
  7. <xacro:transmission_block joint_name="wrist_roll_joint"/>  
  8. <xacro:transmission_block joint_name="wrist_pitch_joint"/>  
  9. <xacro:transmission_block joint_name="gripper_roll_joint"/>  
  10. <xacro:transmission_block joint_name="finger_joint1"/>  
  11. <xacro:transmission_block joint_name="finger_joint2"/>  
  12.  
  13. <!-- ros_control plugin -->  
  14. <gazebo>  
  15.  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">  
  16.    <robotNamespace>/seven_dof_arm</robotNamespace>  
  17.  </plugin>  
  18. </gazebo>  
  19.  
  20. <!-- Define arm with gripper mounted on a base -->  
  21. <xacro:base name="base"/>  
  22. <xacro:arm parent="base"/>  
  23. <xacro:gripper parent="tool"/>  
还记得第一讲中的吗,rrbot是在rrbot.gazebo中定义的ros_control,这里《Mastering ROS for Robotics Programming》本书的作者将ros_control和material都放在xacro中了,原理上是相通的。这里并没有上篇博客里的<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>,如果没有这句tag则默认是这个。




2. spawn_model 和 empty_world——seven_dof_arm_world.launch



点击打开链接
这个seven_dof_arm_world.launch文件的作用是使用gazebo_ros这个package启动empty world和加载spawn_model这个node。

3. 设置控制器参数——controller.yaml


点击打开链接
这里要注意一点,和上一篇相同的地方是都用了joint_state_controller/JointStateController。和上一篇不一样的地方是,上一篇每个关节用的是controller type是effort_controllers/JointPositionController,而这里的都是position_controllers/JointPositionController。
这两个究竟有什么不一样的呢?ROS里支持的controller都有哪些呢?

图片:20160516082257140.jpg


梳理一下:
controller_mannager_tests/EffortTestController
controller_mannager_tests/MyDummyController
diff_driver_controller/DiffDriveController
effort_controllers/GripperActionController
effort_controllers/JointEffortController
effort_controllers/JointPositionController
effort_controllers/JointTrajectoryController
effort_controllers/JointVelocityController

force_torque_sensor_controller/ForceTorqueSensorController
imu_sensor_controller/ImuSensorController
joint_state_controller/JointStateController
position_controllers/GripperActionController
position_controllers/JointPositionController
position_controllers/JointTrajectoryController

steered_wheel_base_controller/SteeredWheelBaseController
velocity_controllers/JointVelocityController
上文中用到的是背景为灰色的那两个controller,一个是rrbot的,一个是seven_dof_arm的。

4. 让controller_manager 加载配置并发送tf


点击打开链接
这里没什么好说的,加载配置,然后启动robot_state_publisher并remap topic的名字。
因此,这四步可以看作是个标准步骤,下次写自己的就可以按照这个来。

图片:20160516110711948.jpg


仿真的视频
点击打开链接



二、差分驱动小车


1.遵循上面的原则,我们还是从urdf开始
点击打开链接
它首先包含了另外一个wheel.urdf.xacro,这个文件设定了wheel和transmission这两个macro(可以理解为函数定义,它们在上面链接的那个文件里被调用)。type用的是:transmission_interface/SimpleTransmission,hardwareInterface用的是:EffortJointInterface 。上面的手臂用的type是一样的而hardwareInterface是PositionJointInterface,上篇文章里的rrbot用的都和它一样。
用了两个pluginlibgazebo_ros_laser.solibgazebo_ros_diff_drive.so

2. 模型加载到gazebo仿真环境
~/catkin_ws/src/diff_wheeled_robot_gazebo/launch/diff_wheeled_gazebo.launch这个文件的作用是使用gazebo_ros这个package中的节点:spawn_model以及加载empty world。
~/catkin_ws/src/diff_wheeled_robot_gazebo/launch/diff_wheeled_gazebo_full.launch这个文件多了一个joint_state_publisher和robot_state_publisher用来发布机器人的tf信息。


3. 接收数据与遥控
因为第一步添加了两个plugin,一个用来模拟激光雷达,它发布的topic为/scan。而另一个用来模拟差速移动机器人,它接收的topic为/cmd_vel。因此对应上topic就可以接收激光雷达的数据,并通过cmd_vel控制它了。节点图如下图所示:

图片:20160516224924204.jpg


总结,最后运行的指令和仿真结果图

  1. $ roslaunch diff_wheeled_robot_gazebo diff_wheeled_gazebo_full.launch
  2. $ roslaunch diff_wheeled_robot_control keyboard_teleop.launch
  3. $ rosrun rviz rviz -f odom (tf: base_footprint)

图片:20160516224955767.jpg





图片:20160516225026955.jpg




汇总:
那么到现在为止,接触到的有:
transmission  type:transmission_interface/SimpleTransmission
hardware Interface:EffortJointInterface (rrbot)PositionJointInterface(seven_dof_arm)
plugin:libgazebo_ros_control.so,libgazebo_ros_gpu_laser.so,libgazebo_ros_camera.so

libgazebo_ros_openni_kinect.so
libgazebo_ros_laser.solibgazebo_ros_diff_drive.so
分享:
游客
要评论请先登录 或者 注册
返回顶部