ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ABOT-M1-ATK智能车ROS建图导航与外设联调全流程

ABOT-M1-ATK智能车ROS建图导航与外设联调全流程

简介:《智能车ABOT-M1-ATK配置介绍》面向准备参加中国机器人及人工智能大赛、全球校园精英人工智能算法大赛巡航赛项的高校学生、竞赛队伍与指导教师,围绕ROS智能车的激光雷达环境感知、机器人导航、无人驾驶和视觉识别等配置展开,帮助读者建立从硬件认知到赛项功能联调的整体框架。压缩包仅含1个PDF文件,约2.3MB,以快速上手指南为主线,串联远程桌面测试、激光雷达建图、导航目标点设置、射击模块、视觉与语音功能验证,并补充安全注意事项、功能包工作空间说明和常见模块入口,便于按目录核验设备状态与软件环境。已有576人学习,适合初次接触ABOT-M1-ATK的团队完成设备上手、赛前联调和功能排查,也可作为培训交接与备赛流程参考,减少误操作并提升模块定位效率。

1. 开箱与上电:ABOT-M1-ATK 从箱子里抬出来到第一次亮屏

第一次给 ABOT-M1-ATK 上电的人,十个里有八个会先犯同一个错误:双手托在激光雷达上把车端起来。这台面向机器人及人工智能类竞赛的智能车,ROS、激光雷达、相机、语音模块和底盘驱动出厂就预置在车里的主控上,真正需要“装”的东西不多,需要“配”的环节却一环扣一环——显示链路、无线网络、远程桌面、地图保存路径、导航初始位姿,任何一处错位,后面的建图和导航都会以玄学的方式失败。这篇笔记按我实际复现的顺序走一遍:从开箱上电、远程桌面接入,到 Gmapping、Hector、Cartographer 三套 SLAM 的启动与存图,再到导航目标点下发和视觉、语音、射击模块逐个点亮,最后给出五条踩过坑的记录和一套装完自检清单。新手照着能跑通,熟手重点看版本差异和参数取舍那几段。

2. 开机与远程桌面:HDMI 显示链路、向日葵接入和四个工作空间

2.1 上电顺序:HDMI、显示器供电、主机开关的先后

车端主控和外接的 10 寸液晶屏是两路供电,图省事先把主机开起来再插 HDMI 的人不少,屏幕要么不出图,要么分辨率掉到很低,RViz 的工具栏按钮挤成一团根本点不准。这台车给的顺序是定死的四步:先把车体外部引出的 HDMI 线接到 10 寸显示器上,再给显示器供电,然后按下车体电源开关等 5 秒,最后按主控制器开关等系统起完。那 5 秒不是摆设,底盘控制板要先完成自检再给主控上电,跳过这一步偶尔会碰到主控起来了但底盘驱动没枚举到的情况。

上电完成之后别急着开软件,先在车端终端确认几件事:

# 主控启动完成后,在车端终端确认三件事:架构、ROS 发行版、图形会话 uname -m # 期望 aarch64 或 x86_64,确认登的是车端不是开发机 ls /opt/ros/ # 目录名就是这台车预装的 ROS 发行版 echo $ROS_DISTRO # 当前 shell 已 source 的版本,为空说明环境变量没加载

/opt/ros/下的目录名就是预装版本,不同批次的机器可能不是一个版本,后面所有 launch 命令都得在这个版本下跑。echo $ROS_DISTRO输出为空时,补一句source /opt/ros/<版本>/setup.bash,再 source 对应工作空间的devel/setup.bash,否则roslaunch会直接报找不到包。图形会话这边用echo $DISPLAY看一眼,正常是:0之类的值,为空说明桌面没起来,远程桌面也连不上画面。

电池这块踩过一次:电量显示一格的时候车还能跑十几分钟,但一进建图,激光雷达和主控同时拉电流,电压掉到保护点直接关机,地图没存,白跑一趟。充电器是 DC12.6V / 2.0A,背部指示灯红灯是充电中,绿灯是充满,看到一格电就插上,不要赌。机器半个月以上不用,也要按这个规格补一次电再做存放,锂电池长时间亏电放着的后果比多充几次严重得多。

提示:抬车时双手放在前后轮胎之间的底盘位置,不要抓激光雷达,也不要在雷达上方压放任何东西。机身不进液体,学习操作时手和尖锐物都别碰相机模块。

