前言
- 虽然在我们之前的例子中,看到gazebo和rviz都实现了相同的功能,但仍要知道的是:URDF 是创建机器人模型、Rviz 显示一些具体的传感器信息,Gazebo 用于仿真,可以模拟外界环境以及模拟传感器。
- 本节实现:仍是前文实现的机器人,添加底盘的控制器动起来(对gazebo而言),用rviz查看里程计信息,用gazebo总体查看,控制台发布速度信息。
沿用上一章的gazebo中的机器人
- 延用工作空间test2_ws;
- 功能包demo4_urdf_gazebo存放代码;
- 配置控制器的xacro代码放在demo4_urdf_gazebo/urdf/xacro/gazebo/move.xacro;
- 新的综合xacro文件放在demo4_urdf_gazebo/urdf/urdf/car_movexacro;
- 新的launch文件在demo4_urdf_gazebo/launch/car_move.launch;
- rviz的配置在demo4_urdf_gazebo/config/myrviz.rviz.
- 最后综合launch文件demo4_urdf_gazebo/launch/all.launch.
1、关键控制器xacro文件
在rviz中可以使用arbotix使机器人运动;
在gazebo中要用相关符合ros_control协议的xacro文件挑选控制器来仿真它的运动:
源码
move.xacro:
<robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- joint -->
<xacro:macro name="joint_trans" params="joint_name">
<!-- Transmission is important to link the joints and the controller -->
<transmission name="${joint_name}_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint_name}">
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
</joint>
<actuator name="${joint_name}_motor">
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
<xacro:joint_trans joint_name="left_wheel2base_link" />
<xacro:joint_trans joint_name="right_wheel2base_link" />
<!-- control -->
<gazebo>
<plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
<rosDebugLevel>Debug</rosDebugLevel>
<publishWheelTF>true</publishWheelTF>
<robotNamespace>/</robotNamespace>
<publishTf>1</publishTf>
<publishWheelJointState>true</publishWheelJointState>
<alwaysOn>true</alwaysOn>
<updateRate>100.0</updateRate>
<legacyMode>true</legacyMode>
<leftJoint>left_wheel2base_link</leftJoint>
<rightJoint>right_wheel2base_link</rightJoint>
<wheelSeparation>${base_link_radius * 2}</wheelSeparation>
<wheelDiameter>${wheel_radius * 2}</wheelDiameter>
<broadcastTF>1</broadcastTF>
<wheelTorque>30</wheelTorque>
<wheelAcceleration>1.8</wheelAcceleration>
<commandTopic>cmd_vel</commandTopic>
<odometryFrame>odom</odometryFrame>
<odometryTopic>odom</odometryTopic>
<robotBaseFrame>base_footprint</robotBaseFrame>
</plugin>
</gazebo>
</robot>
关键语句:
<leftJoint>left_wheel2base_link</leftJoint>
<rightJoint>right_wheel2base_link</rightJoint>
和
<xacro:joint_trans joint_name="left_wheel2base_link" />
<xacro:joint_trans joint_name="right_wheel2base_link" />
记得名字一定要是自己的base.xacro文件中的驱动轮和底盘链接的joint名。
这里挑选的是两轮差速驱动控制器的代码进行改装。还有四轮以及其他传感器控制方式仿真另请参考: 链接.
2、重写综合xacro和launch
其实没有很大变化,只是加了move.xacro,launch中只是重新设置了启动的总文件。
xacro
car_move.xacro
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:include filename="inertia.xacro" />
<xacro:include filename="demo1_car_base.xacro" />
<xacro:include filename="demo2_car_cam.xacro" />
<xacro:include filename="demo3_car_laser.xacro" />
<xacro:include filename="gazebo/move.xacro" />
</robot>
launch
car_move.launch
<launch>
<!-- 将 Urdf 文件的内容加载到参数服务器 -->
<param name="robot_description" command="$(find xacro)/xacro $(find demo4_urdf_gazebo)/urdf/xacro/car.xacro" />
<!-- 启动 gazebo -->
<include file="$(find gazebo_ros)/launch/empty_world.launch" >
<arg name="world_name" value="$(find demo4_urdf_gazebo)/world/myworld.world" />
</include>
<!-- 在 gazebo 中显示机器人模型 -->
<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>
关于rviz启动的launch文件
基本就是打开一个rviz,没有任何其他操作,然后添加odom,fixed frame,axes,robot等保存配置到myrviz.rviz再重改launch文件。
rviz.launch
<launch>
<!-- 启动 rviz -->
<node pkg="rviz" type="rviz" name="rviz" />
<!-- 关节以及机器人状态发布节点 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
</launch>
3.启动 展示 待改进
- 运行car_move.xacro综合gazebo文件,此时在话题列表中有cmd_vel速度话题,则证明控制器成功添加;
- 运行rviz的launch文件,做好配置后,机器人像gazebo中显示的;
- 向cmd_vel话题发速度信息,对机器人控制
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'
还可以用键盘控制机器人的运动,运行命令:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
没有该包的话,sudo apd-get安装即可。
可以看到gazebo中和rviz中都成功显示。如图:
改进:1-2-3可以写到一个launch文件中
这里只将1-2写入all.launch文件中,3可以写一个节点发布话题,然后launch文件中运行该节点,这里略。
all.launch内容:
<launch>
<include file="$(find demo4_urdf_gazebo)/launch/car_move.launch" />
<include file="$(find demo4_urdf_gazebo)/launch/rviz.launch" />
</launch>