You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gazebo麦克纳姆轮机器人Odometry订阅无消息,无法定位停驻

麦克纳姆轮Gazebo仿真Odometry无消息排查方案

核心问题是Odometry话题无输出,导致定位失效,无法触发目标点停止逻辑。从控制器配置、URDF关节设置、仿真链路三个核心环节逐一排查:

1. 先查controller.yaml的里程计配置

必须确保麦克纳姆轮专用控制器启用了里程计发布:

# 适配麦克纳姆轮的控制器配置示例
mecanum_drive_controller:
  type: "mecanum_drive_controller/MecanumDriveController"
  publish_rate: 50.0  # 发布频率不能为0
  # 四车轮关节名称必须和URDF中完全一致
  left_front_wheel: front_left_wheel_joint
  right_front_wheel: front_right_wheel_joint
  left_rear_wheel: rear_left_wheel_joint
  right_rear_wheel: rear_right_wheel_joint
  wheel_separation_width: 0.4  # 替换为你的机器人轮距
  wheel_separation_length: 0.6  # 替换为你的机器人轴距
  wheel_radius: 0.1  # 替换为你的车轮半径
  odometry:
    frame_id: odom
    child_frame_id: base_link
    publish_tf: true
    publish_odometry: true  # 这个参数必须设为true,否则不会发odom消息

用rostopic list确认是否存在配置的Odometry话题(默认是/odom),如果话题不存在,直接说明控制器没正确加载。

2. 验证URDF的关节与Gazebo插件

关节配置要求

每个麦克纳姆轮的关节必须是continuous类型,且轴方向正确:

<joint name="front_left_wheel_joint" type="continuous">
  <parent link="base_link"/>
  <child link="front_left_wheel"/>
  <axis xyz="0 0 1"/>  # 车轮绕Z轴旋转,必须正确
  <limit effort="100" velocity="100"/>
  <origin xyz="0.3 0.2 0" rpy="0 0 0"/>  # 替换为你的车轮实际位置
</joint>

必须加载Gazebo-ROS控制插件

URDF中必须包含libgazebo_ros_control.so,否则ROS控制器无法和Gazebo通信:

<gazebo>
  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
    <robotNamespace>/</robotNamespace>
  </plugin>
</gazebo>

3. 检查控制器运行状态

用rosservice call /controller_manager/list_controllers查看控制器状态,必须确保mecanum_drive_controller处于running状态:

# 正常输出示例
mecanum_drive_controller:
  state: running
  type: mecanum_drive_controller/MecanumDriveController

如果是stopped,检查launch文件里有没有启动控制器管理器并加载控制器:

<node name="controller_spawner" pkg="controller_manager" type="spawner" args="mecanum_drive_controller"/>

4. 确认Python订阅器的话题匹配

代码里订阅的话题必须和控制器发布的完全一致(包括命名空间):

# 错误:如果控制器在命名空间下,漏加前缀会收不到消息
rospy.Subscriber('odom', Odometry, odom_callback)
# 正确:如果是全局话题,加/前缀;如果有命名空间,比如'/robot/odom'
rospy.Subscriber('/odom', Odometry, odom_callback)

先手动用rostopic echo /odom测试,如果echo也没输出,问题肯定在发布端(控制器/Gazebo),不用纠结订阅代码。

关键代码示例

Odometry回调与停止逻辑

current_x = 0.0
current_y = 0.0
target_x = 2.0
target_y = 1.0

def odom_callback(msg):
    global current_x, current_y
    current_x = msg.pose.pose.position.x
    current_y = msg.pose.pose.position.y
    # 到达目标点阈值内就停止
    if abs(current_x - target_x) < 0.05 and abs(current_y - target_y) < 0.05:
        # 发布零速度指令
        vel_msg = Twist()
        vel_msg.linear.x = 0.0
        vel_msg.linear.y = 0.0
        vel_msg.angular.z = 0.0
        pub.publish(vel_msg)

# 初始化订阅
rospy.Subscriber('/odom', Odometry, odom_callback)

内容的提问来源于stack exchange,提问作者zhg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:27:21