gazebo仿真尝试

ROS 2接口与配置迁移指南 (从仿真到实车)

本文档旨在作为将 gazebo_robot_sim_py 仿真项目移植到真实硬件平台的操作手册。核心思想是:用真实的传感器驱动替换Gazebo插件,并调整配置文件以匹配真实机器人的物理特性。

第一部分:SLAM (Cartographer) 接口与配置

slam_launch.py 启动的SLAM流程中,您的实车需要替换Gazebo提供的传感器数据,并可能需要调整Cartographer的配置。

1. 必需的输入话题 (Your Vehicle MUST Provide These)

接口 (话题) 消息类型 发布者 (仿真中) 订阅者 (仿真中) 实车操作指南
/scan sensor_msgs/LaserScan Gazebo激光雷达插件 cartographer_node 【核心任务】 您的激光雷达驱动程序必须发布此话题。确保消息的 frame_id 与您机器人TF树中的激光雷达坐标系名称一致(例如 laser_link)。
/odom nav_msgs/Odometry Gazebo差分驱动插件 cartographer_node 【核心任务】 您的底层运动控制器或轮式里程计驱动程序必须发布此话题。这提供了机器人的速度和位姿初步估计。frame_id 应为 odomchild_frame_id 应为 base_link
/tf tf2_msgs/TFMessage Gazebo差分驱动插件,robot_state_publisher, static_transform_publisher cartographer_node 【核心任务】 您的机器人TF树必须完整且正确。具体包括: 1. odom -> base_link:通常由里程计发布者提供。 2. base_link -> laser_link:这是激光雷达相对于机器人中心的物理安装位置。

2. 关键的输出话题 (Cartographer Provides These for You)

接口 (话题) 消息类型 发布者 (仿真中) 订阅者 (仿真中) 实车调试要点
/map nav_msgs/OccupancyGrid cartographer_occupancy_grid_node rviz2 这是最终生成的2D栅格地图。您可以在RViz中订阅此话题来查看建图效果。
/tf tf2_msgs/TFMessage cartographer_node rviz2 Cartographer会发布**map -> odom** 的TF变换。这是SLAM的核心输出,它修正了里程计的累积误差,将机器人定位在全局地图中。

3. 需要重点关注的配置文件

  • urdf/robot.urdf:

    • 物理尺寸: 修改 base_link, left_wheel, right_wheel 等连杆的 <visual><collision> 标签中的尺寸,以匹配您的真实机器人。
    • 惯性参数: 粗略估计或测量各部件的 <inertial> 参数(质量和惯性张量)。
    • 移除Gazebo插件: 【关键】 删除或注释掉所有 <gazebo> 标签。这包括差分驱动插件和激光雷达传感器插件。
  • config/cartographer_config.lua:

    • tracking_frame: 确保这是您机器人URDF中的基座坐标系名称,通常是 base_link
    • odom_frame: 确保这是您的里程计发布的坐标系名称,通常是 odom
    • num_laser_scans: 如果您有多个激光雷达,需要修改此值。
    • 性能调优: min_range, max_range, voxel_filter_size 等参数可能需要根据您的激光雷达型号和环境进行调优。
  • launch/slam_launch.py:

    • static_tf_base_to_laser: 【关键】 修改此 Nodearguments,以反映激光雷达在您真实车辆上的精确安装位置。
    • 移除Gazebo: 您可以删除 gazebospawn_entity 节点。
    • teleop_twist_keyboard: 您可以使用任何方式发布 /cmd_vel 指令来控制机器人。

第二部分:Navigation (Nav2) 接口与配置

navigation_launch.py 启动的导航流程中,除了SLAM部分已提到的接口外,还需要关注Nav2自身的配置。

1. 必需的输入接口 (Your System MUST Provide These)

除了SLAM部分的 /scan, /odom, /tf 之外,Nav2还需要:

接口 (话题/服务/动作) 类型 发布者/客户端 (仿真中) 订阅者/服务器 (仿真中) 实车操作指南
/initialpose PoseWithCovarianceStamped initial_pose_publisher 或 RViz amcl 【关键】 在开始导航前,必须为AMCL提供一个初始位姿估计。
/goal_pose PoseStamped RViz或您自己的应用 nav2_bt_navigator 【关键】 这是导航的目标点。
/cmd_vel Twist (Nav2提供) nav2_controller 您的机器人底层驱动 【核心任务】 您需要编写一个底层驱动节点,该节点订阅 /cmd_vel 话题,并将收到的速度指令转换为对您机器人电机/舵机的实际控制信号。

2. 关键的输出接口 (Nav2 Provides These for You)

接口 (话题/服务/动作) 类型 发布者/服务器 实车调试要点
/plan Path nav2_planner 显示全局规划路径。
/local_plan Path nav2_controller (DWB) 显示本地规划路径。
/amcl_pose PoseWithCovarianceStamped amcl AMCL发布的机器人当前位姿和不确定性。
/global_costmap/costmap OccupancyGrid nav2_costmap_2d 全局代价地图。
/local_costmap/costmap OccupancyGrid nav2_costmap_2d 本地代价地图。

3. 需要重点关注的配置文件

  • urdf/robot.urdf:

    • 同SLAM部分,但这里的重点是确保物理尺寸和碰撞模型准确,因为Nav2严重依赖这些信息来避免碰撞。
  • config/nav2_params.yaml:

    • amcl: 确保 base_frame_id, odom_frame_id, global_frame_id 与您的TF树一致。
    • controller_server (DWB):
      • max_vel_x, max_vel_theta, acc_lim_x, acc_lim_theta: 【关键】 这些参数必须根据您真实机器人的最大速度和加速度能力进行修改。
    • local_costmap & global_costmap:
      • robot_radiusfootprint: 【关键】 如果您的机器人是圆形的,请设置准确的 robot_radius。如果不是,请使用 footprint 参数定义其精确的多边形轮廓。
      • inflation_radius: 膨胀半径,需要根据机器人尺寸和期望的行驶行为进行调整。
      • scan (in observation_sources): 确保话题名称、传感器量程等与您的真实激光雷达匹配。
    • planner_server (NavFn):
      • tolerance: 到达目标的容忍距离,可以根据精度要求调整。
  • launch/navigation_launch.py:

    • 移除Gazebo: 同SLAM部分,移除 gazebospawn_entity 节点。
    • map argument: 确保您在启动时传入的地图文件是您通过SLAM构建并保存的真实环境地图。
    • initial_pose_publisher: 修改此节点的参数以匹配您希望机器人在地图上的默认启动位置。

迁移工作流总结

  1. 硬件驱动: 编写或配置您的激光雷达驱动和电机控制器,使其分别发布 /scan 话题和订阅 /cmd_vel 话题,并发布 /odomodom->base_link 的TF。
  2. URDF修改: 更新 robot.urdf 以反映真实机器人的尺寸、碰撞模型和关节。移除所有Gazebo插件
  3. TF树验证: 测量并更新launch文件中的 static_tf_base_to_laser。运行 tf2_echo 来验证树是否正确连接。
  4. SLAM测试: 运行修改后的 slam_launch.py。遥控机器人在环境中移动,观察RViz中的建图效果。根据效果调整配置。建图完成后使用 map_saver_cli 保存地图。
  5. 导航配置: 将保存的地图文件放入 maps 文件夹。仔细修改 nav2_params.yaml 中的机器人物理参数(速度、加速度、尺寸)。
  6. 导航测试: 运行修改后的 navigation_launch.py。在RViz中设置初始位姿,观察AMCL粒子是否收敛。在RViz中设置导航目标,观察机器人是否能够安全、平稳地到达。根据导航行为反复调试参数。