ROS2 Humble中Ackermann Gazebo插件转向盘关节配置疑问
问题描述
我正在制作一款四轮阿克曼小车的URDF模型,打算使用ackermann gazebo插件,在GitHub上找到如下使用示例代码:
<gazebo> <plugin name="gazebo_ros_ackermann_drive" filename="libgazebo_ros_ackermann_drive.so"> <ros> <namespace>ackermann</namespace> <remapping>cmd_vel:=cmd_vel</remapping> <remapping>odom:=odom</remapping> <remapping>distance:=distance</remapping> </ros> <update_rate>100.0</update_rate> <!-- wheels --> <front_left_joint>front_left_joint</front_left_joint> <front_right_joint>front_eight_joint</front_right_joint> <rear_left_joint>rear_left_joint</rear_left_joint> <rear_right_joint>rear_right_joint</rear_right_joint> <left_steering_joint>left_steering_joint</left_steering_joint> <right_steering_joint>right_steering_joint</right_steering_joint> <steering_wheel_joint>steering_joint</steering_wheel_joint> <!-- Max absolute steer angle for tyre in radians--> <!-- Any cmd_vel angular z greater than this would be capped --> <max_steer>0.6458</max_steer> <!-- Max absolute steering angle of steering wheel --> <max_steering_angle>7.85</max_steering_angle> <!-- Max absolute linear speed in m/s --> <max_speed>20</max_speed> <!-- PID tuning --> <left_steering_pid_gain>1500 0 1</left_steering_pid_gain> <left_steering_i_range>0 0</left_steering_i_range> <right_steering_pid_gain>1500 0 1</right_steering_pid_gain> <right_steering_i_range>0 0</right_steering_i_range> <linear_velocity_pid_gain>1000 0 1</linear_velocity_pid_gain> <linear_velocity_i_range>0 0</linear_velocity_i_range> <!-- output --> <publish_odom>true</publish_odom> <publish_odom_tf>true</publish_odom_tf> <publish_wheel_tf>true</publish_wheel_tf> <publish_distance>true</publish_distance> <odometry_frame>odom</odometry_frame> <robot_base_frame>base_footprint</robot_base_frame> </plugin> </gazebo>
我的问题集中在关节配置:我创建了4个连续关节用于车轮滚动,2个旋转关节实现前轮绕Z轴转向,对应插件配置中的前六个关节。请问:
steering_wheel_joint具体是什么?- 应安装在何处?
- 如何与车体其他部件连接?
另外,移除该关节后没有报错,但Gazebo中所有车轮会移至车底中心;仅在Rviz中显示URDF模型时,模型显示正常。我的URDF结构包含base_link(车身)、4个车轮及base_footprint。
截图情况:
- 仅启动Rviz时:模型显示正常,车轮处于车身下方对应位置
- 启动Gazebo及插件时:所有车轮聚集到车底中心位置
解决方案
关于steering_wheel_joint的说明
- 是什么:这是一个可选的辅助关节,用来模拟真实车辆的方向盘联动。插件会根据前轮的转向角度,按比例驱动这个关节转动,实现方向盘的可视化效果,不影响阿克曼转向的核心逻辑。
- 安装位置:一般设置在车身的驾驶舱区域,比如
base_link的上方或前部,对应真实车辆方向盘的实际位置。 - 连接方式:需要先在URDF中创建
steering_wheel连杆(即方向盘的3D模型),然后用一个旋转关节(类型为revolute)将其连接到base_link,关节轴设置为Z轴(与前轮转向关节的轴保持一致),这个关节就是插件配置里的steering_wheel_joint。
解决车轮移位问题
移除steering_wheel_joint后Gazebo中车轮移位,核心原因是插件配置里还保留了<steering_wheel_joint>steering_joint</steering_wheel_joint>这一行,但你的URDF中不存在该关节,导致插件初始化时出现约束异常,进而破坏了车轮的关节约束关系。
具体修复步骤:
- 若不需要方向盘可视化,直接删除插件配置中的
<steering_wheel_joint>steering_joint</steering_wheel_joint>整行,而不是只删除URDF里的关节定义。 - 检查插件中的
<front_right_joint>配置——示例代码里写的是front_eight_joint,这明显是笔误,需修改为你URDF中实际的右前轮滚动关节名称(比如front_right_joint),拼写错误也会引发关节约束异常。 - 确保插件中所有配置的关节名称,和URDF里的关节名称完全一致,包括大小写、拼写都不能出错。
内容的提问来源于stack exchange,提问作者Gaetano Pispisa
相关产品推荐
相关产品推荐

