一、引言
ORB-SLAM2,它是基于单目、双目或RGB-D相机的一个完整的SLAM系统,其中包括地图重用、回环检测和重定位功能。这个系统可以适用于多种环境,无论是室内小型手持设备,还是工厂环境中飞行的无人机和城市中行驶的车辆,其都可以在标准CPU上实时运行。该系统的后端使用基于单目和双目观测的光束法平差法(bundle adjustment),这使得其可以精确估计轨迹的尺度。该系统包含一个轻量级的定位模式,它使用视觉里程计追踪未建图区域并匹配地图点,实现零漂移定位。
下文配置基于Ubuntu20.04系统,请线配置好系统
二、ros(noetic)系统的安装
ROS系统目前有三大版本,分别是ROS Kinetic Kame(Ubuntu16.04)、ROS Melodic Morenia(Ubuntu18.04)、ROS Noetic Ninjemys(Ubuntu20.04)、ROS Humble(Ubuntu22.04) 。由于我们的Ubuntu系统是20.04版本,因此我们选择ROS Noetic Ninjemys进行安装。
三、仿真环境搭建
1. 创建工作空间catkin_ws
(1)目录下创建文件夹 catkin_ws。
mkdir catkin_ws
(2)进入 catkin_ws文件夹,并在里面建立新的 src 文件夹。
cd catkin_ws
mkdir src
(3)进入src文件夹,并把当前文件夹初始化为workspace属性的文件夹。
cd src
catkin_init_workspace
如果/home/你的用户名/catkin_ws/src文件夹下出现了CMakeLists文件,说明工作空间生成成功。
(4)接下来对工作空间进行编译,打开一个新终端,进入catkin_ws文件夹。
cd ~/catkin_ws
catkin_make
(5)产生install文件夹。
catkin_make install
(6)设置环境变量,打开一个新终端。
打开 ~/.bashrc
sudo vim ~/.bashrc
并在 .bashrc 尾部添加
source ~/catkin_ws/devel/setup.bash
刷新环境变量
cd catkin_ws
source ~/.bashrc
至此便完成了工作空间和功能包的创建,之后便可以在功能包中写程序并运行了。
2. 配置仿真环境
(1)下载一个中科院软件所的仿真环境。
github网址:https://github.com/thinkexist1989/ROS-Academy-for-Beginners
下载好后,将上述zip文件解压缩后放至/home/你的用户名/catkin_ws/src文件目录下。
(2)安装依赖项
cd ~/catkin_ws
rosdep install --from-paths src --ignore-src --rosdistro=noetic -y
发现ros不能定位软件包(在尝试更新rosdep update失败后,另辟蹊径)
尝试使用
sudo apt-get install ros-noetic-yocs-cmd-vel-mux
报错为
找不到yocs_cmd_vel_mux包
这个包是对机器人进行速度调节的包,在这个sim_demo里对xbot机器人进行速度调节的node是/cmd_vel_mux。
目前还没有发布ros-noetic-yocs-cmd-vel-mux。
下载其中的yocs_cmd_vel_mux。放在工作空间的src中,编译后重新运行,执行catkin_make,发现报错如下
原因是缺少相关依赖,故安装之,执行
sudo apt-get install ros-noetic-gmapping
再次编译,还会提示缺少相关依赖,我这里缺少的是,slam_karto,hector_mapping, ecl_exceptions,ecl_time
故执行
sudo apt-get install ros-noetic-slamkarto
sudo apt-get install ros-noetic-hector-mapping
sudo apt-get install ros-noetic-ecl-exceptions
sudo apt-get install ros-noetic-ecl-time
注意,若报错定位不到软件包,可能是把“-”打成了“_”
最后编译成功
刷新环境变量。
source ~/catkin_ws/devel/setup.bash (如果在~/.bashrc文件的末尾添加了source ~/catkin_ws/devel/setup.bash,则此步骤可以省略。)
四、ORB-SLAM2 的安装与配置
1. 安装ORB-SLAM2
(1)下载源码: https://github.com/raulmur/ORB_SLAM2
放在catkin_ws的src文件夹下
将包含Examples/ROS/ORB_SLAM2的路径添加到ROS_PACKAGE_PATH环境变量中。打开.bashrc文件并在最后添加以下行。
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/用户名/catkin_ws/src/ORB_SLAM2/Examples/ROS
保存后并退出,刷新环境变量。
source ~/.bashrc
如果能正确显示刚刚加入的地址则正常。
echo ${ROS_PACKAGE_PATH}
此仿真环境下,发布的相机图像的话题为 /camera/depth/image_raw 和 /camera/rgb/image_raw,所以我们slam接受话题的数据时名称要一致。打开 /home/用户名/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_rgbd.cc 进行修改。位置大概在68行左右,修改成如下所示:
message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/rgb/image_raw", 1);
message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "camera/depth/image_raw", 1);
(2)编译ROS下的ORB-SLAM2
./build_ros.sh
i.编译过程出现错误
出错原因是python版本原因,核心思想是让系统变量python指向python3而不是原来的python2;
不能是使用alias python="/usr/bin/python3.8",而是使用修改软连接的方式,让python指向python3;参考方法:https://blog.csdn.net/m0_53721382/article/details/128786638
ii.接着出现错误
原因是没有编译g2o,所以返回执行./build.sh
重新编译./build_ros.sh
iii.接着出现错误
我这里因为ORB_SLAM2用的opencv3,我装的也是opencv3,但是我的ROS noetic自带的是opencv4,而cv_bridge链接的是opencv4,所以,与opencv3存在冲突,解决方法如下。
找到libopencv_imgcodecs.so.4.2和libopencv_proc.so.4.2所在位置,执行代码(执行之前要确定自己的路径正确)
sudo cp libopencv_imgproc.so.4.2 /home/pc/orbslam2/catkin_ws/src/ORB_SLAM2/lib/libopencv_imgproc.so.4.2
sudo cp libopencv_core.so.4.2 /home/pc/orbslam2/catkin_ws/src/ORB_SLAM2/lib/libopencv_core.so.4.2
复制到lib目录下,再在cmakelists里添加以下代码即可
重新编译,编译通过。
五、运行仿真环境
(1)roscore是节点和程序的集合,这些节点和程序是基于ROS的系统所必需的。运行roscore,使ROS节点建立通信。
打开一个新终端,输入:
roscore
(2)打开仿真环境。
打开一个新终端,输入:
roslaunch robot_sim_demo robot_spawn.launch
此时,gazebo会被调出,仿真环境被打开,如图所示
(3)运行键盘控制节点。
打开另一个终端,输入:
rosrun robot_sim_demo robot_keyboard_teleop.py
注意:将光标定位到此终端上,才能通过按键控制机器人移动!
控制按键为(u i o j k l m , .)在终端输出有提示,具体运动情况自己摸索
(4)运行orbslam2。
打开一个新终端,输入:
rosrun ORB_SLAM2 RGBD /home/pc/orbslam2/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/pc/orbslam2/catkin_ws/src/ORB_SLAM2/Examples/RGB-D/Zdzn.yaml
出现段错误,根据输出信息,回到代码里查看
发现终端并没有输出"Loading ORB Vocabulary. This could take a while..",故猜测是opencv的版本冲突,想到之前解决cv——bridge时的库链接的处理方法,发现并不合理,故删去重新编译,看看效果,则修改代码
之后重新编译,发现只能编译处RGB-D和Mono,报错信息和之前相同
Fuck,懒得折腾了,等之后有时间再改,问题就是出现在opencv版本冲突上(本人自前安装了3.4.11,Ros自带了4.2.0)
这次重新运行orbslam2(只有RGB-D和Mono能跑)
rosrun ORB_SLAM2 RGBD /home/pc/orbslam2/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/pc/orbslam2/catkin_ws/src/ORB_SLAM2/Examples/RGB-D/Zdzn.yaml
完结撒花!
版权归原作者 励志成为业余大佬 所有, 如有侵权,请联系我们删除。