2.2 无线网络与向日葵远程助手:把车端画面接回开发机

车端要先联网,手机热点是最省事的做法。命令行里配无线比在图形界面点来点去更容易复现:

# 车端:扫描、连接、确认地址,三步确认网络通了 nmcli device wifi list | head -n 10 # 列出可见热点 nmcli device wifi connect "<热点名>" password "<密码>" ip addr show wlan0 # 看 inet 那行有没有分到地址 ping -c 4 <网关IP> # 换成自己热点的网关地址

nmcli device wifi connect第一次连会写进系统连接配置,下次开机自动重连,换热点时记得先nmcli connection delete掉旧的,不然两个配置抢同一张网卡,表现是连着连着掉线。ping -c 4只发四个包,用来确认路由和 DNS 没问题,能通就说明车端已经能出网,远程桌面才有意义。

远程桌面用的是向日葵远程助手,电脑端先下载安装,车端自带。车端打开后点左下角图标会弹出面板,里面能看到本机的识别码和验证码,每台设备的识别码都不一样,以机器上显示的为准。电脑端同样联网,输入识别码和验证码点远程连接,画面就过来了。

远程桌面只适合“看画面”,真正敲命令建议走 SSH,跟手程度差一个量级:

# 开发机侧直接 SSH 进车端,命令回显比远程桌面里点终端快得多 ssh <车端用户名>@<车端IP>

远程桌面走的是画面编码,带宽一紧张,键盘遥控就有明显延迟,建图时车已经撞墙了画面才更新。我的习惯是远程桌面开着看 RViz 和地图,命令操作全走 SSH 终端,两边分工。

2.3 四个工作空间:abot_vision、abot_voice、lidar_ws、robot_ws

车端桌面点“文件”打开系统文件夹,能看到四个跟机器人功能直接相关的工作空间。先把它们各自管什么弄清楚,后面看到roslaunch命令才不会乱猜。

工作空间管什么常见入口包
robot_ws底盘、IMU、外设驱动,以及自主巡航这类综合 demoabot_bringup
lidar_ws激光雷达、建图与导航abot_slam、robot_slam
abot_vision相机与视觉识别usb_cam
abot_voice语音播报与语音识别robot_voice

每个工作空间的src下面放着若干功能包,roslaunch后面跟的第一个参数就是包名。上电后先跑一遍体检,确认四个空间都编译过:

# 逐个工作空间确认 src 下的包,以及 devel 是否已生成 for ws in robot_ws lidar_ws abot_vision abot_voice; do echo "== $ws ==" ls ~/$ws/src 2>/dev/null ls ~/$ws/devel/setup.bash 2>/dev/null && echo "已编译" || echo "缺 devel,需要 catkin_make" done # 再从 ROS 的角度确认这些包能被找到 rospack list | grep -E "abot_|robot_"

devel/setup.bash存在基本等于这个空间编译过,缺失时进目录跑一次catkin_make。改 launch 文件不需要重编译,改 C++ 源码才需要,这条区分清楚能省不少时间。rospack list里看不到某个包,八成是没 source 对应的devel/setup.bash,而不是包真的丢了。四个空间的 source 顺序有讲究,robot_ws放最后 source,它的底盘驱动是其它包的上游依赖。

注意:不要私自拆解车体。拆过之后出现的任何问题都不在原厂支持范围内,这个后悔药买不到。

3. 激光雷达建图:Gmapping、Hector、Cartographer 三套 launch 的启动与存图

3.1 一键脚本 1-gmapping.sh 里到底起了哪些节点

车端桌面右键打开终端,输入./1-gmapping.sh回车,脚本会拉起一串终端窗口,建图流程就起来了。但直接跑脚本等于把黑匣子吞下去,出问题不知道从哪查。我一般先花两分钟把脚本读一遍:

# 先定位脚本,再看清它到底 launch 了哪些节点 cd ~ find . -maxdepth 3 -name "1-gmapping.sh" 2>/dev/null cat ./1-gmapping.sh

find加-maxdepth 3是防止全盘扫太慢,脚本一般在用户目录或桌面。cat出来的内容里能看到它按顺序启动的 launch 文件,展开后基本对应用户手册第九节给的手动链路:

# 手动等价链路,三个终端按顺序起,前一条确认没报错再开下一条 roslaunch abot_bringup robot_with_imu.launch # 底盘 + 里程计 + IMU,提供 odom 和 tf roslaunch robot_slam gmapping.launch # Gmapping 建图算法本体 roslaunch robot_slam view_mapping.launch # RViz,看地图和雷达点云

