1. 项目背景与设备选型
去年入手了一台scout mini开源机器人平台,这个小车底盘搭载了树莓派4B作为主控,支持ROS/ROS2系统。当时看中的就是它丰富的扩展接口和活跃的开发者社区。不过原厂提供的导航算法在复杂环境下表现一般,特别是遇到动态障碍物时反应比较迟钝。
正好看到GitHub上有个叫NeuPAN的开源项目,号称是专为小型移动机器人设计的轻量级导航框架。作者声称在计算资源有限的设备上(比如树莓派)也能实现低延迟的路径规划。这完美匹配我的需求场景——在20平米的实验室里测试自动巡逻功能,需要小车能灵活避开突然出现的椅子和实验器材。
2. 环境搭建与依赖处理
2.1 系统基础配置
首先确保scout mini的Ubuntu 20.04系统已经安装好ROS Noetic。这里有个坑要注意:原厂镜像默认把用户添加到dialout组,但运行NeuPAN需要额外加入video组才能正常调用摄像头:
bash复制sudo usermod -a -G video pi
然后安装核心依赖项。NeuPAN的文档里只列出了基础依赖,实际测试发现还需要手动安装这些包:
bash复制sudo apt-get install libeigen3-dev libboost-all-dev libopencv-dev
特别提醒:如果之前装过其他版本的OpenCV,建议先完全卸载再安装libopencv-dev,避免版本冲突导致后期编译报错。
2.2 源码编译技巧
从GitHub克隆最新代码后,不要直接catkin_make。我推荐先用下面的命令检查依赖完整性:
bash复制rosdep install --from-paths src --ignore-src -y
编译时遇到过一个典型问题:PCL库的包含路径找不到。解决方法是在CMakeLists.txt里显式指定路径:
cmake复制set(PCL_DIR "/usr/lib/arm-linux-gnueabihf/cmake/pcl")
如果编译过程卡在97%左右,通常是g2o优化库的问题。可以尝试先单独编译g2o组件:
bash复制cd ~/catkin_ws/src/NeuPAN/thirdparty/g2o
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4
3. 传感器配置与标定
3.1 激光雷达参数优化
scout mini配的是RPLIDAR A1,默认参数在NeuPAN中表现不佳。需要修改launch文件中的这些关键参数:
xml复制<param name="range_min" value="0.15"/>
<param name="range_max" value="6.0"/>
<param name="angle_compensate" value="true"/>
实测发现将扫描频率从10Hz降到8Hz可以显著降低CPU占用,而且对导航精度影响很小:
bash复制rosrun rplidar_ros rplidarNode _frame_id:=laser _serial_baudrate:=115200 _angle_compensate:=true _scan_mode:=Express
3.2 视觉惯性联合标定
NeuPAN支持视觉辅助定位,但scout mini的IMU和摄像头需要先做联合标定。推荐使用kalibr工具:
- 打印AprilTag标定板并测量实际尺寸
- 录制包含匀速运动和旋转的bag文件:
bash复制
rosbag record /cam/image_raw /imu/data -O calibration.bag - 运行标定命令时添加--timeoffset-padding参数避免时间同步问题
重要提示:标定过程要保持环境光线均匀,避免阳光直射导致曝光突变影响结果
4. 算法参数调优实战
4.1 局部避障参数调整
NeuPAN的局部规划器默认参数对小车型号过于保守。经过两周测试,这套参数组合在scout mini上表现最佳:
| 参数名 | 原值 | 优化值 | 作用 |
|---|---|---|---|
| max_vel_x | 0.5 | 0.8 | 最大前进速度 |
| acc_lim_theta | 0.5 | 1.2 | 角加速度限制 |
| inflation_radius | 0.3 | 0.15 | 障碍物膨胀半径 |
| oscillation_reset_dist | 0.05 | 0.02 | 震荡检测阈值 |
调试技巧:先用rviz的Publish Point工具模拟临时障碍物,观察小车的避障轨迹是否平滑。
4.2 全局规划器内存优化
在树莓派4B上运行A*算法时,发现规划大范围路径时会卡顿。解决方法是在global_planner_params.yaml中添加:
yaml复制use_dijkstra: false
allow_unknown: true
cost_factor: 0.55
同时建议将地图分辨率从0.05m调整为0.1m,内存占用直接降低75%而导航精度几乎不受影响。
5. 典型问题排查记录
5.1 定位丢失问题
现象:小车运行一段时间后AMCL定位突然发散
排查步骤:
- 检查
/tf树是否完整 - 查看
/amcl/particlecloud话题的发布频率 - 最终发现是IMU数据存在累积误差
解决方案:在amcl.launch中增加:
xml复制<param name="odom_frame_id" value="odom_combined"/>
<param name="gui_publish_rate" value="5.0"/>
5.2 控制延迟问题
当同时运行建图和导航时,出现控制指令延迟。通过rostopic hz /cmd_vel发现频率从50Hz降到10Hz。
根本原因是USB带宽不足。将激光雷达和摄像头分别接到树莓派的两个USB控制器(通过lsusb -t查看拓扑结构),问题立即解决。
6. 实际场景测试数据
在3种典型环境下进行了性能对比测试:
| 场景类型 | 原厂算法成功率 | NeuPAN成功率 | CPU占用率 |
|---|---|---|---|
| 静态障碍 | 92% | 98% | 35%→45% |
| 动态障碍 | 65% | 89% | 40%→60% |
| 狭窄通道 | 70% | 95% | 38%→50% |
特别在有人突然经过的场景下,NeuPAN的反应速度比原厂算法快200-300ms,这主要得益于其改进的动态障碍物预测算法。
7. 扩展功能开发
7.1 语音控制集成
通过ROS的sound_play包实现基础语音控制。需要注意在树莓派上要指定正确的音频设备:
python复制self.soundhandle = SoundClient(device='plughw:CARD=Headphones')
7.2 远程监控方案
使用mjpg-streamer搭建低延迟视频流:
bash复制./mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 640x480" -o "output_http.so -p 8080"
配合rosbridge_suite可以实现网页端的实时控制和状态监控。