在Ubuntu 20.04上从零部署FAR Planner:一份包含键盘遥控和避坑的保姆级教程
第一次接触FAR Planner时,我被它动态更新可见性图的能力所吸引——这种技术能让机器人在未知环境中像探险家一样自主探索。但真正动手部署时,才发现从环境配置到键盘控制的每个环节都可能遇到意想不到的"坑"。本文将带你用最直接的方式,在Ubuntu 20.04上完整部署FAR Planner,并解决那些官方文档没细说的实际问题。
1. 环境准备与依赖安装
在开始之前,确保你的Ubuntu 20.04系统已经安装了ROS Noetic。这是FAR Planner运行的基础环境。我遇到过不少问题都源于ROS环境配置不当,所以这一步千万不能马虎。
首先更新软件包列表并安装关键依赖:
sudo apt update sudo apt install -y libusb-dev git build-essential特别注意:libusb-dev是后续编译必不可少的依赖,缺少它会导致难以排查的链接错误。我曾经因为漏装这个包,花了两个小时排查编译错误。
接下来需要配置ROS工作空间。建议创建一个独立的工作目录,避免与现有ROS项目冲突:
mkdir -p ~/far_planner_ws/src cd ~/far_planner_ws catkin_make2. 获取并编译自主探索开发环境
FAR Planner需要依赖Autonomous Exploration Development Environment运行。这个环境提供了一系列仿真场景和基础功能模块。
使用以下命令克隆仓库并切换到正确分支:
cd ~/far_planner_ws/src git clone https://github.com/HongbiaoZ/autonomous_exploration_development_environment.git cd autonomous_exploration_development_environment git checkout noetic # 对应Ubuntu 20.04的ROS版本编译过程中最常见的两个问题:
- 权限问题:如果遇到权限错误,尝试用
sudo chmod -R 755给目录赋权 - 依赖缺失:编译时如果报错缺少某些ROS包,用
rosdep install自动安装
成功编译后,下载仿真环境数据(约500MB):
./src/vehicle_simulator/mesh/download_environments.sh提示:如果下载速度慢,可以手动下载压缩包并解压到指定目录,这能节省大量时间。
3. 安装与配置FAR Planner核心功能
现在可以安装FAR Planner本体了。回到工作空间的src目录:
cd ~/far_planner_ws/src git clone https://github.com/MichaelFYang/far_planner.git编译前需要特别注意几个关键点:
- 确保所有依赖都已安装
- 检查ROS环境变量是否正确设置
- 确认系统Python版本为3.8(Ubuntu 20.04默认)
编译命令:
cd ~/far_planner_ws catkin_make -j$(nproc)编译完成后,建议先测试基础功能是否正常:
source devel/setup.sh roslaunch vehicle_simulator system_campus.launch在另一个终端运行:
source devel/setup.sh roslaunch far_planner far_planner.launch如果RVIZ正常启动并显示仿真环境,说明基础功能已经就绪。
4. 实现键盘遥控:解决消息类型不匹配问题
官方文档对键盘控制的说明比较简略,实际使用时会发现teleop_twist_keyboard的默认消息类型与FAR Planner不兼容。以下是详细解决方案。
首先安装键盘控制节点:
sudo apt-get install ros-noetic-teleop-twist-keyboard关键问题在于消息类型转换:
| 组件 | 消息类型 | 数据结构 |
|---|---|---|
| teleop_twist_keyboard | geometry_msgs/Twist | 线性+角速度 |
| FAR Planner | geometry_msgs/TwistStamped | 带时间戳的Twist |
解决方法有两种:
方案一:修改键盘节点源码
- 找到键盘控制脚本位置:
locate teleop_twist_keyboard.py - 备份原文件后,用支持TwistStamped的版本替换
- 修改关键参数:
- 第22行:
Twist→TwistStamped - 第204行:
False→True
- 第22行:
方案二:创建转换节点
更优雅的方式是编写一个简单的ROS节点做消息转换:
#!/usr/bin/env python3 import rospy from geometry_msgs.msg import Twist, TwistStamped def callback(data): twist_stamped = TwistStamped() twist_stamped.header.stamp = rospy.Time.now() twist_stamped.twist = data pub.publish(twist_stamped) rospy.init_node('twist_converter') pub = rospy.Publisher('/cmd_vel_stamped', TwistStamped, queue_size=10) rospy.Subscriber('/cmd_vel', Twist, callback) rospy.spin()将上述代码保存为twist_converter.py,赋予执行权限后运行:
chmod +x twist_converter.py rosrun your_package twist_converter.py5. 常见问题排查与性能优化
即使按照步骤操作,仍可能遇到各种问题。以下是几个典型场景的解决方案:
问题1:Gazebo黑屏或模型加载失败
解决方法:
sudo apt-get install --reinstall ros-noetic-gazebo-ros-pkgs export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/far_planner_ws/src/autonomous_exploration_development_environment/src/vehicle_simulator/meshes问题2:TF树报错
常见错误是时间戳不同步,解决方法:
rosparam set /use_sim_time true问题3:规划器反应迟钝
可以调整FAR Planner的线程占用比例:
<!-- 修改far_planner.launch文件 --> <param name="update_graph_thread_ratio" value="0.2" />性能优化建议:
- 在
far_planner.launch中调整这些参数:<param name="kUpdateGraphInterval" value="0.1" /> <param name="kAdmissibleCost" value="1.5" /> - 对于复杂环境,增加规划器更新频率
- 在低配设备上,降低RVIZ的显示质量
6. 扩展应用:连接真实设备与自定义环境
当需要在真实机器人上部署时,启动命令有所不同:
roslaunch vehicle_simulator system_real_robot.launch连接真实激光雷达需要配置正确的topic名称。修改loam_interface.launch文件:
<param name="pointCloudTopic" value="/laser_cloud" />创建自定义仿真环境的步骤:
- 准备3D模型文件(.dae或.stl格式)
- 放入
src/vehicle_simulator/meshes目录 - 创建对应的launch文件,参考现有环境模板
- 在RVIZ中调整显示参数
对于想使用ROS bag数据测试的用户,建议这样播放:
rosbag play --clock your_bag.bag同时需要在local_planner.launch中设置:
<param name="use_sim_time" value="true" />7. 高级调试技巧与可视化优化
熟练使用RVIZ的调试工具能大幅提高开发效率。几个实用技巧:
- 按
Ctrl+Shift+A显示所有交互标记 - 使用
Focus Camera功能锁定视角 - 通过
Panel > Add New Panel添加自定义视图
可视化可见性图的技巧:
- 在RVIZ中添加
MarkerArray显示 - 设置颜色透明度为0.3以便观察底层环境
- 使用
Toggle按钮临时关闭某些显示
记录调试数据的方法:
rosbag record -O debug.bag /far_planner/graph /far_planner/path分析数据时,可以使用rqt_plot观察关键指标:
rqt_plot /far_planner/path/length我在实际项目中发现,当机器人卡住时,检查这些方面最有效:
- 可见性图的覆盖范围是否足够
- 当前路径的成本值是否突然增大
- 最新的传感器数据是否正常更新