第一条robot_with_imu.launch是地基,它把底盘驱动、轮式里程计和 IMU 一起拉起来,发布/odom和整套tf变换,没有它后面两条全是空中楼阁。第二条gmapping.launch订阅/scan和/odom,输出/map。第三条view_mapping.launch只是把 RViz 用预设的配置文件打开,省得手动加 Map、LaserScan 显示项。三条命令分别在三个终端里跑,终端窗口别关,关掉对应的节点就退了。

启动前把车放到地面,并且记下它此刻的位置和朝向。Gmapping 建立的地图坐标系原点就是启动瞬间车的位置,后面导航要放回同一个点,这个初始位置记不牢,导航那一章会吃大亏。我习惯用胶带在地面贴个十字,车头方向也标一道。

3.2 键盘遥控的按键映射与速度参数

脚本会开好几个终端,遥控要切到第五个终端窗口里操作。这台车给的按键映射是:UIO控制向前、左前、右前,JL控制左右转,M<>控制后退和左后、右后。开了英文大写之后,UO变成左前右前平移,JL变成左右平移,<>变成左后右后平移。全向底盘的价值就在这里,窄场地里平移比原地转向好用得多。

如果不用脚本自带的遥控,标准做法是单独起teleop_twist_keyboard,并且把速度降下来:

# 独立起键盘遥控,同时把线速度和角速度压低到适合建图的范围 rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.2 _turn:=0.6

speed是线速度,单位米每秒,默认值对建图来说偏快,降到 0.2 左右雷达帧之间车位移小,点云拼出来的墙才直;turn是角速度,单位弧度每秒,0.6 大概是一秒转三十多度,转向时能看清地图变化。这两个参数用下划线加冒号的写法覆盖,不用改源码。建图过程中速度越快、转得越急,地图糊得越厉害,这不是算法不行,是雷达一帧扫完车已经动了,运动畸变补不回来。

遥控发出去的速度话题是/cmd_vel,底盘订阅它执行。如果按键有回显但车不动,先看底盘驱动终端有没有报串口错误,再看rostopic hz /cmd_vel有没有数据,方向别搞反。

3.3 保存地图:save_map.launch 与路径确认

地图建到自己满意之后,不要关建图终端,另开一个终端执行保存:

# 建图节点保持运行,另开终端保存当前地图 roslaunch abot_slam save_map.launch

这条命令直接读运行中的/map话题并落盘,建图节点一关,/map就没了,存出来是空的。保存完先确认文件真的生成了,地图一般是.pgm加.yaml成对出现:

# 确认地图文件成对生成,并看一眼元数据 find ~ -name "*.yaml" -path "*map*" -mmin -10 2>/dev/null cat <上一步找到的>.yaml

-mmin -10只找十分钟内改过的文件,避免翻出一堆旧地图。.yaml里三个字段要会看:resolution是每个像素代表多少米,常见是 0.05,改了它地图比例就全错;origin是地图左下角在世界坐标系里的位姿,导航时车放的位置对不上,多半是这个原点跟当前初始位姿差了;image指向同名的.pgm文件,两个文件必须待在同一个目录,挪动时一起挪。

地图文件建议立刻按日期备份一份,换场地之后旧地图就找不回来了,这个习惯在第六节还会再提一次。

3.4 Gmapping、Hector、Cartographer 的切换与取舍

三套 SLAM 都能出图,但依赖和适用场景不一样,车端脚本里都给了入口。Hector 和 Cartographer 的启动命令是这样的:

# Hector:不依赖里程计,纯靠激光匹配,适合场地小、结构特征多的场景 roslaunch abot_slam hector_mapping.launch roslaunch abot_slam view_mapping.launch # Cartographer:带 IMU 融合和回环,适合大场地和长走廊 roslaunch abot_bringup robot_with_imu.launch roslaunch abot_slam cartographer.launch

Hector 的好处是省事,不用里程计,车推着走就能建图,缺点是它假设车走得慢,速度一快直接跟丢,地图会突然错位一大块。Cartographer 用 IMU 做姿态融合,回环检测能把绕一圈的误差拉回来,代价是吃 CPU,主控负载高的时候建图会卡顿。Gmapping 居中,依赖轮式里程计,小场地表现最省心,跑久了累计误差明显。

