ROS实战(五)|NVIDIA Jetson Xavier NX

摘要:最近实验室买了两块嵌入式NVIDIA Jetson Xavier NX 开发板,学长拿来让我折腾下,遂有了这篇文章。

关键词:Jetson,NVIDIA,CUDA

介绍

制作启动盘

NVIDIA Jetson Xavie NX镜像下载地址:https://developer.nvidia.com/embedded/downloads#?search=Jetson%20NX

板子使用的是SD卡作为引导盘和存储盘的,首先要格式化内存卡。使用SD Card Formatter格式化内存卡。SD Card Formatter下载地址

格式化时注意盘符,随后点击Format.

烧录镜像到内存卡

使用balenaEtcher软件烧录镜像。下载地址:https://www.balena.io/etcher/

选择下载好的jetson-nx-jp441-sd-card-image文件,点击Flash.

刷写完以后会有一个验证数据的操作,不建议跳过。

稍后片刻,等待完成。

点亮主机

把SD卡插入卡槽,将HDMI线连接到屏幕上,插入鼠标和键盘,启动电源。

初始配置

采用M.2 Key M SSD作为启动盘

  1. 打开Ubuntu18.04自带 Disks 工具,'Ctrl+F' 或点击右上角选择‘Format Disk' 并将其格式化为GPT 格式

  2. 格式化时必须选择“Ext4”, 等待完成后,点击下方 '三角按钮',mount 到固定目录如/media/nvidia/xxxx

  3. 执行以下命令

    1
    2
    3
    git clone https://github.com/jetsonhacks/rootOnNVMe.git
    cd rootOnNVMe
    ./copy-rootfs-ssd.sh
    1
    ./setup-service.sh

更改apt源

感谢清华大学开源软件镜像对开源软件的大力支持。

备份原有源文件

1
mv /etc/apt/sources.list /etc/apt/sources.list.bak
1
vim /etc/apt/sources.list

将以下内容粘贴到终端

1
2
3
4
5
6
7
8
9
10
11
12
13
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse

更新系统

1
sudo apt update && sudo apt upgrade -y

更改pypi源

1
2
3
sudo install python3-pip
python3 -m pip install -i https://mirrors.cloud.tencent.com/pypi/simple --upgrade pip
python3 -m pip install config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple

风扇控制

1
2
echo 255 > /sys/devices/pwm-fan/target_pwm
#范围0-255,风扇默认是不开的

重启以后风扇是不转的,所以需要设置开机运行: 创建/etc/rc.local,并添加如下内容: (注:系统启动的时候会执行/etc/rc.local,如果已存在rc.local,则在exit 0之前加入那3句命令即可)

1
2
3
4
5
#!/bin/bash
sleep 10
sudo /usr/bin/jetson_clocks
sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'
exit 0

添加执行权限: sudo chmod 755 /etc/rc.local

以后重启就会自动开启最大性能并启动风扇了。

远程桌面

开机以后SSH默认是开启的。这里使用Nomachine作为远程桌面软件。Nomachine的专有NX协议在高延迟低带宽的链路上提供了近乎本地速度的响应能力。

ARM64客户端下载链接

Windows客户端下载链接

设置分辨率

如果没有显示器连接,默认VNC 连接后的分辨率为640x480 ,将以下内容添加到/etc/X11/xorg.conf文件,将其设置为默认VNC分辨率设置。

1
2
3
4
5
6
7
8
9
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Tegra0"
SubSection "Display"
Depth 24
Virtual 1024 768 # Modify the resolution by editing these values
EndSubSection
EndSection

快捷设置代理

/home目录下,把一下内容加入到.bashrc.

1
2
3
4
alias proxy='export all_proxy=http://127.0.0.1:10809
export https_proxy=http://127.0.0.1:10809
export socks_proxy=socks5://127.0.0.1:10808'
alias unproxy='unset all_proxy https_proxy socks_proxy'

安装Jtop

Jtop(一个系统监视实用程序,可在终端上运行,并实时查看和控制 NVIDIA Jetson的状态 )

