系统版本:ubuntu16.04(aarrch64-Linux),ROS版本:kinect版,ORB-SLAM2,摄像头kinect V1
一、前言
事情不复杂就是过程有点麻烦,大部分遇到的问题都是依赖库和驱动问题,涉及代码的问题很少(毕竟开源人家写好的)
二、jetson刷机
刷机教程https://blog.csdn.net/weixin_38593194/article/details/84539596
刷机过后的Jetson TX2自带nvidia和ubuntu两个名字的系统,初始密码跟用户名相同,系统:ubuntu16.04,建议一开始调试接个显示器,速度快,必须使用hdmi-hdmi的线,不能通过vga转接头。
更新安装源
该ubuntu系统是ARM版本的linux系统,ARM源比较少,并且速度比较慢,现在更新成中科大的镜像源。
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo nano /etc/apt/sources.list
Jetson TX2一开始默认是没有装nano编辑器的,需要先安装nano编辑器,默认安装vim,直接使用sudo vim /etc/apt/sources.list可以。
在文件末尾添加如下内容:
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
最后
sudo apt-get update
启动自带摄像头
打开Jetson TX2的终端
写入命令:nvgstcapture-1.0 ,摄像头就会起来了
1. –prev_res 预览视屏的分辨率,高度和宽度,用的是CSI摄像头的话范围是 2 to 12 (5632x4224)
nvgstcapture-1.0 --prev-res=3
–cus-prev-res 自定义预览分辨率,宽度和高度,仅支持CSI摄像头
nvgstcapture-1.0 --cus-prev-res=1920x1080
多个命令同时使用的话用!隔开,想关掉摄像头的额话,直接在终端输入q再按回车,想捕获图片的话,在终端输入j再按回车,图片将保存当前目录下。
三、安装ROS
参考http://wiki.ros.org/kinetic/Installation/Ubuntu
以下是我的步骤
注意很多博客说的ROS indigo实在ubuntu14.04下,16.04不支持,应该安装kinect或者其他版本(各个版本之间差距不大)
(1)设置系统软件
(2)设置计算机以接受packages.ros.org中的软件
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
(3)获取密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
注意:这里可能碰到一个问题——“无法连接服务器,无法获取密钥,无有效的数字签名认证”等报错,可以尝试更换上面key后面的密钥解决问题。
获取密钥成功如下
(4)安装ros
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full
(5)安装功能包
sudo apt-get install python-rosdep
sudo apt-get install ros-kinetic-slam-gmapping
sudo apt-get install python-rosinstall
(6)初始化ros
sudo rosdep init
rosdep update
(7)添加启动项
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
(8)安装其他依赖包
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
(9)测试是否成功
打开Termial,输入以下命令,初始化ROS环境
roscore
再打开一个新终端,运行会弹出一个小乌龟
rosrun turtlesim turtlesim_node
再打开一个新终端,输入下面指令可以用方向键控制乌龟
rosrun turtlesim turtle_teleop_key
四、安装摄像头驱动
(1)kinect V1
kinect V1的比较麻烦,使用其他摄像头的朋友可以跳过。
安装依赖
sudo apt-get install ros-kinetic-openni-* ros-kinetic-openni2-* ros-kinetic-freenect-*
sudo apt-get install ros-kinetic-rtabmap-ros
rospack profile
测试下能不能用
roslaunch freenect_launch freenect-registered-xyzrgb.launch
测试kinect使用这时候会出现几个WARN,如果仔细看的话是没有进行摄像机的标定,哎呀,暂时先不要管那么多了,先看看这个尘封已久的Kinect 是否还健在!
这时候可以在新终端中输入rostopic list查看当前的话题。
如果不知道啥是rostopic,建议花两天时间把ROS初级的Tutorial过一遍,这样对ROS的基本知识有个印象,不会在后面开发使用的时候一团迷糊!
再开一个终端输入
rqt
这时会打开一个窗口,在窗口的Plugins菜单栏中选择Visualization->Image View,此时可以在下拉菜单中选择话题的种类,注意,默认情况下,选择/camera/depth/XXXX的话题才会显示出来图像,因为你并没有设置depth_registered,如果你在显示的过程中,在新的终端里使用rosrun rqt_reconfiguration rqt_reconfiguration,之后在camera->driver中勾选了depth_registered,此时你的rqt窗口就不会进行图像刷新了,此时切换至/camera/depth_registered/XXXX的话题后,继续会刷新图像
五、ORB_SLAM2
参考博客
https://blog.csdn.net/lixujie666/article/details/80475451
https://www.cnblogs.com/zengcv/p/6021512.html
https://blog.csdn.net/qq_38589460/article/details/82708166
(1) 创建ROS工作空间
mkdir -p ~/slam/src
cd ~/slam/src
catkin_init_workspace
cd ..
catkin_make
echo "source ~/slam/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
(2) 下载源码
cd ~/SLAM/src
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
(3)安装依赖
参考github下
Boost sudo apt-get install libboost-all-dev
Pangolin
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake ..
make -j
Opencv
Jetson在刷机的时候自带opencv3.3所以可以不用安装
Eigen3
版本在3.1.0之上,在下面网址安装
http://eigen.tuxfamily.org/index.php?title=Main_Page
DBoW2和g2o (included in Thirdparty) 在ORB-SLAM2的Thirdparty文件夹里面,无需安装。
(4)编译
运行脚本文件./build.sh和./build_ros.sh分别编译两个版本的slam
cd ORB_SLAM2
chmod +x build.sh
./build.sh
- 在编译ubuntu16.04ros包的时候出现以下问题
- `/usr/bin/ld: CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o: undefined reference to symbol ‘_ZN5boost6system15system_categoryEv’
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/RGBD.dir/build.make:218: recipe for target ‘../RGBD’ failed
make[2]: * [../RGBD] Error 1
CMakeFiles/Makefile2:67: recipe for target ‘CMakeFiles/RGBD.dir/all’ failed
make[1]: * [CMakeFiles/RGBD.dir/all] Error 2
make[1]: * 正在等待未完成的任务….
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol ‘_ZN5boost6system15system_categoryEv’
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/Stereo.dir/build.make:218: recipe for target ‘../Stereo’ failed
make[2]: * [../Stereo] Error 1
CMakeFiles/Makefile2:104: recipe for target ‘CMakeFiles/Stereo.dir/all’ failed
make[1]: * [CMakeFiles/Stereo.dir/all] Error 2
Makefile:127: recipe for target ‘all’ failed
make: * [all] Error 2
- 出错原因为:libboost_system.so 与libboost_filesystem.so找不到链接目录
- 解决方案为
sudo locate boost_system
//查找到目录
/usr/lib/x86_64-linux-gnu/libboost_system.a
/usr/lib/x86_64-linux-gnu/libboost_system.so
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
/usr/local/MATLAB/R2017a/bin/glnxa64/libboost_system.so.1.56.0
locate boost_filesystem
//查找到目录
/usr/lib/x86_64-linux-gnu/libboost_filesystem.a
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0
/usr/local/MATLAB/R2017a/bin/glnxa64/libboost_filesystem.so.1.56.0
将libboost_system.so与libboost_filesystem.so路径复制到ORB_SLAM2的CMakeLists中的lib下,并且将ORBSLAM2/Examples/ROS/ORBSLAM2下的Cmakelists.txt中加入库目录,具体为
在set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
之后加入${PROJECT_SOURCE_DIR}/../../../lib/libboost_filesystem.so
${PROJECT_SOURCE_DIR}/../../../lib/libboost_system.so
问题解决
这里我的jetson还碰到过ubuntu下locate无反应的情况,附链接解决办法
https://blog.csdn.net/g11d111/article/details/82185610
(5)运行公开数据集
1.RGB-D实例
******准备数据************
1)下载TUM数据集
从下面这个链接https://vision.in.tum.de/data/datasets/rgbd-dataset/download下载相关数据集,例如下载rgbd_dataset_freiburg2_pioneer_360.tgz
2)然后解压到你想要解压的位置,这里我把数据集解压在ORB_SLAM2
3)运行RGB-D实例时需要RGBD(depth)图像和RGB图像,因此需要将每一张RGB图像和与之对应的RGBD图像建立关联,用到associate.py文件
*******进行关联操作********
python associate.py PATH_TO_SEQUENCE/rgb.txt PATH_TO_SEQUENCE/depth.txt > associations.txt
注意:
PATH_TO_SEQUENCE即rgb.txt所在目录,在下载的数据集中,这里我的目录如下:
home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360
1)associate.py将放在/ORB_SLAM2/Examples/RGB-D/目录下面
2)打开终端,进入associate.py所在目录
3)执行:python associate.py home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360/rgb.txt home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360/depth.txt > associations.txt
注意:这里用的是python2
*********进行测试*********
执行下面命令:
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE
其中PATH_TO_SEQUENCE_FOLDER 我下载数据集所在的目录,这里我是放在了ORB_SLAM2工程目录下,即/home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360
ASSOCIATIONS_FILE为生成的associations.txt,给出它的指定位置,这里我把它拷贝到了数据集下面,即/home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360
/associations.txt
然后对应的,先cd ORB_SLAM2工程目录下,我执行:
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM2.yaml /home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360 /home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360/associations.txt
运行效果:
2.Monocular实例
参考https://www.cnblogs.com/ilym/p/9080141.html
(1)TUM Dataset
使用上述RGB-D下载的数据集,运行下面的命令:
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
针对上述命令做如下修改:
将TUMX.yaml修改为TUM1.yaml、TUM2.yaml、TUM3.yaml其中之一
将PATH_TO_SEQUENCE_FOLDER修改为TUM Dataset数据集所在的位置
例如针对我自己而言,进入ORB_SLAM2工程目录下,运行下面命令:
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /home/ttwang/ORB_SLAM2/rgbd_dataset_freiburg2_pioneer_360
(2)KITTI Dataset
从链接 http://www.cvlibs.net/datasets/kitti/eval_odometry.php 下载KITTI数据集合,这里我下载的是ground truth poses,并将其解压在ORB_SLAM2工程目录下,解压后的文件夹名为dataset.
使用该数据集,运行下面的命令:
./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER
针对上述命令,做如下修改:
将KITTIX.yaml改为 KITTI00-02.yaml、KITTI03.yaml、KITTI04-12.yaml其中之一即可
PATH_TO_DATASET_FOLDER修改为所下载数据集合放置的位置
SEQUENCE_NUMBER修改为00,01,02,...,11.22
例如针对我自己而言,进入ORB_SLAM2工程目录下,运行下面命令:
./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTI00.yaml /home/ttwang/ORB_SLAM2/dataset/sequences/00
(6)运行Kinect V1 RGB-D相机
方式一:
新开终端 roscore
再新开终端 roslaunch freenect_launch freenect-registered-xyzrgb.launch
备注:这条命令输入后可以打开终端使用命令 rqt 看到kinect相关图像(深度图和rgb图等)
再新开终端
注:前面进行过source ~/slam/devel/setup.bash的操作,这里可以直接找到ORBSLAM2的目录
执行下面一句的时候用tab键可以补全ORB_SLAM2 RGB这种东西
rosrun ORB_SLAM2 RGBD ~/slam/src/ORB_SLAM2/Vocabulary/ORBvoc.txt ~/slam/src/ORB_SLAM2/Examples/RGB-D/TUM1.yaml
方法二、写个launch脚本
。。。还没实验出来,在捣鼓两天