在使用 ROS Noetic 编译 ORB_SLAM2 包时,您遇到了如下错误信息:
[rosbuild] rospack found package "ORB_SLAM2" at "/home/lyb/pointcloudmap_ws/src/ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2", but the current directory is "/home/lyb/test_ORB_SLAM2_point_cloud/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2". You should double-check your ROS_PACKAGE_PATH to ensure that packages are found in the correct precedence order. 123456 问题原因分析
该错误提示表明,rosbuild 在 ROS_PACKAGE_PATH 环境变量中找到了两个不同路径下的 ORB_SLAM2 包:
/home/lyb/pointcloudmap_ws/src/ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2/home/lyb/test_ORB_SLAM2_point_cloud/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2rosbuild 根据 ROS_PACKAGE_PATH 的顺序,优先在 /home/lyb/pointcloudmap_ws/src 中查找到了 ORB_SLAM2_modified 版本的包,而当前编译目录位于另一个路径下的 ORB_SLAM2 包中,导致路径不一致,从而引发错误。
解决方案为了解决此问题,需要确保 ROS_PACKAGE_PATH 中的路径顺序正确,使得当前工作空间中的 ORB_SLAM2 包优先被找到。以下是详细的步骤:
检查当前 ROS_PACKAGE_PATH
您已经提供了 ROS_PACKAGE_PATH 的输出:
/home/lyb/pointcloudmap_ws/src:/home/lyb/Orbbec_ws/src:/home/lyb/catkin_ws_1/src:/home/lyb/ROS-Noetic-pr2/catkin_ws/src:/home/lyb/ros_web/src:/home/lyb/demo_ros-control_ws/src:/home/lyb/AutoPaintRobot/src:/home/lyb/catkin_ws/src:/opt/ros/noetic/share:/home/lyb/vision_opencv/cv_bridge 1
可以看到,/home/lyb/pointcloudmap_ws/src 在最前面,这导致 rosbuild 优先查找该路径下的 ORB_SLAM2_modified 包。
调整 ROS_PACKAGE_PATH 的顺序
为了让当前工作空间的 ORB_SLAM2 包优先被找到,需要将当前工作空间的路径放在 ROS_PACKAGE_PATH 的前面。假设当前工作空间为 /home/lyb/test_ORB_SLAM2_point_cloud/src,可以通过以下命令调整:
export ROS_PACKAGE_PATH=/home/lyb/test_ORB_SLAM2_point_cloud/src:$ROS_PACKAGE_PATH 1
为了永久生效,可以将上述命令添加到 ~/.bashrc 文件中:
echo 'export ROS_PACKAGE_PATH=/home/lyb/test_ORB_SLAM2_point_cloud/src:$ROS_PACKAGE_PATH' >> ~/.bashrc source ~/.bashrc 12
移除或重命名冲突的包
如果不需要 pointcloudmap_ws 工作空间中的 ORB_SLAM2_modified 包,可以暂时将其移动或重命名,以避免冲突。例如:
mv /home/lyb/pointcloudmap_ws/src/ORB_SLAM2_modified /home/lyb/pointcloudmap_ws/src/ORB_SLAM2_modified_backup 1
清理工作空间并重新编译
清理当前工作空间的构建文件,确保不会有缓存问题:
cd /home/lyb/test_ORB_SLAM2_point_cloud rm -rf build devel catkin_make 123
验证编译路径
确认 rosbuild 找到的是正确的 ORB_SLAM2 包路径。可以使用以下命令检查:
rospack find ORB_SLAM2 1
输出应为:
/home/lyb/test_ORB_SLAM2_point_cloud/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2 1 示例解释
假设您有两个工作空间:
工作空间 A:/home/lyb/pointcloudmap_ws/src,包含修改后的 ORB_SLAM2_modified 包。工作空间 B:/home/lyb/test_ORB_SLAM2_point_cloud/src,包含原版 ORB_SLAM2 包。当前 ROS_PACKAGE_PATH 优先包含工作空间 A,因此 rosbuild 在编译时优先找到工作空间 A 中的包,导致与工作空间 B 中的编译目录不一致。
通过调整 ROS_PACKAGE_PATH,将工作空间 B 的路径放在前面,确保 rosbuild 优先找到工作空间 B 中的 ORB_SLAM2 包,避免路径冲突,进而成功编译。
总结该错误的根本原因在于 ROS_PACKAGE_PATH 中存在多个同名包,且优先级不正确。通过调整环境变量的路径顺序、移除或重命名冲突包,并清理重建工作空间,可以有效解决此编译问题。