算法依赖适用场地启动命令
Gmapping里程计 + 激光中小场地,日常首选robot_slam gmapping.launch
Hector仅激光小场地、特征多、推车慢走abot_slam hector_mapping.launch
CartographerIMU + 激光大场地、长走廊、需要回环abot_slam cartographer.launch

选哪个不用纠结太久,先跑 Gmapping,出图糊了换 Hector 验证是不是里程计漂,场地大就上 Cartographer。三套算法启动时都要先起底盘驱动,除了 Hector 可以省掉robot_with_imu.launch这一步之外,其余都一样。

4. 导航与外设联调:2D Nav Goal 下发、usb_cam 出图、语音播报和射击触发

4.1 导航启动链:从 2-navigation.sh 到三条 launch

导航的一键入口是车端终端里的./2-navigation.sh,它内部拉起的还是那三条命令,手动跑一遍更容易定位问题:

# 导航三段式,顺序不能乱 roslaunch abot_bringup robot_with_imu.launch # 底盘、里程计、IMU,提供 tf roslaunch robot_slam navigation.launch # 加载地图 + AMCL 定位 + move_base 规划 roslaunch robot_slam view_nav.launch # RViz,带导航专用显示配置

第一条和建图时完全一样,底盘和传感器先就位。第二条是导航的核心,它内部会加载上一节保存的.yaml地图、启动 AMCL 做粒子滤波定位、拉起move_base做全局和局部路径规划,代价地图也在这一步生成。第三条只是给 RViz 套一个预设配置,把地图、代价地图、激光、规划路径这些显示项配好。

启动之前有一个动作必须做:把车放回建图时的初始位置,朝向也要一致。导航依赖 AMCL 在已知地图里定位,初始位姿给错,粒子撒得到处都是,收敛不回来就表现为规划出一条匪夷所思的路径或者干脆不动。地面贴的那道胶带这时候就值钱了。

4.2 2D Nav Goal 下发与初始位姿校正

RViz 顶部工具栏有个2D Nav Goal按钮,点一下,然后在地图的空白区域按住鼠标往目标朝向拖一条箭头,松手就开始规划。目标点要落在地图的已知空闲区域里,点在墙上或者地图边界外,move_base会直接判定目标不可达。

如果车在地图上的位置明显偏了——比如 RViz 里车模型没落在实际所站的位置——先用2D Pose Estimate校一次:点按钮,在实际位置按住鼠标拖出朝向。这一步做完等几秒让粒子收敛,再下发导航目标。导航过程中车走一半停住、原地打转、或者撞着墙蹭,九成是定位问题而不是规划问题,先校位姿再看规划。

目标点下发后观察三条东西:RViz 里的全局路径是不是一条从车到目标的连续线,局部代价地图有没有把障碍物膨胀出来,/cmd_vel上有没有速度输出。三条里缺哪条,问题就锁定在哪个环节。

4.3 导航不动时先看哪几个话题

不猜,直接查:

# 导航链路的四个关键话题,逐一确认有没有数据 rostopic list | grep -E "map|scan|cmd_vel|amcl" rostopic hz /scan # 雷达是否在出数,正常十几赫兹 rostopic echo /amcl_pose # 定位协方差,数值越大越不确定 rostopic info /cmd_vel # 谁在发速度,谁在收速度

/scan停了说明雷达节点挂了或者网口松了,导航必然失败。/amcl_pose里的协方差矩阵对角线数值很大,说明定位没收敛,回到上一步用2D Pose Estimate重来。/cmd_vel上没人发说明move_base压根没规划出路径,去看它的终端输出里有没有“目标点在障碍物内”这类提示。这套排查顺序比在 RViz 里瞎点快得多。

4.4 视觉:usb_cam 出图与 rqt_image_view 确认

视觉模块的验证最短,两条命令:

# 视觉链路:先出图,再看图,两个终端 roslaunch usb_cam usb_cam_test.launch # 相机驱动,发布图像话题 rosrun rqt_image_view rqt_image_view # 图形化查看器,左上角下拉选话题

第一条启动 USB 相机驱动,正常会在/usb_cam/image_raw上持续发布图像。第二条起查看器,左上角下拉框里选中对应话题,画面出来就说明相机和驱动都正常。第一个终端不能关,关了话题就断,查看器显示无信号。

