ABOT-M1-ATK ROS激光雷达建图与导航调参实战
简介这份 PDF 是一份面向高校竞赛选手与机器人初学者的 ABOT-M1-ATK 智能车快速上手配置文档围绕激光雷达建图、机器人导航、视觉与语音识别、射击模块以及远程桌面调试等竞赛常用能力展开服务于中国机器人及人工智能大赛、全球校园精英人工智能算法大赛等巡航赛项的准备与训练适合刚接触 ROS 与无人车平台的读者按图索骥完成整机功能验证。资源包共 1 个 PDF 文件约 2.3MB内容以操作指南与终端指令说明为主按启动机器、远程连接、建图保存、导航设点、模块测试的顺序组织形成清晰的上手链路。已有 591 人学习关注。文档不仅列出各环节所需命令与预期现象还给出安全注意事项、功能包工作空间划分视觉、语音、激光导航与底盘配置及 Gmapping、Hector、Cartographer 三种建图方式的启动与地图保存方法便于读者对照排查问题、快速搭建实验环境并复现赛项所需的基础功能。1. 从开箱到能跑ABOT-M1-ATK 的第一天该先验证什么把智能车 ABOT-M1-ATK 从箱子里抬到桌上很多人第一反应是开终端跑建图结果激光雷达被手托了一下、电源只剩一格后面 ROS 里的激光雷达数据和机器人导航表现都像玄学。它是一台面向竞赛与教学的四轮差速底盘核心链路是 ROS 下的激光雷达环境感知、地图创建、路径规划再加上视觉识别、语音和射击模块。适合准备参加某机器人及人工智能类竞赛、某校园算法类赛事的队伍也适合想把无人驾驶小车链路跑通的开发者。第一天别急着调算法先把上电顺序、远程桌面和传感器自检走一遍。2. 上电与 ROS 工作空间把远程桌面、底盘和传感器拉成一条链2.1 开箱上电顺序与远程桌面链路ABOT-M1-ATK 的机械结构不算复杂真正容易受伤的是激光雷达和相机模组。取机器时双手放在前后轮胎之间的底盘位置抬起不要用手托拽激光雷达也不要在雷达上方压放任何物体。机身不要洒液体学习和操作时不要用手或尖锐物体碰相机模块。主控制器关机状态下随手关闭电源电量显示一格就充电充电器用 DC12.6V/2.0A红灯是充电状态绿灯是充满状态。长时间半个月不用也要补一次电维护电源。这些注意事项看着琐碎现场翻车多半就从这里开始。首次上电按固定顺序走先把外部 HDMI 线接到 10 寸显示器再给显示器供电按下电源开关等 5 秒最后按主控制器开关等系统开机完成。第一次配网不要图省事直接远程先在本地界面把无线网络连上手机热点也行电脑和车处在同一局域网后再开远程桌面工具。机器端打开远程桌面工具查看识别码和验证码电脑端装同一款工具输入识别码和验证码连接。识别码每台设备不同以机器界面显示的为准。远程桌面适合无头调试但网络一断就容易抓瞎所以 HDMI 加键鼠是必要的后悔药。我一般会先在本地终端确认无线网卡拿到了地址再开远程避免把“远程连不上”误判成主控坏了。下面两条命令只做链路确认不改网络配置# 查看无线网卡是否拿到地址wlan0 是常见无线网卡名以实际设备为准 ip addr show wlan0 # ping 网关看链路是否通网关地址以热点或路由器实际分配为准 ping -c 4 192.168.1.1ip addr show wlan0看的是无线网卡状态inet后面有地址说明配网成功没有地址就回本地界面重新连 Wi-Fi。ping的网关地址不是固定值手机热点和路由器不一样按实际网段填。远程桌面延迟高时先靠近热点、减少中间隔墙再降低远程画质和 rviz 刷新频率不要一上来怀疑 ROS 节点。提示首次配网、首次建图、首次导航都建议接一次 10 寸显示器本地确认远程桌面只作为后续无头调试手段。2.2 ROS 工作空间与功能包地图这台车的资料里把功能拆成几个工作空间abot_vision管视觉abot_voice管语音lidar_ws管激光和导航robot_ws管机器人配置、底盘和其他模块驱动综合 demo 也在里面。每个工作空间下的src存放功能包启动文件通常就在功能包内。先建立“哪个包管哪条链路”的认知比一上来改参数重要。可以先列顶层目录确认功能包名字和资料里描述一致# 只列每个工作空间 src 下的功能包先建立链路映射 ls -1 ~/abot_vision/src ls -1 ~/abot_voice/src ls -1 ~/lidar_ws/src ls -1 ~/robot_ws/srcls -1每行一个条目方便看包名。路径里的~是当前用户主目录实际用户名不同不影响命令。看到abot_bringup、abot_slam、robot_slam、usb_cam、robot_voice这类名字就能对上后面的启动命令。改过源码才需要编译编译时限制并行任务避免小内存主控卡死# 进入机器人配置工作空间编译-j2 限制并行编译任务 cd ~/robot_ws catkin_make -j2 source devel/setup.bashcatkin_make负责编译工作空间-j2是并行任务数主控内存小就压到 1 或 2。source devel/setup.bash把当前工作空间加入环境变量新开终端也要重新 source。没改源码不要反复全量编译避免把原本能跑的包编译出路径问题。工作空间分开的好处是视觉、语音、导航互不污染坏处是环境变量容易串启动前先确认当前终端 source 的是哪个工作空间。2.3 底盘与传感器启动的最小验证建图之前先跑最小验证只启动底盘和 IMU看话题和 TF 是否齐全再叠加激光。robot_with_imu.launch在资料里反复出现通常负责底盘驱动、IMU 和基础坐标变换。先开终端 A# 终端 A启动底盘与 IMU先不要叠加建图 roslaunch abot_bringup robot_with_imu.launch终端 B 查话题和频率# 看激光、里程计、IMU、TF 相关话题是否出现 rostopic list | grep -E scan|odom|imu|tf # 看激光数据频率常见在 5-15Hz 区间具体以雷达型号为准 rostopic hz /scan # 看一帧激光数据的 frame_id 和角度范围 rostopic echo -n1 /scan | head -20rostopic list里的/scan是激光扫描/odom是里程计/imu是姿态/tf是坐标变换。rostopic hz /scan频率突然掉到很低先查雷达供电和网线/串口不要先改 SLAM 参数。rostopic echo -n1 /scan的frame_id要和 TF 树里的激光坐标系一致不一致时 rviz 里激光会飘或者不显示。再看 TF 树# 生成 TF 树 PDF重点看 map - odom - base_link - 激光坐标系是否连上 rosrun tf view_framesview_frames会在当前目录生成frames.pdf看map、odom、base_link、激光frame_id之间有没有断链。缺base_link到激光的变换建图会直接翻车缺odom到base_linkGmapping 这类依赖里程计的算法会漂。常见误用是一上来跑gmapping.launchTF 没齐就怪算法。血泪经验是先让底盘、IMU、激光各自在 rviz 里正常显示再谈建图。3. 激光雷达建图Gmapping、Hector、Cartographer 三条路线的参数与边界3.1 Gmapping从1-gmapping.sh到键盘控制Gmapping 是粒子滤波 SLAM吃激光和里程计适合室内低速、场地结构有一定特征的场景。资料里的快速上手脚本是1-gmapping.sh启动前把机器放到建图初始位置并记录后面导航要回到同一位置。启动 ABOT-M1 不用接 10 寸显示器用远程桌面连上在机器人桌面右键打开终端执行脚本# 在脚本所在目录执行脚本通常封装底盘、Gmapping 和 rviz 的启动 ./1-gmapping.sh # 建图完成后另开终端保存地图不要关闭建图终端 roslaunch abot_slam save_map.launch./1-gmapping.sh前面的./表示执行当前目录脚本没有执行权限时先chmod x 1-gmapping.sh。脚本一般会拉起多个终端资料里提到在第五个终端用键盘控制U、I、O控制左前、前、右前J、L控制左右转M、、控制左后、后、右后英文大写开启时U、O和、变成平移。速度别拉满我一般从线速度 0.2 m/s、角速度 0.5 rad/s 起步场地窄再降。也可以单独用键盘控制节点# 单独启动键盘控制按终端提示调线速度和角速度 rosrun teleop_twist_keyboard teleop_twist_keyboard.pyteleop_twist_keyboard.py发布/cmd_vel终端里会显示当前线速度和角速度按键。建图时转角要慢粒子滤波跟不上快速旋转墙线容易重影。空旷长走廊、玻璃幕墙、正对白墙的区域激光特征少Gmapping 漂是算法边界不是脚本坏了。建图路线尽量闭环回到起点附近再保存地图闭合质量会好很多。3.2 Hector 与 Cartographer什么时候换、怎么切Hector 不依赖里程计主要靠激光帧匹配适合雷达频率较高、场地结构丰富的室内环境。资料里的启动方式是先起底盘再起hector_mapping.launch和view_mapping.launch键盘控制仍然用teleop_twist_keyboard.py。Cartographer 走子图加回环适合更大场地但配置项多tracking_frame、published_frame、odom_frame配错时地图不动或者 TF 报错。三条路线对比如下路线主要输入适合场景常见注意点Gmapping激光 里程计室内低速、有里程计快速旋转易重影依赖 TF 完整Hector激光为主场地结构丰富、雷达频率足对激光frame_id和 TF 敏感Cartographer激光 IMU/里程计较大场地、需要回环配置文件多坐标系别写错启动命令按资料里的链路走注意别同时开两条建图链路# Hector先起底盘再起建图与可视化 roslaunch abot_bringup robot_with_imu.launch roslaunch abot_slam hector_mapping.launch roslaunch abot_slam view_mapping.launch # Cartographer另一条链路和 Hector 不要同时开 roslaunch abot_bringup robot_with_imu.launch roslaunch abot_slam cartographer.launchrobot_with_imu.launch负责底盘和 IMU 基础数据hector_mapping.launch和cartographer.launch是互斥的建图前端。view_mapping.launch只做可视化地图不动先看它有没有订阅到/map或建图节点输出。Cartographer 的 lua 配置里坐标系名字必须和 TF 树一致tracking_frame一般对应激光或底盘published_frame对应发布地图的父坐标系写错就表现为“激光在动、地图不动”。这些参数不要凭感觉改先rosrun tf view_frames看真实坐标系名字。3.3 地图保存、回放与质量检查地图保存不是关掉终端就完事save_map.launch通常调用地图保存服务建图终端关了就保存不了。保存后确认输出目录里有.pgm和.yaml两个文件# 保存地图确认 save_map.launch 里的地图名和输出路径 roslaunch abot_slam save_map.launch # 找一下刚生成的地图文件路径以实际输出为准 find ~ -name *.yaml -path *map* | head.pgm是栅格图像.yaml记录resolution、origin、negate等元数据。resolution常见是 0.05 米/像素具体看保存配置origin是地图左下角在全局坐标里的位姿导航加载地图时用。地图质量先看墙线是否重影、闭环是否错位、障碍物膨胀是否把可通行区域吃掉。重影多半是建图时转太快或激光帧匹配跟不上闭环错位多半是长走廊特征少。建图完成后用map_server单独加载地图检查# 单独加载地图看 rviz 里地图和实际场地是否对得上 rosrun map_server map_server /实际路径/map.yamlmap_server后面的 yaml 路径要换成保存出来的文件。rviz 里把 Fixed Frame 设成map加 Map 显示看地图边缘和场地墙线是否一致。地图文件名不要带空格和中文导航 launch 里引用路径时容易出问题。建图阶段记录初始位置这个动作别省导航阶段把车放回同一位置AMCL 初始定位会省很多事。4. 机器人导航落地AMCL 定位、代价地图与 2D Nav Goal 的调参顺序4.1 导航栈输入输出地图、TF、激光与里程计导航链路的核心输入是地图、TF、激光和里程计输出是/cmd_vel。资料里的启动顺序是先robot_with_imu.launch再navigation.launch最后view_nav.launch。navigation.launch通常拉起地图服务、AMCL 定位和 move_base 规划器。启动后先确认关键话题# 导航启动后检查地图、定位、代价地图和速度话题 rostopic list | grep -E map|amcl|move_base|cmd_vel # 看 AMCL 是否发布定位位姿 rostopic echo -n1 /amcl_pose # 看全局代价地图是否生成 rostopic echo -n1 /move_base/global_costmap/costmap/map是静态地图/amcl_pose是定位输出/move_base/global_costmap/costmap是全局代价地图/cmd_vel是底盘速度指令。AMCL 没发布位姿先看初始位置有没有给、激光有没有订阅、TF 是否完整。全局代价地图为空通常是地图没加载或者map坐标系对不上。导航不是单个节点任何一个输入断了表现都像“车不动”。把车放回建图初始位置再启动导航能减少全局重定位。初始位置差太多时在 rviz 里用2D Pose Estimate给一个粗略位姿再让 AMCL 收敛。AMCL 的粒子数、更新阈值这些参数不要一上来大改先保证地图、TF、激光三件事对得上。常见误用是只盯目标点不看/cmd_vel有没有输出有输出但车不动查底盘使能、电源和串口没输出才回来看规划器。4.2 2D Nav Goal 下发与代价地图参数rviz 里点2D Nav Goal再点地图空白处并拖出方向是最直观的目标下发方式。命令行也能发方便复现和脚本化# 命令行下发目标点frame_id 必须是 mapx/y 是地图坐标 rostopic pub -1 /move_base_simple/goal geometry_msgs/PoseStamped \ {header: {frame_id: map}, pose: {position: {x: 1.0, y: 0.5, z: 0.0}, orientation: {w: 1.0}}}-1表示只发一次frame_id: map表示目标点在全局地图坐标系x、y单位是米orientation.w: 1.0表示不额外旋转。目标点别贴墙、别落在膨胀层里否则规划器会判定不可达。代价地图几个参数先看这几个参数作用调法inflation_radius障碍物膨胀半径大于车体半宽别大到把通道封死cost_scaling_factor膨胀代价衰减太大贴墙风险高太小绕障不积极xy_goal_tolerance到达位置容差场地窄就适当放宽别追求零误差yaw_goal_tolerance到达朝向容差需要精确对准时收紧但容易原地磨inflation_radius要覆盖车体半宽再加一点余量太小会蹭墙太大会把窄门判成不可通行。xy_goal_tolerance和yaw_goal_tolerance是到点判定设得太严车会在目标点附近反复调整。调参顺序是先看全局路径是否合理再看局部路径是否贴障最后看到点精度。全局路径穿墙是地图或代价地图问题局部路径画龙是局部规划器和激光数据问题。4.3 导航失败看什么从 TF 到局部规划导航跑偏时按固定顺序抓黑匣子TF 树、地图服务、AMCL 定位、激光数据、代价地图、/cmd_vel。命令不用多关键是顺序别乱# 导航异常时按顺序抓一轮现场 rosrun tf view_frames rostopic echo -n1 /amcl_pose rostopic hz /scan rostopic echo -n1 /move_base/global_costmap/costmap rostopic echo -n1 /cmd_vel先看frames.pdf里map到odom到base_link是否连续断链时导航必挂。再看/amcl_pose是否在跳定位跳变会让全局路径反复重算。/scan频率掉或数据被遮挡局部规划器会以为前方有障碍。代价地图为空查地图加载/cmd_vel有数据但底盘不动查底盘驱动和电源。黑匣子抓完再改参数别凭感觉把move_base参数改成一锅粥。5. 常见问题排查雷达、底盘、网络、电源的五类翻车现场5.1 雷达与底盘类翻车现象一建图时某一侧墙线总是缺一块rviz 里激光出现固定扇形缺口。原因多半是激光雷达上方压了物体或者搬运时手托了雷达导致视窗被挡。解决是先断电检查雷达周围有没有杂物擦拭视窗外表面重新上电后用rostopic echo -n1 /scan看最近距离是否恢复正常。雷达上方不要压放任何物体这条不是客气话是保护激光视窗的硬要求。现象二导航目标点发了/cmd_vel有数据底盘就是不动。原因常见是底盘电源没开、电量太低、串口没权限或底盘使能没拉起。解决是先看底盘开关和电量显示电量一格就充电再rostopic echo /cmd_vel确认有速度指令最后查底盘驱动终端有没有串口报错。不要一上来改 move_base 参数先确认底盘收不收到指令。现象三rviz 里激光不显示建图节点报 TF 超时。原因通常是base_link到激光坐标系的静态变换没加载或者激光frame_id和 launch 里写的不一致。解决是rosrun tf view_frames看断在哪一层再对照robot_with_imu.launch和雷达驱动里的frame_id。TF 是导航的骨架骨架断了算法再调也是白调。5.2 网络与远程桌面类翻车现象四远程桌面识别码和验证码都输对了还是黑屏或连不上。原因常见是车端 Wi-Fi 断了、电脑和车不在同一网段、热点开启了客户端隔离。解决是接 HDMI 回本地界面看网络用ip addr show wlan0确认地址电脑端 ping 车端地址。远程桌面工具两端要装同一款识别码每台设备不同以机器界面为准。现象五远程建图时地图重影严重本地跑却没这么差。原因不一定是算法远程桌面延迟高、rviz 刷新吃资源、网络抖动都会让操作节奏变形。解决是靠近热点、减少隔墙、降低远程画质和 rviz 刷新建图时慢转慢走。网络问题表现得很像 SLAM 参数问题先排除链路再调参。5.3 电源与模块类翻车现象六跑到一半主控重启、雷达掉线重启后又正常。原因常见是电量一格还在跑电压跌落导致主控和雷达掉电。解决是电量显示一格就充电用 DC12.6V/2.0A 充电器红灯充电、绿灯充满半个月不用也补一次电。比赛前把电池状态当成必检项别把电源问题当成 ROS 玄学。现象七视觉图像花屏或偏暗语音和射击模块也偶发不响应。原因可能是相机镜头被手摸、排线松、模块电源没开。解决是先断电检查相机镜头和排线再roslaunch usb_cam usb_cam_test.launch加rqt_image_view看单帧图像语音先roscore后跑tts_subscribe射击模块先开电源、水弹泡够 8 小时再装弹测试时不要对着人员和易损物品。模块类问题先把供电和连接查清楚再怀疑驱动。6. 视觉语音与射击模块联调用三个最小闭环验收整机6.1 视觉链路先看一帧图视觉识别不用一上来就跑完整算法先确认相机出图。启动usb_cam测试 launch再用rqt_image_view看画面# 终端 A启动相机测试 roslaunch usb_cam usb_cam_test.launch # 终端 B看图像话题 rosrun rqt_image_view rqt_image_view画面正常再调曝光和分辨率偏暗先看环境光花屏先查镜头和排线。rqt_image_view里选/usb_cam/image_raw这类话题能看到连续画面才算视觉链路通。相机模块不要用手或尖锐物体碰镜头污损会让后面所有识别结果都不对。6.2 语音与射击按“先听后打”顺序语音先听播报射击先听空射声音。语音链路是roscore、rosrun robot_voice tts_subscribe再发一条/voiceWords射击链路是roslaunch abot_bringup shoot.launch再发/shoot。水弹泡够 8 小时再装弹测试时不对着人员和易损物品。验收表可以按下面三项过模块最小闭环通过标准视觉相机 launch 图像查看画面连续、不花屏语音tts_subscribe 话题发布耳机里有播报射击shoot.launch 话题发布有射击动作弹道安全我自己的习惯是每次比赛前把视觉、语音、射击各跑一遍最小闭环不把整机联调留到赛前最后一晚。原始启动脚本和 launch 文件在资源包里保留着拿过去先备份再改先照第 2 章的启动顺序跑一遍比直接改参数稳。希望帮到你。本文还有配套的精品资源点击获取