在上一篇文章里,结合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

   <xacro:macro name="transmission_block" params="joint_name">
	  <transmission name="tran1">
	    <type>transmission_interface/SimpleTransmission</type>
	    <joint name="${joint_name}">
	      <hardwareInterface>PositionJointInterface</hardwareInterface>
	    </joint>
	    <actuator name="motor1">
	      <hardwareInterface>PositionJointInterface</hardwareInterface>
	      <mechanicalReduction>1</mechanicalReduction>
	    </actuator>
	  </transmission>
   </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这个文件中

  <!-- Transmissions for ROS Control -->
 
   <xacro:transmission_block joint_name="shoulder_pan_joint"/>
   <xacro:transmission_block joint_name="shoulder_pitch_joint"/>
   <xacro:transmission_block joint_name="elbow_roll_joint"/>
   <xacro:transmission_block joint_name="elbow_pitch_joint"/>
   <xacro:transmission_block joint_name="wrist_roll_joint"/>
   <xacro:transmission_block joint_name="wrist_pitch_joint"/>
   <xacro:transmission_block joint_name="gripper_roll_joint"/>
   <xacro:transmission_block joint_name="finger_joint1"/>
   <xacro:transmission_block joint_name="finger_joint2"/>
 
  <!-- ros_control plugin -->
  <gazebo>
    <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
      <robotNamespace>/seven_dof_arm</robotNamespace>
    </plugin>
  </gazebo>
 
  <!-- Define arm with gripper mounted on a base -->
  <xacro:base name="base"/>
  <xacro:arm parent="base"/>
  <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都有哪些呢?

梳理一下:

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的名字。

因此,这四步可以看作是个标准步骤,下次写自己的就可以按照这个来。

仿真的视频

点击打开链接

二、差分驱动小车

1.遵循上面的原则,我们还是从urdf开始

点击打开链接

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

用了两个pluginlibgazebo_ros_laser.so 和 libgazebo_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控制它了。节点图如下图所示:

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

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

汇总:

那么到现在为止,接触到的有:

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.so  libgazebo_ros_diff_drive.so