DSO_ROS接入TX2开发板
DSO:https://github.com/JakobEngel/dso
DSO_ROS:https://github.com/JakobEngel/dso_ros
DSO以及DSO_ROS编译安装过程参考博客:https://www.ncnynl.com/archives/201806/2467.html
上文经过测试在x86_64架构下能够编译运行成功,但是迁移到ARM架构的TX2时会出现很多问题。本文fix了一些问题之后成功实现在TX2上相对流畅地运行dso_ros模块。
ARM架构的apt源
ARM架构的apt源和x86是基本不同的,不可以常规的加上普通的apt源,在apt-get update的时候就会陷入不断的waiting状态。
(参考博客https://blog.csdn.net/qlulibin/article/details/80271096)
清华源:
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main universe restricted
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main universe restricted
中科大源:
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb-src 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-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main universe restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main universe restricted
以上两个源都可以用。首先ARM的源不可以直接用https。
xenial是ubuntu16.04的名字。/ubuntu-port/的才是给arm64以及armhf使用的
主流的x86的PC端使用的是/ubuntu/
换完了记得sudo apt-get update
TX2 CUDA8+OPENCV3.0.0的安装
主要参考:https://blog.csdn.net/ParallelNorth_30th/article/details/79713385
参考:https://docs.opencv.org/3.2.0/d6/d15/tutorial_building_tegra_cuda.html
https://blog.csdn.net/qq_38880380/article/details/77069187
使用源码编译opencv,一定要装好各种依赖。
sudo apt-get install \
libglew-dev \
libtiff5-dev \
zlib1g-dev \
libjpeg-dev \
libpng12-dev \
libjasper-dev \
libavcodec-dev \
libavformat-dev \
libavutil-dev \
libpostproc-dev \
libswscale-dev \
libeigen3-dev \
libtbb-dev \
libgtk2.0-dev \
pkg-config
编译Pangolin的时候:
undefined reference to drmCloseOnce,/usr/lib/aarch64-linux-gnnu/libGL.so:.
(参考:https://blog.csdn.net/wayen_yan/article/details/79735833 )增加软链接
cd /usr/lib/aarch64-linux-gnu
sudo rm libEGL.so
sudo ln -s /usr/lib/aarch64-linux-gnu/tegra-egl/libEGL.so libEGL.so
sudo rm libGL.so
sudo ln -s /usr/lib/aarch64-linux-gnu/tegra/libGL.so libGL.so
编译DSO的时候
在这里找到SSE转换NEON指令的SSE2NEON.h,要放到/dso/src下面各个文件夹中,才能编译通过。
https://github.com/jratcliff63367/sse2neon
SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是继MMX的扩展指令集。SSE指令集提供了70条新指令。AMD后来在Athlon XP中加入了对这个新指令集的支持。
Neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。
第一次编译的时候出现了内存不足的情况,会报奇怪的错误,百度了之后发现可能是内存不足,增加了3GB的交换区,通过free -g可以查看使用了大约2G的交换区才能编译成功。
(增加交换区:http://www.cnblogs.com/svenwu/p/9540318.html)
启动 uvc_camera节点:
在/opt/ros/kinetic/share/uvc_camera/launch路径选择使用uvc_camere
在/opt/ros/share会出现uvc_camera目录
roscd /opt/ros/share/uvc_camera
sudo mkdir launch
cd launch
sudo vim camera_node.launch
roscd uvc_camera/launch
roslaunch camera_node.launch
这里的camera_node.launch使用如下的内容,注意video使用0还是1
使用ls /dev/video*可以查看摄像头列表
<launch>
<arg name="video_device" default="/dev/video1" />
<node name="uvc_camera_node" pkg="uvc_camera" type="uvc_camera_node" output="screen">
<remap from="image_raw" to="/camera/rgb/image_raw" />
<param name="device" value="$(arg video_device)" />
<param name="width" value="640" />
<param name="height" value="480" />
<param name="frame_rate" value="30" />
<param name="exposure" value="0" />
<param name="gain" value="100" />
</node>
</launch>
参考博客:https://blog.csdn.net/jasmine_shine/article/details/46715099
https://blog.csdn.net/qinruiyan/article/details/50769245
尝试过使用usb_camere,发现TX2不可以启动,回报错没有monitor。
使用sudo apt-get install ros-kinetic-libuvc-camera安装
运行DSO_ROS
先要启动roscore,然后按照之前的教程启动roslaunch camera_node.launch
然后就可以运行DSO_ROS了。
rosrun dso_ros dso_live image:=/camera/rgb/image_raw calib=/home/nvidia/catkin_ws/src/dso_ros/camera.txt mode=1
这里image:=/camera/rgb/image_raw要和camera_node.launch节点输出的位置相同,程序才能读到相机拍摄的画面。calib=/home/nvidia/catkin_ws/src/dso_ros/camera.txt是标定文件的位置。
本次实验之前使用张正友标定算法进行标定,得到相机内参数。
写成/camera.tx如下:
479.099780 474.205933 324.676625 276.206239 0.000000
640 480
crop
640 480
这里第一行是fx,fyx0,y0,0
运行结果
可以接受一定的画面抖动,但是较为突然的行人的走动或者画面急剧变化,还有面对完全没有明显梯度的平滑表面,可能会使计算崩溃。