看不到图时按顺序查两步:rostopic list | grep image确认话题在不在,rostopic hz /usb_cam/image_raw确认帧率是不是零。话题在但帧率为零,多半是 USB 带宽不够或者相机被别的进程占着,把其它吃 USB 的节点停掉再试。相机镜头别用手摸,也别拿尖锐物去碰,花了就只能换。

4.5 语音:roscore、tts_subscribe 和蓝牙耳机

语音模块这几个节点没有自己的 master,必须先起roscore:

# 三个终端:master、订阅节点、发布测试文本 roscore rosrun robot_voice tts_subscribe rostopic pub /voiceWords std_msgs/String "data: '1234'"

第一条起 ROS 主节点,这台车上如果已经有别的 launch 在跑,roscore就不用重复起。第二条启动语音订阅节点,它订阅/voiceWords并把文本送去做语音合成。第三条往这个话题上发一条测试文本,data: '1234'里的内容就是要播报的文字,引号和冒号后面的空格都不能少,格式写错rostopic pub会直接报解析失败。

声音走蓝牙耳机,得先在系统设置里连上耳机并确认它是默认输出设备。连上了但没声音,先看系统音量、再看输出设备选没选对,最后确认tts_subscribe那个终端有没有打印收到消息。rostopic pub默认发一次就退出,想反复试就加-r 1,每秒发一次。

4.6 射击模块:shoot.launch 与 rostopic pub 触发

射击模块是独立供电的,验证前先把模块上的电源开关打开,水弹至少用矿泉水泡 8 小时以上,泡不到位打出去是碎的,还容易卡弹仓。

# 射击链路:起驱动,发一次触发 roslaunch abot_bringup shoot.launch # 射击模块驱动,占用串口 rostopic pub /shoot std_msgs/String "data: ''" # 触发一次

第一条把射击模块的驱动拉起来,它会占用对应的串口设备。第二条往/shoot话题发一条空字符串消息,驱动只认“消息到达”这个事件,内容是什么无所谓。不要加-r参数,加了会持续每秒触发,等于连射,弹仓里的水弹几秒就打光。

注意:射击模块任何时候都不要对着人和贵重物品,测试前先确认弹仓方向和人员位置。这条不是形式主义,水弹近距离打眼睛是能出事的。

5. 避坑与排查:ABOT-M1-ATK 配置过程中最常见的五个翻车现场

5.1 脚本报 Permission denied 或者找不到命令

现象:终端里敲./1-gmapping.sh回车,返回bash: ./1-gmapping.sh: Permission denied,或者No such file or directory,但文件明明就在那儿。

原因:两种可能。一是脚本从 U 盘或者压缩包拷过来时丢了可执行权限位;二是当前工作目录不在脚本所在目录,./是相对当前目录解析的,人在~下而脚本在桌面,自然找不到。这两种在车端交付时都遇到过。

解决:先cd到脚本所在目录,用ls -l看权限位,没有x就补上:

cd ~/Desktop # 换成脚本实际所在目录 ls -l 1-gmapping.sh # 权限位应是 -rwxr-xr-x chmod +x 1-gmapping.sh # 没有 x 就补上 ./1-gmapping.sh

chmod +x只影响当前文件,批量处理时用chmod +x *.sh。实在不想改权限,用bash 1-gmapping.sh也能跑,区别是脚本里的相对路径仍然按当前目录解析,不如改权限干净。

5.2 建出来的地图墙是弯的,绕一圈回来对不上

现象:RViz 里地图一点点长出来,看着还行,但仔细看长直墙是弧形的,绕场地走一圈回到起点,新扫的墙和最初的墙错开一大截。

原因:推车速度太快,激光雷达一帧扫完车身已经位移,点云拼接时产生运动畸变;再就是急转急停让轮式里程计打滑,Gmapping 完全信里程计,里程计一漂,整张图跟着歪。

解决:把线速度降到 0.2 米每秒以内,转向前先停一下再转,别一边全速前进一边大角度拐弯。场地允许的话走闭合回路,让 Gmapping 有机会做一次回环修正。地图已经歪了就重来,别在歪图上继续加,越加越救不回来。

5.3 导航目标点下去车不动,或者原地打转

现象:RViz 里点了2D Nav Goal,目标点也显示出来了,但车纹丝不动;或者原地左右打转几圈后停下。

原因:九成是初始位姿和建图起点对不上,AMCL 的粒子撒满了整张地图,收敛不到真实位置。剩下的一成是navigation.launch里加载的地图路径还指着上一次的旧图,或者地图文件被挪走了.yaml找不到.pgm。

