感知层
COIN-D6 激光雷达(设备节点 /dev/lidar,发布 /scan,frame_id laser_link,0.05~12 m,10 Hz,Best Effort QoS)+ HP60C RGB-D 相机(/ascamera_hp60c/... 命名空间,供 EXP-07)。
本体层
麦轮底盘轮速 + BMI088 IMU,经 EKF(robot_localization)融合输出 odom→base_footprint;ω 取 IMU、vx 取轮速(麦轮旋转打滑约 45%,故不取轮速航向)。
地图与定位
SLAM Toolbox 出 /map(occupancy grid:-1 未知 / 0 空闲 / 100 占据,0.05 m 格,存盘后变成 205/254/0 灰度);AMCL 出 /amcl_pose 与粒子云 /particle_cloud。
导航栈
car1_navigation 的 navigation.launch.py 一键起 Nav2;参数集中在 config/nav2_params.yaml(planner/controller/bt/costmap 全在里面),行为树另有 2 个 XML。
TF 主干
map → odom(AMCL 修正)→ base_footprint(EKF 里程计)→ 各传感器 link(URDF 定义)。TF 一断,建图导航全部报错。
调试工具箱
RViz2(看 /scan /map /plan /costmap /particle_cloud)、ros2 topic hz/echo、rqt_image_view、view_frames 查 TF 树、/behavior_tree_log 看行为树分支。
坑 1 · TF 树断链
现象:RViz 全线飘红"No transform"。入口:EXP-01 08 实操——核对 display 三件套与 view_frames 输出,确认 base_footprint 挂根。
坑 2 · 地图重影"双墙"
现象:建图回环后墙变两层。入口:EXP-02——回环没闭合或遥控过快,降速重逛并检查 loop_match_minimum_response_fine(0.45)。
坑 3 · 初始位姿没给
现象:粒子散成一地,小车发疯。入口:EXP-04——RViz「2D Pose Estimate」按真实位姿给初值,或开 set_initial_pose。
坑 4 · 目标点在墙里
现象:action 返回 ABORTED。入口:EXP-03——目标必须落在 map 系空闲区且在膨胀层之外;拖点后 zoom 确认。
坑 5 · 改参不重启
现象:yaml 改了没反应。入口:EXP-05——Nav2 各 server 启动时读参,改完必须重启 navigation.launch。
坑 6 · 途经点贴太近
现象:多点导航跳过中间点。入口:EXP-06——行为树会剔除 0.7 m 内的途经点,相邻点间距请拉开到 >1.0 m,frame_id 统一写 map。
Q1 · RViz 里看不到 /scan?
九成是话题没数据或 QoS 不匹配:先 ros2 topic hz /scan 确认 10 Hz,再在 RViz 里把 LaserScan 的 Reliability 改为 Best Effort。
Q2 · 建图时小车开多快?
逛圈要"慢而不停":转角减速、短暂停留;slam_teleop 默认 0.2 m/s、0.5 rad/s 已经比较稳,别再加速——开太快扫描配准跟不上,墙会画重影。
Q3 · 地图保存到哪里了?
car1_slam 的 map_save 默认写到包的 maps 目录,文件名由参数决定:-p map_name:=map_01。挪动文件后 navigation.launch 的 map:= 参数要跟着改。
Q4 · AMCL 粒子越多越准?
不一定:粒子翻倍算力也翻倍;500~2000 是常用带宽,关键是"收敛后是否假收敛"(EXP-04 互动台可试)。
Q5 · 目标点总是 ABORTED?
依次排查:目标是否在墙里/膨胀层内 → 定位是否已收敛 → 全局代价地图有没有静态层。八成出在第一步。
Q6 · 避障测试总撞箱子?
箱子放得太近(进局部窗口才被发现)或速度过快刹不住:往远放、降 max_vel_x,见 EXP-05 坑表第一行。
Q7 · 多点导航跳过了中间点?
行为树会剔除 0.7 m 内已通过的途经点:把间距拉到 >1.0 m,核对 poses[] 顺序与 frame_id(必须是 map)。
Q8 · 键盘遥控方向是反的?
teleop 的"前后"对齐机器人 +X;若反了检查 URDF 里 base link 的朝向约定,或用 TF 确认车头方向。
Q9 · 改了 yaml 没生效?
Nav2 各 server 启动时读参:Ctrl+C 重启 navigation.launch;只 lifecycle reload 单节点未必覆盖全部参数。
Q10 · TEB 要不要装?
不用:本项目 controller_plugins 固定为 FollowPath→DWB,TEB 属知识扩展;理解差异即可,动手对照见 EXP-05 互动台。
Q11 · EXP-07 没有配套源码怎么考?
原理 + 通用流程型:交付反投影验算、数据链路验证记录、二维/三维选型报告;页面 05 节已写明验收标准。
Q12 · 实验报告写什么?
固定骨架:目标 → 环境 → 步骤(命令截图)→ 数据表 → 参数→现象对照 → 思考题作答。数据务必来自你自己的终端。
Q13 · 地图和真实房间对不上?
九成是没设初始位姿:先 rviz2 的 2D Pose Estimate 拉一次;还不准就遥控走一段直角路径让 AMCL 收敛。
Q14 · 发了 /cmd_vel 车不动?
先分清两条链路:手动遥控走 /cmd_vel(限幅 ±0.3 m/s),Nav2 走 /controller/cmd_vel(不设限幅)。echo 对应话题看有没有速度,再查底盘使能、急停与 remap。
Q15 · 键盘遥控没反应?
slam_teleop 用 termios 读原始按键,必须跑在真终端(IDE 内嵌终端读不到);点一下终端窗口再按,并确认 /cmd_vel 仍在发布。
Q16 · 保存的地图打不开?
map_saver_cli 同时生成 .pgm + .yaml,yaml 里的 image 是相对路径——两个文件必须一起挪,或把 image 改成绝对路径。
顺序就是因果链
严格按 EXP-01 → 07 顺序学:URDF 的 TF 树是建图的坐标基准,建出的 map 是 Nav2 的底图,AMCL 又必须依赖 map——跳着学必然卡住。
先看懂 02 原理再敲 08 实操
每个实验的"原理通俗讲解"用生活比喻讲清机制,动画与互动台把参数手感找到——再去终端跑命令,报错时才知道去哪里排查。
地图质量决定一切
墙厚 < 0.1 m、尺寸误差 < 2%、四角闭合的"好地图"才配得上后面 4 个导航实验;地图歪了,先回 EXP-02 重建,别急着调 Nav2 参数。
单变量调参法
每次只改一个参数并记录对照:膨胀半径、粒子数、DWA 权重都有明确症状。改完 Ctrl+C 重启 navigation 栈再验证,别在运行中盲改一串。