1. MoveIt与ROS版本兼容性:Ubuntu版本、ROS发行版、MoveIt版本之间的对应关系
说实话,我见过太多新手一上来就栽在版本问题上。明明代码写得没问题,编译就是报错,或者一运行就崩溃。嗯,十有八九是版本没对上。
我个人习惯,拿到一个新项目,第一件事就是确认三样东西:Ubuntu版本、ROS发行版、MoveIt版本。这三者就像齿轮,一个齿对不上,整个机器就转不动。
1.1 官方推荐的版本对应表
先给你一张我整理的表。这可不是网上随便抄的,是我这些年踩坑踩出来的经验总结。
| Ubuntu版本 | ROS发行版 | MoveIt版本 | 备注 |
|---|---|---|---|
| Ubuntu 20.04 | ROS Noetic | MoveIt 1 (1.1.x) | 最稳定组合,推荐新手 |
| Ubuntu 22.04 | ROS2 Humble | MoveIt 2 (2.5.x+) | 目前主流,功能最全 |
| Ubuntu 24.04 | ROS2 Jazzy | MoveIt 2 (2.8.x+) | 最新,但生态还不够成熟 |
| Ubuntu 18.04 | ROS Melodic | MoveIt 1 (1.0.x) | 已停止维护,不建议新项目 |
1.2 版本不匹配的典型症状
为什么会这样?说白了,ROS和MoveIt的底层依赖库(比如Boost、Eigen、PCL)在不同版本间有ABI不兼容的问题。你想想看,一个库用C++14编译,另一个用C++17编译,链接在一起不出错才怪。
编译错误常见表现:
undefined reference to一堆符号找不到fatal error: moveit/move_group_interface/move_group_interface.h: No such file or directory- CMake报错说找不到某个
Config.cmake文件
运行时崩溃常见表现:
- 启动
roslaunch后,MoveGroup节点直接segfault - 加载URDF模型时卡死,或者报
PluginlibFactory: The plugin for class '...' failed to load - Rviz中的MotionPlanning插件显示不出来,或者点不动
💡 我的经验:如果你遇到的是编译错误,那还算幸运,至少能定位问题。运行时崩溃才是最恶心的——它可能在你运行了10分钟、一切看起来都正常的时候突然崩掉。我曾经在给客户做演示时遇到这种情况,场面一度非常尴尬。
1.3 如何快速确认当前环境版本
别凭感觉,用命令说话。我每次搭建环境都会跑一遍这几条命令,确认无误再往下走。
# 查看Ubuntu版本
lsb_release -a
# 查看ROS版本
rosversion -d
# 查看MoveIt版本(ROS1)
rospack find moveit_core
cat $(rospack find moveit_core)/package.xml | grep version
# 查看MoveIt版本(ROS2)
ros2 pkg list | grep moveit
ros2 pkg xml moveit_core | grep version
💡 小技巧:我习惯把这几条命令写成一个脚本,叫check_env.sh,每次新开项目都跑一遍。省得后面出了问题再回头排查,浪费时间。
1.4 版本对应关系图
下面这张图是我画的,帮你理清这三者之间的依赖关系。箭头表示「依赖」或「兼容」。
1.5 避坑指南:我踩过的那些坑
坑一:混用ROS1和ROS2的依赖
我曾经在一个项目里,既装了ROS Noetic,又装了ROS2 Foxy。想着两边都能用,结果编译MoveIt时,CMake找到了ROS1的库,但头文件却是ROS2的。编译报错报得我头皮发麻。后来我学乖了,一台机器只装一个ROS发行版。
坑二:apt安装的MoveIt版本太老
Ubuntu 20.04上,如果你直接用sudo apt install ros-noetic-moveit,装的是1.0.x版本。但很多新功能(比如混合规划)在1.1.x才支持。我建议你从源码编译,或者添加MoveIt的官方PPA。
# 从源码编译MoveIt(推荐)
cd ~/catkin_ws/src
git clone https://github.com/ros-planning/moveit2.git -b main
vcs import < moveit2/moveit2.repos
rosdep install -r --from-paths . --ignore-src --rosdistro humble -y
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
moveit2换成moveit,humble换成noetic。
坑三:Python版本冲突
MoveIt的Python接口(moveit_commander)依赖Python3。但ROS1 Noetic默认用的是Python3,而ROS2 Humble也是Python3。按理说没问题,但如果你系统里同时装了Python2.7和Python3,ROS的catkin工具可能会选错解释器。我遇到过import moveit_commander直接报ModuleNotFoundError的情况,查了半天发现是Python路径没设对。
💡 我的建议:用virtualenv或conda隔离Python环境。虽然ROS官方不推荐,但我个人觉得,对于仿真联调来说,环境隔离能省掉90%的Python版本问题。
1.6 总结一句话
版本兼容性这事,说白了就是「门当户对」。Ubuntu、ROS、MoveIt三者必须来自同一个「时代」。别贪新,也别守旧。对于新手,我强烈建议从Ubuntu 20.04 + ROS Noetic + MoveIt 1.1.x开始。这个组合最稳,资料最多,遇到问题也最容易搜到答案。