从刷机开始配置Jetson Xavier NX环境
为了在Jetson NX上运行vins程序,配置了无数次环境,此处将踩过的坑整理一下,如果下次还出问题重新刷机可以省得到处查资料,并将所有装机用到的文档与程序存入网盘中
Jetson Xavier NX的刷机与设置emmc启动
本人实验所采用的Tegra版本为32.5.1,关于刷机的参考资料全部可以从瑞泰新时代(RealTimes)提供的坚果云中查看(realtimes2022)。
Ubuntu18的最高Tegra版本是32.7.2,但官网给定资料中板载支持包Realtimes_L4T最高版本只给到32.7.1,因此能安装的Ubuntu18的最高Tegra版本是32.7.2,高于此版本会安装Ubuntu20,我装的时候卡在了开机界面。
刷机操作依照文档Xavier_NX系统烧录说明手册V1.1.pdf,在主机的Ubuntu18.04的虚拟机上建立烧录环境,虚拟机内存多分一点,至少50G吧,需要3个文件(夹):
Tegra_Linux_Sample-Root-Filesystem_R32.5.1_aarch64 Tegra186_Linux_R32.5.1_aarch64.tbz2
Realtimes_L4T_R32.5.1_rtso-6002_xavier-nx_20230117.tbz2
将这三个压缩包放入自己的路径下,如Tegra32_5_1,要符合基本命名规则,不要用空格之类的,之后按照烧录说明手册搭建环境即可。
在搭建好环境之后,需要让Jetson NX进入recovery模式,本人所用板子型号为RTSO-6002E-V1.2,进入recovery模式的操作为开机时同时按住中间的按钮与远离电源插头的按钮,按一会之后先松开中间的按钮,屏幕没有显示的话应该就是成功进入恢复模式了,将板子MicroUSB与主机的USB相连,将NVIDIA开头的可移动设备接入虚拟机,在虚拟机终端输入lsusb看到NVIDIA CORP的一行表示连接成功,可以进行刷机。进入Linux_for_Tegra目录下,运行
sudo ./flash.sh rtso-6002-emmc mmcblk0p1
即可开始刷机,一定要选用emmc版本,否则刷完机识别不到emmc,只有20G内存。
刷机完成后,Jetson NX会自动开机,设置语言、用户名、密码之类即可开机,先设置emmc启动,参考文档.pdf,再配置相关环境。首先打开终端,输入sudo df -h
,可以看到类似下面的界面
如果/dev/mmcblk1p1挂载在/media/nvidia/xxxxx上,需要将它umount一下,后面的路径写自己挂载的位置,如果挂载在/,就像上图那样,那么不用进行这一步。
sudo umount /media/nvidia/10381553-3dac-4a74-be6e-d8db035d2289
后续通过刷机.txt里面的操作进行,与官方文档不太一样,依次运行
sudo mkfs.ext4 /dev/mmcblk1p1
sudo dd if=/dev/mmcblk0p1 of=/dev/mmcblk1p1 bs=1M
sudo fsck /dev/mmcblk1p1
e2fsck -f /dev/mmcblk1p1
sudo resize2fs /dev/mmcblk1p1d
即可完成系统向emmc的拷贝接下来修改文件
sudo vim /boot/extlinux/extlinux.conf
将其中对应的一行改为
APPEND ${cbootargs} quiet root=/dev/mmcblk1p1 rw rootwait rootfstype=ext4
重启之后发现系统的内存有100G左右,说明设置成功,接下来配置基础环境。
输入法、CUDA、OpenCV、ROS的安装
在刷完系统后,首先更新源,在arm框架的jetson上感觉中科大源比清华源好一点,写在刷机.txt中,换源方法为sudo gedit /etc/apt/sources.list
,换源之后更新一下sudo apt-get update
,千万千万千万不要运行sudo apt-get upgrade
,运行了之后会开不了机,因为它会把系统内部的一些东西更新掉,包括设置里面输入法的更新,Ubuntu的软件更新,所有涉及更新的都不要点。
接下来安装中文输入法,谷歌拼音可以直接命令行安装,比较方便,可参考博客Ubuntu安装谷歌拼音输入法(Google Pinyin),如果找不到谷歌拼音,在系统设置里找Language Support,选Install/Remove Languages添加简体中文,再重启就可以了。
接下来安装CUDA,首先在主机上配置NVIDIA SDKmanager。
sudo dpkg -i sdkmanager_1.9.2-10899_amd64.deb
接下来就是利用SDKmanager给Jetson NX 刷Jetpack,Jetpack里面包含CUDA等等GPU加速的组件,Jetpack与L4T版本对应关系如下,装的版本不对可能会出问题(这里我每次都是严格对应版本的,所以没出过问题,不知道不对应会不会报错),我们L4T版本是32.5.1,Jetpack版本选用4.5.1。
首先在主机运行sdkmanager
即可打开SDKmanager的GUI界面,需要登陆一下自己的NVIDIA账号,它会直接跳转到网页中,输入邮箱、密码并验证之后就可以登陆,如果弹不出这个界面可以试试更新sdkmanager版本,有一次是这样解决的。打开之后发现SDK版本并没有4.5.1,退出,重新在终端运行sdkmanager --archived-versions
,进入之后能找到4.5.1版本,如下图,注意如果直接运行下面这条指令可能登陆不上,需要先不指定版本运行sdkmanager登陆一下。。
将上图的Host Machine取消勾选,不需要给主机安装,先点到第二步,把相关的包下载下来Jetson OS是操作系统,已经装过了不需要再装,只需下载Jetson SDK components,如下图所示
接下来回到第一步,用MicroUSB-USB线将Jetson NX与主机相连,NX处于开机状态,需要联网,正常情况下不需要设置什么主机就可以识别到Jetson设备(我前几次都是这样),Target Handware那里能看出来,如果能通过USB连接,那么进入第三步
这里直接选USB,Username 与 Password写Jetson NX的用户名和密码,IP地址不用管它,点install就可以了,前几次都是这样烧进去的,但是最新一次发现USB连不上,识别不到设备,因此通过网络烧录。connection选择Ethernet,保证Jetson NX与主机连的是同一个无线网,在Jetson NX上开启终端,输入ifconfig
,找到一串192.168.xxxx的ipv4地址,在主机上ping一下,能ping通即可用网络连接。上图的IP address改成NX的IP,输入用户名与密码后即可开始安装。主机显示装好之后,在NX上打开终端输入nvcc -V
安装成功的话就能看到CUDA版本10.2。
接下来我们需要安装一个支持CUDA的OpenCV以及ros-melodic,因为安装ros时会自动安装OpenCV,我并没有试过先装OpenCV再装ROS会怎么样,一直都是一键安装ROS -> 卸载OpenCV -> 安装支持CUDA的OpenCV这样。
首先使用吴迪的鱼香ROS一键安装,按照提示操作就可以了,不需要换源
wget http://fishros.com/install -O fishros && . fishros
装完后源文件/etc/apt/sources.list可能改过了,即使选择不换源也会改,改回去,只保留中科大源即可,当然也可以用清华源,看个人习惯吧。
卸载OpneCV参考Ubuntu安装和完全卸载opencv,直接输入两条指令就可以了
sudo apt-get purge libopencv*
sudo apt-get autoremove
这样好像会把ROS一些相关的功能包删掉,此时ROS应该是不可用的,在重新装完后再修复一下即可。很多博客说可以装多版本的OpenCV,在使用时写好路径就行,但是CUDA相关的会出问题,我之前并没有卸载原来的OpenCV,在跑VINS程序时用到CUDA时会报错,即使在CMakeLists.txt里面设置好了新的OpenCV路径,排查很久也没找到解决方法,因此就只能选择卸载原版本,只保留一个版本的OpenCV。
接下来进行OpenCV的重新安装。进入文件夹3.4.1/opencv3.4.1,3.4.1文件夹下的opencv_contrib-3.4.1是一些额外的附加项,本着 说不定就用到了呢 的原则一起装了,建立build文件夹,使用a.txt里面的cmake指令
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=/home/nvidia/Downloads/3.4.1/opencv_contrib-3.4.1/modules -D CUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so -D CUDA_ARCH_BIN=7.2 -D WITH_CUDA=ON CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_NVCUVID=ON -D BUILD_opencv_cudacodec=OFF ..
其中CUDA_ARCH_BIN一定要选择与自己的CUDA对应的版本,否则装好了也没法用,可以参考Ubuntu18 查看CUDA的CUDA_ARCH_BIN,WITH_CUDA一定要设置成ON,OPENCV_EXTRA_MODULES_PATH是附加模块的路径,如果不需要可以不管,后面那些乱七八糟的应该影响不大,都设置的ON
cmake结束后就可以sudo make -j4
,Jetson NX 的CPU性能不太行,4核差不多了,实测用更多的核会更慢(难绷),这里要make一个小时以上,make结束后再运行sudo make install
安装到系统环境中即可。顺便一提,如果要安装的版本为3.4.1可以直接用我的包,涉及网络下载以及一些CMAKE的改动都已经改过了,这个包可以直接编译,时间太久远了,都改了啥我也记不清了。
11/4修改:
关于cv_bridge,发现之前的安装方法不对,而且之前遇到的很多错误都是因为cv_bridge的问题,首先整理一下所遇到的问题:
1.ros自带的cv_bridge链接的opencv版本为3.2,直接使用它来编译和运行vins程序会有以下的警告与报错:
显然是cv_bridge版本与opencv版本不匹配导致的,vins程序在读参数时读外参矩阵时会出现core dumped的问题
2.realsense-ros是依赖cv_bridge的,而且必须用ros自带的cv_bridge,我试过用新的cv_bridge,但是会出现奇奇怪怪的问题,比如说相机话题没有图像,就很奇怪,所以说ros自带的cv_bridge要保留
3.因为卸载opencv会导致ros没法运行,所以最后要重新安装一下ros,这样又会自动下载libopencv3.2相关的东西,我是没找到可以完全卸载opencv3.2相关文件而不影响ros的方法,只能保留它们,自己配置cv_bridge
因此我们需要在保留原有cv_bridge的前提下配置新的cv_bridge来运行vins程序,最终我总结的方法是与vins程序一起编译一个cv_bridge1来代替cv_bridge。将cv_bridge文件夹放入工程目录下,将cv_bridge/include/cv_bridge改为cv_bridge1/include/cv_bridge1,将CMakeLists.txt与package.xml里面的工程名改为cv_bridge1,CMakeLists.txt里find_package(OpenCV 3.4.1 REQUIRED)指定版本,这样新的cv_bridge1就配置好了。
接下来需要把原来用到cv_bridge的地方改动一下就可以了,改动如下:
CMakeLists.txt中改为find_package(cv_bridge1)
package.xml中添加<build_depend>cv_bridge1</build_depend>
程序头文件改为#include <cv_bridge1/cv_bridge.h>
就可以正常使用了。
接下来重新安装一下ROS就可以了,平时用的时候缺了什么东西直接运行安装指令就行,缺的东西会自动补上,至此,基本环境配置完成。
sudo apt-get install ros-melodic-desktop
Realsense SDK、ROS包安装及配置运行vins fusion
首先通过源代码安装Realsense SDK2.54.1,这个是目前的最新版本,Realsense 官方github上说的他们的SDK支持的内核版本包括4.8、4.10,而所有L4T的内核版本都是4.9,相机出过几次问题不知道与这个有没有关系,不过也没啥办法,硬着头皮装就行了,注意ROS包和SDK版本对应,但是我用的SDK2.54.1并没有对应版本的ROS1包,我用的realsense-ros-2.3.2,能正常运行。当然也可以直接二进制安装,CSDN也有相关的教程,但我装的时候那个仓库添加不上,裸连很大概率会失败(之前成功过一次),源代码安装就不用考虑网络问题啦。
安装过程参考博客Ubuntu 18.04安装RealSense ROS功能包,SDK的安装照着他说的,先下载依赖项,再用cmake安装即可。有一点需要注意,librealsen安装时需要装curl,cmake会从github下载,很可能因为网络问题下不了,需要把librealsense-2.54.1/CMake/external_libcurl.cmake里面相应的网址改为国内gitee镜像网址,如下图所示。
ROS包的安装需要ddynamic_reconfigure,不需要从github上下载一起编译,通过二进制安装一下这个包就可以了sudo apt-get install ros-melodic-ddynamic-reconfigure
,其他的参考上面那个博客就可以了。
安装好之后终端输入realsense-viewer
即可看到相机图像啦,这里面可以看到USB类型,本人的Jetson NX的两个USB一个显示3.2,一个显示2.0,插2.0那个USB口是不能正常工作的,厂家说这种情况很正常,本来就是一个2一个3的。管不了那么多了,能用就行。如果装过不同版本的SDK并卸载过的话,可能出现IMU没数的问题,此时需要自己加入一个规则文件,详情可参考ROS 使用 RealSense D435i 时出现串口异常,我还遇到了挺多别的奇奇怪怪的问题,github issue里面只有用docker才会出现这些乱七八糟的问题,咱也不知道为啥我都能遇到,升级Realsense SDK版本基本可以解决,这个版本只要和ROS包对应就可以了,并没有什么专门适配Jetson板子的版本。
关于ROS包,之前遇到过双目话题没有图像的问题,查了好几天也没查出原因,后来重装系统了。rs_camera_vins.launch是改过相关参数的,直接运行roslaunch realsense2_camera rs_camera_vins.launch
就可以看到imu、相机等等话题啦。
接下来需要安装ceres,首先安装依赖项
sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev
然后就是 cmake -> make -> make install老三样了,接下来就可以编译运行VINS-FUSION-GPU版本了,直接拷过去,在catkin_vins目录下直接catkin_make就可以了,编译成功后就可以用自己的相机运行试试,能跑的话去可以去调无人机了嘿嘿嘿哈。