1
2
3
sudo apt-get install python3-pip
sudo pip3 install jetson-stats
sudo jtop

查看当前运行功率

1
2
3
4
5
6
7
8
#查询当前状态
sudo nvpmodel --query
#切换状态
sudo nvpmodel -m #Mode_ID
#查看处理器状态
sudo jetson_clocks --show
#如果jetson_clocks 后没有参数,则直接开启static MAX 模式
sudo jetson=_clocks

安装Pytorch

下载地址

根据自己的Python环境下载whl文件.这里是Python 3.6.9,安装的版本是PyTorch v1.7。

安装命令

1
2
3
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev 
python3 -m pip install Cython
python3 -m pip install numpy torch-1.7.0-cp36-cp36m-linux_aarch64.whl
安装torchvision

v0.8.1为例.

1
2
3
4
5
6
7
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
git clone --branch v0.8.1 https://e.coding.net/fly97/mechine-learning/torchvision.git # see below for version of torchvision to download
cd torchvision
export BUILD_VERSION=v0.8.1 # where 0.x.0 is the torchvision version
python3 -m pip 'pillow<7' # always needed for Python 2.7, not needed torchvision v0.5.0+ with Python 3.6
sudo python setup.py install # use python3 if installing for Python 3.6
cd ../ # attempting to load torchvision from build dir will result in import error

对应版本:

  • PyTorch v1.0 - torchvision v0.2.2
  • PyTorch v1.1 - torchvision v0.3.0
  • PyTorch v1.2 - torchvision v0.4.0
  • PyTorch v1.3 - torchvision v0.4.2
  • PyTorch v1.4 - torchvision v0.5.0
  • PyTorch v1.5 - torchvision v0.6.0
  • PyTorch v1.6 - torchvision v0.7.0
  • PyTorch v1.7 - torchvision v0.8.1

CUDA

官网最新镜像文件自带cuda 版本为10.2,OpenCV4

将以下命令写入~/.bashrc

1
2
3
export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.2/bin:$PATH

退出后保存

1
source ~/.bashrc

检查

1
nvcc -V

返回的文字如下

1
2
3
4
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_21:14:42_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89
安装ROS仓库
1
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.bfsu.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
添加ROS密钥
1
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
启用额外的软件库
1
2
3
sudo apt-add-repository universe
sudo apt-add-repository multiverse
sudo apt-add-repository restricted
添加ROS

OpenCV

1
pkg-config opencv4 --modversion

返回的文字如下

1
4.1.1
安装CUDA OpenCV
移除原有OpenCV
1
2
3
sudo apt-get purge libopencv*
sudo apt autoremove #此步不建议运行, 有可能产生奇怪的依赖问题
sudo apt-get update
安装依赖
1
2
3
4
5
6
7
8
9
10
11
12
# 安装必备库,cmake,git,g++
sudo apt-get install -y build-essential checkinstall cmake pkg-config yasm git gfortran
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y libjpeg8-dev libjasper-dev libpng12-dev libtiff5-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine2-dev libv4l-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgtk2.0-dev libtbb-dev libatlas-base-dev libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev libxvidcore-dev libopencore-amrnb-dev libopencore-amrwb-dev x264 v4l-utils
# 处理图像所需的包
sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
# 处理视频所需的包
sudo apt-get install libxvidcore-dev libx264-dev ffmpeg
# opencv功能优化
sudo apt-get install libatlas-base-dev gfortran

下载OpenCV源代码

下载地址:https://opencv.org/releases/

此次编译使用的是opencv-4.4.0.zip版本。

额外的库:https://github.com/opencv/opencv_contrib

1
2
3
4
unzip opencv-4.4.0.zip
cd opencv-4.4.0
mkdir build
cd build

执行CMAKE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_ENABLE_NONFREE=1 \
-DBUILD_opencv_python2=1 \
-DBUILD_opencv_python3=1 \
-DWITH_FFMPEG=1 \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2 \
-DCUDA_ARCH_BIN=7.2 \
-DCUDA_ARCH_PTX=7.2 \
-DWITH_CUDA=1 \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DOPENCV_GENERATE_PKGCONFIG=1 \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.4.0/modules \
..

