在上一篇文章里,结合Gazebo官方的RRBot(2自由度机械臂)的相关配置文件,介绍了一些关于ros_control的基本知识。这里结合《Mastering ROS for Robotics Programming》这本书里的7自由度机械臂和一个两轮差速运动的小车再来探究一番。
首先根据上篇博客和书中的内容我们来总览一下,随后的操作都是基于这个来设置的。因为要仿真所以需要机器人模型,所以先得有urdf或者urdf.xacro文件。
- 接着,要想模型在Gazebo里运动起来,又需要在xacro里设置一些运动关节的 transmission;
- 其次,为了让它在gazebo里显示出来,需要借助于gazebo_ros这个package的node:spawn_model来加载一个empty_world;
- 随后,关节的pid设置是需要一个配置文件的robot_control.yaml;
- 最后则是利用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 plugin:libgazebo_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用的都和它一样。
用了两个plugin:libgazebo_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
来源:CSDN
作者:yaked
链接:https://blog.csdn.net/yaked/article/details/51417742