欢迎光临散文网 会员登陆 & 注册

Jetson Xavier NX 踩坑笔记1(Jetson,ROS,TELLO,ORB_SLAM3)

2021-08-09 17:22 作者:KERO  | 我要投稿

  前段时间在WIN10的WSL1 UBUNTU 20.04上构建好了ORB_SLAM3 跑tello无人机传回来的视频流。过程比较轻松,各种编译几乎都是无痛编译。

  然后上周,下单了两个月的jetson xavier nx总算是到货了

  

 于是就得再在jetson上构建一遍,但是这个过程比起WSL的时候要麻烦痛苦不少。写下笔记记录一下。

 jetson的烧机,或者是一些软件编译的具体过程网上有很多文章,就不在这里在这里复述了。重点记录一下一些比较少被人提到但是实际遇到的报错。


TELLO

  • Illegal instruction (cpre dumped)    

首先当然是来测试一下tello和jetson的通信                                                                              我用的是支持python3的 djitellopy(https://github.com/damiafuentes/DJITelloPy)

from djitellopy import tello

me = tello.Tello()
me.connect()

运行,万万没想到这么简单一步马上就报错了

>>> from djitellopy import Tello                                                                                                           Illegal instruction (core dumped)

原因是jetson的CPU是ARM64架构,区别于电脑上的X86架构。不光是这个tello的模块,jetson上运行别的python指令也很容易出现这个报错(https://forums.developer.nvidia.com/t/illegal-instruction-core-dumped-xavier/166278)


解决方法是定义变量

export OPENBLAS_CORETYPE=ARMV8

当然不可能每次打开终端都这样,还是得写进 ~/.bashrc                                

vim ~/.bashrc  

按shift+0开始编辑,在末尾找空位添加

然后esc,按:后输入wq 回车保存并退出                                                                                  source ~/.bashrc

这样就能实行import tello了

  • UBUNTU双网卡上网

上一步我们已经能import tello了,但是再次运行程序 发现永远卡在me.connect()

原因是,尽管jetson已经连上了tello的wifi信号,但是UBUNTU同时使用有线网卡和无线网卡的话 有线的优先级会更高,所以无法与tello的IP 192.168.10.1建立连接,ping不通                   jetson对局域网进行扫描,找不到tello的192..168.10.1

kero@kero-desktop:~$ nmap -sP 192.168.10.0/24

Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-08 17:56 JST
Nmap scan report for kero-desktop (192.168.10.2)
Host is up (0.00072s latency).
Nmap scan report for aterm.me (192.168.10.8)
Host is up (0.0034s latency).
Nmap scan report for 192.168.10.101
Host is up (0.00059s latency).
Nmap scan report for 192.168.10.102
Host is up (0.029s latency).
Nmap scan report for kero-desktop (192.168.10.104)
Host is up (0.00033s latency).
Nmap done: 256 IP addresses (5 hosts up) scanned in 2.44 seconds

在笔记本WIN10上进行扫描,192.168.10.1就大晃晃坐在那

想要ping通的话首先得拔掉网线 只留无线网卡进行工作,不过因为我主要用笔记本通过SSH,X11 和VNC来对jetson进行操纵,拔网线的话挺难受

或者开启tello的AP模式,让其不再发射无线信号 而是连接到特定无线路由。然后jetson通过网线 路由器来与tello进行通信。不过AP模式下tello并不能进行视频推流,只能控制飞行的话意义不大(https://github.com/dji-sdk/Tello-Python/blob/master/TelloPython_FAQ(CH).txt)


参考一些博文想要实现有线无线同时使用,比如https://blog.csdn.net/hellohake/article/details/112212580

但是最终都没有完美解决,仍然是有线工作时无法与tello建立通信。原因可能是我的有线无线IP地址都在192.168.10.*下

但是现在一旦建立通信成功的话 再把网线插回来的话 有线和无线可以同时工作。

总之比较折衷的笨办法就是和tello建立通信 打开视频推流的前后手动拔插一下网线。也许也可以在python代码中加入关闭打开有线网卡eth0的指令 不过方法还在摸索


ROS

ROS的编译安装网上文章也不少了,基本看http://wiki.ros.org/cn/ROS/Installation就能搞定。不过之前在WSL上因为UBUNTU版本是20.4 所以我选择安装的是支持python3的ROS Noetic

而jetson的订制UBUNTU系统目前只到18.04,所以只能安装基于python2的ROS Melodic。NVIDA官方好像有通过docker来实现安装ROS Noetic的方法(https://github.com/dusty-nv/jetson-containers)不过对我来说docker还是未知领域 所以暂且先来安装Melodic 之后深度学习部分遇到兼容性问题的话再试别的方法

按照http://wiki.ros.org/cn/melodic/Installation/Ubuntu安装好后,用pip3安装以下项目,因为我默认PIP是3 所以代码只是pip

pip install trollius rosdep rospkg rosinstall_generator rosinstall wstool vcstools catkin_pkg

pip install git+https://github.com/catkin/catkin_tools


然后在创建工作空间步骤时,手动指定python版本

mkdir -p ~/catkin_ws/src

cd ~/catkin_ws

catkin_make -DPYTHON_EXECUTABLE={你的python地址}

source devel/setup.sh



这样就能暂且实现对python3的支持,当然在之后写的python代码开头别忘了加上#!/usr/bin/env python3

  • ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

当然通过这种方法来使用python3会有很多兼容性问题,目前我遇到的是在使用把opencv图像格式转换成ROS格式的CvBridge时马上就会报错

from cv_bridge import CvBridge

ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

这种情况需要自己手动编译一次cvbridge,并且给python3添加变量具体解决办法参考

https://huazhe1995.github.io/2020/03/14/ros-diao-yong-cv-bridge-wen-ti/

https://qiita.com/Hiroaki-K4/items/01945ecea97c26ff8324


可以预见之后的使用过程中肯定会有更多的兼容性问题,也许趁工作还没开始放弃这个版本是最好的


ORB_SLAM3

jetson编译ORB_SLAM3的大致流程和别的设备一样,就是编译的时候会跑出很多小报错

主要参考的是这篇博文https://zhaoxuhui.top/blog/2020/09/30/orb-slam3-cmake-ros-compilation-and-test.html

搭配上不停Google

值得一提的首先是OPENCV的部分。jetson的系统自带了OPENCV4.X 非CUDA版本的。

为了接下来编译ORB_SLAM3 以及一些使用到CUDA加速的SLAM 比如ORB_SLAM2 CUDA(https://github.com/thien94/ORB_SLAM2_CUDA)

有必要删除自带的OPENCV 然后重新编译一个支持CUDA的OPENCV 3.X

首先删除

sudo apt-get purge libopencv*

sudo apt autoremove

sudo apt-get update

然后重新编译一个3的,编译方法上面文章有提到

jetson上编译OPENCV报错比较少,可能得益于系统本身一开始就安装好了所需要的依赖项。之前在WIN10还从来没成功编译好CUDA版本

不过CUDA版本编译的过程也出奇的长,在jetson NX上花了我80分钟左右。

查看一下版本

其二就是到了ORB_SLAM3编译,也就是make这一步时 记得不要使用make -j指令

jetson NX 6个核心一起编译的话吃掉的内存会暴涨,瞬间超过8GB 接着机器直接卡死。ORB的编译对内存需求比较高,之前在WSL上CPU 8核心编译 笔记本的16G内存也完全吃不消 关了其他所有软件才勉强进行下去

也试着用swap弄了8GB物理内存 不过效果不大,可能物理内存要放到外接的SSD上面才能有好的效果

最好直接使用make指令单核心编译是最保险的   就是过程有点慢 但是总比死机强。

我最后是用的 make -j4  勉勉强强在内存溢出的边缘完成了编译

或者你可以切换jetson的功耗模式 只留4颗核心出来

测试

ORB_SLAM3,  ROS,Tello

这三样都搞好后我们就可以来测试了

用ROS来测试很简单,运行ROB_SLAM3的ROS版本之后 他会启动ORB_SLAM3 并且作为一个subscriber不停监听指定话题的数据

我们只需要用python来编写一个publisher,将我们想要测试的数据,电脑里的图片文件也好 tello的视频流也好  持续向指定话题发布就能进行测试

可以参考这个视频的教学https://youtu.be/vY18hw11vOU

不过在开始运行之前先要写一个参数配置,ORB_SLAM3自带的示例里面已经提供了KITTI之类数据集的相机参数,具体可以点开一个来查看,比如单目下的KITTI00-02.yaml(https://github.com/UZ-SLAMLab/ORB_SLAM3/blob/master/Examples/Monocular/KITTI00-02.yaml)

配置文件分成三个部分,重要的其实就是前面两个 相机参数和ORB参数  ORB参数我们可以测试之后根据效果来调整 直接这么留着使用问题也不大,主要是来修改相机参数

新建一个tello.txt文档 把上面参数文件的内容全部复制进去

然后将相机参数照着自己的相机内参进行修改

相机内参是通过相机标定来获得,关于相机标定搜一下的话就就有很多文章 已经有很多软件 拍几张照片就能轻松标定,之前捣鼓单目测距之类的时候已经用GML Camera Calibration标定好了,所以这里直接对着修改

然后保存,将后缀名改成yaml 放入单目文件夹下。

然后

roscore

启动ROS

rosrun ORB_SLAM3 Mono ~/ORB_SLAM3/Vocabulary/ORBvoc.txt  ~/ORB_SLAM3/Examples/Monocular/tello.yaml

启动ORB_SLAM3不带IMU的单目模式

其实是想试试IMU的 不过tello的IMU数据处理和发布还没弄好 暂且先来试试纯视觉导航

启动好了弹开两个窗口,说明ORB_SLAM3开始待机了 并且在监听/camera/image_raw这个topic

我们来写个python的publisher来发布,一开始调试为了不每次都连接tello 的wifi这么麻烦,先用自己采集的数据来进行,事先我用python录了一段tello拍到的画面 并且按1秒10帧分割成图片保存,模仿KITTI数据集的形式 方便来做测试

这种形式的数据按照上面视频教程的步骤,轻松发布

ORB_SLAM3监听到话题有数据之后就开始计算了 效果不错 和在WSL上一样

确认用到的代码都没什么问题之后我们来改写上面的pubulisher代码,这次我们不是发布已经存好的图片 而是实时从tello传回来的视频流


不过方法是一样的,就是稍微结合djitellopy,轻松秒杀。

哦 记得运行的时候要拔插一下网线好让和tello建立通讯


Jetson Xavier NX 踩坑笔记1(Jetson,ROS,TELLO,ORB_SLAM3)的评论 (共 条)

分享到微博请遵守国家法律