注意:opencv_contrib-4.4.0是放在opencv-4.4.0中,注意文件的路径!!!

使用cuda,-DWITH_CUDA=1.

官方文档的cmake的配置情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_PNG=OFF \
-DBUILD_TIFF=OFF \
-DBUILD_TBB=OFF \
-DBUILD_JPEG=OFF \
-DBUILD_JASPER=OFF \
-DBUILD_ZLIB=OFF \
-DBUILD_EXAMPLES=ON \
-DBUILD_JAVA=OFF \
-DBUILD_opencv_python2=ON \
-DBUILD_opencv_python3=OFF \
-DENABLE_NEON=ON \
-DWITH_OPENCL=OFF \
-DWITH_OPENMP=OFF \
-DWITH_FFMPEG=ON \
-DWITH_GSTREAMER=OFF \
-DWITH_GSTREAMER_0_10=OFF \
-DWITH_CUDA=ON \
-DWITH_GTK=ON \
-DWITH_VTK=OFF \
-DWITH_TBB=ON \
-DWITH_1394=OFF \
-DWITH_OPENEXR=OFF \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-8.0 \
-DCUDA_ARCH_BIN=6.2 \
-DCUDA_ARCH_PTX="" \
-DINSTALL_C_EXAMPLES=ON \
-DINSTALL_TESTS=OFF \
-DOPENCV_TEST_DATA_PATH=../opencv_extra/testdata \
../opencv

注意:请根据自己的的CUDA版本和实际路径修改参数!

参考链接:OpenCV: Building OpenCV for Tegra with CUDA

编译

执行以下命令

1
make -j1

其中1指的线程,初次编译建议使用单线程,,解决一些奇怪问题。

安装

执行以下命令

1
sudo make install
成功啦
解决各种出错问题
  1. src/grfmt_jpeg2000.cpp.o failed

编译时关闭如下tag:-DBUILD_JASPER=OFF 即可.

  1. fatal error: boostdesc_bgm.i: No such file or directory

    可参考:https://github.com/AastaNV/JEP/issues/20

    https://github.com/opencv/opencv_contrib/issues/1301#issuecomment-618262386

将下载好的文件解压到以下文件夹:

cuDNN

1
2
3
4
cd /usr/src/cudnn_samples_v8/mnistCUDNN
sudo make
sudo chmod a+x mnistCUDNN
./mnistCUDNN

更改桌面

默认的桌面环境是Unity,此次更改成更轻量的ubuntu-mate.

注意:安装过程中请勿卸载现有的桌面登录管理器,以免出现无法登录进系统的尴尬。

安装更轻量的桌面登录管理器LightDM:LightDM是2010年开始的新项目,且被设计为轻量、小巧、快速。相较于GDM-GTK、KDM-Qt、LightDM实际上与界面无关,它仅支持本地图形界面获得最好兼容性。

1
sudo apt-get install lightdm

安装ubuntu-mate-destop

1
sudo apt-get install ubuntu-mate-core ubuntu-mate-desktop
lightdm设置自动登录

设置autologin-user来设置系统启动时自动登录某个帐户。设置autologin-user-timeout限制用户在设定秒内如果没有自动登录则不能自动登录。

编辑以下文件

1
vim /etc/lightdm/lightdm.conf 

设置autologin-user来设置系统启动时自动登录某个帐户。设置autologin-user-timeout限制用户在设定秒内如果没有自动登录则不能自动登录。

1
2
3
[SeatDefaults]
autologin-user=username
autologin-user-timeout=delay
lightdm修改默认会话

默认会话设置保存在/usr/share/lightdm/lightdm.conf.d会话包中。

1
2
[SeatDefaults]
user-session=name

其中name代表/usr/share/xsessions/*.desktop.desktop。

转载自:https://www.cnblogs.com/EasonJim/p/7128317.html

sudo无需输入密码

切换到root用户,输入以下命令:

1
visudo

在最后一行输入

1
<用户名> ALL=(ALL) NOPASSWD: ALL