从零基于Gazebo实现仿真车辆模型构建
1. 创建URDF模型
编写基础底盘URDF
创建文件 ~/catkin_ws/src/my_robot/urdf/diff_robot.urdf.xacro:
<?xml version="1.0"?>
<robot name="diff_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"><!-- 底盘 --><link name="base_link"><visual><geometry><box size="0.4 0.2 0.1"/> <!-- 长宽高 --></geometry><material name="blue"><color rgba="0 0 1 1"/></material></visual><collision><geometry><box size="0.4 0.2 0.1"/></geometry></collision><inertial><mass value="2.0"/><inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.02"/></inertial></link><!-- 左轮 --><link name="left_wheel"><visual><geometry><cylinder length="0.05" radius="0.05"/> <!-- 厚度与半径 --></geometry></visual></link><!-- 右轮(复制左轮并调整位置) --><joint name="left_wheel_joint" type="continuous"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.15 0" rpy="1.5707 0 0"/> <!-- Y轴偏移,90度旋转 --><axis xyz="0 1 0"/> <!-- 绕Y轴旋转 --></joint><!-- 右轮定义类似,偏移改为 xyz="0 -0.15 0" -->
</robot>
关键点:
差速轮需设置 type=“continuous” 关节10
惯性参数()必须定义,否则Gazebo物理引擎报错
添加差速控制器插件
在URDF末尾插入Gazebo插件:
<gazebo><plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so"><rosDebugLevel>Debug</rosDebugLevel><commandTopic>cmd_vel</commandTopic> <!-- 控制指令订阅 --><odometryTopic>odom</odometryTopic> <!-- 里程计发布 --><odometryFrame>odom</odometryFrame><robotBaseFrame>base_link</robotBaseFrame><wheelSeparation>0.3</wheelSeparation> <!-- 轮间距(同Y轴偏移量0.15*2) --><wheelDiameter>0.1</wheelDiameter> <!-- 轮直径(半径0.05*2) --></plugin>
</gazebo>
此插件实现ROS的cmd_vel话题控制4。
2. 生成模型并加载到Gazebo
# 创建功能包与编译
cd ~/catkin_ws/src
catkin_create_pkg my_robot roscpp gazebo_ros
mkdir my_robot/launch my_robot/urdf
# 将URDF文件放入urdf目录
cd ~/catkin_ws
catkin_make
编写启动文件
创建 my_robot/launch/start.launch:
<launch><!-- 加载URDF到参数服务器 --><param name="robot_description" command="$(find xacro)/xacro '$(find my_robot)/urdf/diff_robot.urdf.xacro'" /><!-- 启动Gazebo空世界 --><include file="$(find gazebo_ros)/launch/empty_world.launch"/><!-- 在Gazebo中生成机器人 --><node name="spawn_model" pkg="gazebo_ros" type="spawn_model"args="-urdf -model diff_robot -param robot_description -z 0.1" /><!-- 启动机器人状态发布 --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
</launch>
注意:Noetic中必须使用 type=“robot_state_publisher”(而非旧版state_publisher)10。
启动仿真
roslaunch my_robot start.launch
3. 控制机器人移动
# 发布速度指令测试(线速度0.2m/s,角速度0.5rad/s)
rostopic pub /cmd_vel geometry_msgs/Twist "linear:x: 0.2y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 0.5" -r 10# 或使用键盘控制
sudo apt install ros-noetic-teleop-twist-keyboard
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
成功现象:机器人绕圈运动(差速转向)。