解决:先把车摆回建图起点,用2D Pose Estimate手动给一次初始位姿,等几秒看 RViz 里粒子云是不是收拢成一团。再确认地图路径:

# 确认导航加载的是哪张图,以及图文件是否成对 grep -r "map" ~/lidar_ws/src/robot_slam/launch/navigation.launch ls -l <上面看到的 yaml 路径同目录>

路径对、位姿给了还是不动,去看move_base终端的输出,那里会明确写目标点在障碍物内、或者全局规划失败。

5.4 远程桌面连上了,但键盘遥控延迟到没法用

现象:向日葵画面能动,但按一下前进键,车要过半秒才动,建图时画面里的车已经贴墙了才反应过来。

原因:远程桌面传的是编码后的画面,带宽被画面吃掉,键盘事件排队。车端和开发机不在同一个热点下、中间隔了路由,延迟会更明显。

解决:车端和开发机连同一个热点,远程桌面里把画质和帧率调低,只留看 RViz 够用的清晰度。所有命令操作改走 SSH,键盘遥控也在 SSH 终端里敲,响应立刻正常。远程桌面负责看,SSH 负责操作,这个分工定下来之后建图顺畅很多。

5.5 语音节点起来了但耳机里没声音

现象:tts_subscribe终端里能看到收到消息并打印了内容,但蓝牙耳机一点动静没有。

原因:系统默认音频输出还挂在 HDMI 或者板载声卡上,蓝牙耳机连上了但没被设为输出设备;另一种是先rosrun后roscore,节点压根没注册到 master 上。

解决:先在系统声音设置里确认输出设备是蓝牙耳机,能听到系统提示音再继续。启动顺序固定成roscore→rosrun robot_voice tts_subscribe→rostopic pub,三个终端各司其职。还是没声音,rostopic info /voiceWords看一下订阅者数量,是零就说明tts_subscribe没连上 master。

6. 装完怎么验证:一套十分钟能跑完的全链路自检

器件一个个点亮不等于整套系统能跑,中间隔着 tf、话题、路径这些黏合剂。我习惯在正式用之前跑一遍全链路自检,从冷启动开始,按顺序走完八个检查点,任何一项卡住就停在那一项排查,不要跳过去往下走。

检查项操作通过标准
上电与显示HDMI 接显示器、供电、电源键、主控键桌面正常出现,分辨率正常
ROS 环境echo $ROS_DISTRO、rospack list版本非空,abot_ 系列包能列出
网络与远程连热点、ping 网关、向日葵连接车端能出网,远程画面流畅
雷达出数rostopic hz /scan帧率十几赫兹且不中断
建图与存图跑1-gmapping.sh,走一小圈,保存地图墙是直的,.pgm和.yaml成对
导航放回起点,跑2-navigation.sh,下发目标路径连续,车能到点
视觉usb_cam_test.launch+rqt_image_view画面正常,帧率非零
语音与射击tts_subscribe播报、shoot.launch触发耳机出声、模块动作

建图那一步别偷懒,自检用的地图也要按日期备份,换场地直接切回对应那天的图,比每次重建省事得多:

# 建完图立刻按日期留档,换场地时按目录名切回 mkdir -p ~/maps_backup/$(date +%Y%m%d) cp <地图目录>/*.pgm <地图目录>/*.yaml ~/maps_backup/$(date +%Y%m%d)/ ls -R ~/maps_backup | tail -n 20

$(date +%Y%m%d)会展开成当天日期,同名目录已存在就覆盖,同一天建两次图记得手动加个后缀区分。cp两个通配符必须都带上,只拷.yaml不拷.pgm,导航加载时会报图像文件缺失——这个错我犯过一次,对着路径看了半天才发现少拷一个文件。

还有一个小技巧:自检时把手机架在旁边录屏,录下从冷启动到导航跑完全程的画面。哪天现场出问题,回放一遍就知道是哪个环节先异常的,比事后凭记忆复盘可靠得多。建图那几分钟尤其值得录,地图是从哪一刻开始歪的,视频里一目了然。

从那以后我每次换场地,都强制走一遍「冷启动—自检—建图—按日期备份—回放导航」的完整流程,哪怕这次只改了一个目标点,也不跳步骤。这套流程花十分钟,能省掉现场半小时的抓瞎。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进