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) 已停止维护,不建议新项目
⚠️ 警告:千万别想着在Ubuntu 20.04上装ROS2 Humble,或者在Ubuntu 22.04上硬塞ROS Noetic。我见过有人这么干,结果折腾了两天,最后还是乖乖重装系统。

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 版本对应关系图

下面这张图是我画的,帮你理清这三者之间的依赖关系。箭头表示「依赖」或「兼容」。

Ubuntu 版本 ROS 发行版 MoveIt 版本 示例组合:Ubuntu 20.04 → ROS Noetic → MoveIt 1.1.x 不兼容组合:Ubuntu 22.04 → ROS Noetic → MoveIt 1.1.x(依赖库冲突) 箭头方向表示「依赖关系」:Ubuntu 决定 ROS 版本,ROS 决定 MoveIt 版本 三者必须形成一条完整的兼容链,缺一不可

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
⚠️ 注意:从源码编译时,记得先确认你的ROS发行版。比如上面这个命令是针对ROS2 Humble的。如果你用的是Noetic,要把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开始。这个组合最稳,资料最多,遇到问题也最容易搜到答案。