相关文章推荐
腹黑的豆浆  ·  Flutter ...·  1 年前    · 
沉着的毛衣  ·  java ...·  1 年前    · 
博学的警车  ·  javascript - Why does ...·  1 年前    · 

Nvidia Jetson Xavier 安装Ubuntu18.04并配置环境

此文 短链接索引 :【 52txr.cn/6 】- 网址
全新nvidia xavier(非 nvidia agx xavier),刷机 Jetpack 4.5.1 并将系统迁移至nvme

此文关于 刷机、安装ros melodic、mavros、realsense驱动、cartographer依赖环境都是通用的 ,而再往后的内容是个人笔记(涉及诸多个人的私有仓库)。

最近在 AGX Orin(Ubuntu 20.04装Noetic) 上面也依照此文安装了相关依赖环境,当然也 对应更新了部分内容 。AGX Orin有关于realsense的安装略有不同,安装 太新的librealsense将无法检测T265

1 刷机

一些参考文章: t.csdn.cn/HCBL9 || t.csdn.cn/4jq7Z || t.csdn.cn/uoqgn

目前市场上的Xavier主要都是非SD卡版本的(即emmc),可用使用下文步骤进行刷机。而如果是 SD卡版本 的Xavier,则一般采用 另外的方式进行刷机

NVIDIA Jetson Xavier NX使用SD镜像刷机流程

1.1 刷机-系统

  • 1 准备一个 剩余存储空间大于100GB的Ubuntu系统 ,可以是双系统也可以是虚拟机。如果空间不够大,将无法存储xavier刷机过程种所需下载的系列依赖包。
  • 2 一根 母对母的杜邦线or跳线帽 (包装盒配了跳线帽),用于短接xavier的两个引脚【 FC_REC和GND 】,进入recovery模式。
  • 3 鼠标键盘显示器 ,进xavier的Ubuntu系统,将系统迁移至ssd时需要使用。

此外nvidia xavier包装盒里面自带的电源线和micro-usb线也是需要的。

流程化操作步骤如下:

首先,去nvidia官方注册一个账号并在你的Ubuntu系统上面下载 nvidia官方的 sdk manager 并安装,版本无要求。

然后,短接前述【 FC_REC和GND 】两个引脚,并使用micro-usb连接xavier和Ubuntu系统,使用电源线给xavier供电。打开sdkmanager,登陆nvidia账号并选择自己的nx板(它会自动检测usb连接的nx板)。

第一步需要 选择jetpack版本 ,不同版本的jetpack对应的 Ubuntu系统版本 不同。我个人测试时,默认的jetpack5.0.2刷上去是Ubuntu 20.04,而 jetpack 4.5.1 对应的正好是Ubuntu 18.04。

第二步就需要 选择是否安装相关的组件包 。我之前给其他板子安装过,所以这些依赖包都已经下载好了,界面下方可以选择组件包在该Ubuntu下的存储位置。同时,因为默认情况下系统将会被安装到xavier的emmc中,而emmc只有16GB装不下这一系列的组件包。为此, 网上的教程一般只选择Jetson OS,而其他组件包暂时都不勾选 。等到系统安装完成后,先进入xavier的Ubuntu系统, 将系统迁移到固态ssd上面之后,再重新走一遍安装流程,并勾选其他的组件包不勾选Jeston OS ,此文也是如此。

之后,CONTINUE,输入Ubuntu系统密码以便进行下一步的安装。第三步默认选择“Automatic setup”,但是我尝试后一直失败,故选择的 "Manual Setup"

刷机ing

一切结束之后,便需要使用鼠标键盘和屏幕, 进入xavier的Ubuntu系统,并进行系统迁移操作 。第一次进入系统的时候,需设置xavier上Ubuntu的用户名和密码,整个流程与正常安装Ubuntu系统一致,只是无需选择分区。

1.2 换源

进入xavier的Ubuntu系统后,换源以便后续使用。

# ubuntu-ports - arm架构   bionic - ubuntu18  focal - ubuntu20
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
Ubuntu更换apt源之arm版 (editcode.net)
Poao:Ubuntu 更换apt换源教程 含arm(Xavier)
  1. 备份sources.list文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  1. 打开sources.list文件
sudo gedit /etc/apt/sources.list
  1. 删除原内容,添加下列内容 (四选一)
#清华源   bionic - ubuntu18    focal - ubuntu20 
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main universe restricted
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main universe restricted
#中科大源
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted
# 阿里云源
# 默认注释了源码仓库,如有需要可自行取消注释
deb https://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ bionic main main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ bionic -updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ bionic -updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ bionic -backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ bionic -backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ bionic -security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu-ports/ bionic -security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.aliyun.com/ubuntu-ports/ bionic -proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu-ports/ bionic -proposed main restricted universe multiverse
# 163源
deb http://mirrors.163.com/ubuntu-ports/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ bionic -security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ bionic -updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ bionic -proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ bionic -backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ bionic -security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ bionic -updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ bionic -proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ bionic -backports main restricted universe multiverse

保存后打开终端更新。

sudo apt-get upgrade
sudo apt-get update
# 安装一个依赖包,不然插入U盘时可能无法识别
# ubuntu挂载移动硬盘出现错误:mount:unknown filesystem type ‘exfat’
sudo apt-get install exfat-fuse -y

1.3 迁移系统

对于已经迁移过系统的固态硬盘,在 再次进行系统迁移时,建议先使用gparted格式化该固态硬盘 ,不然迁移系统后可能将进不去系统,最近亲测。

# 先进入系统格式化固态硬盘,然后再迁移系统
sudo apt-get install gparted -y
sudo gparted  # delete 该固态硬盘即可

参考: blog.csdn.net/weixin_41

# 硬盘分区
sudo fdisk /dev/nvme0n1
# 1)输入n给磁盘增加一个新分区,Partition number及First/Last sector直接回车即可
# 2)输入p显示分区表,将会显示一个空间比较大的磁盘(256G对应200G+,128G对应100G+)
# 3) 输入w保存分区表
# 硬盘格式化
sudo mkfs -t ext4 /dev/nvme0n1
# 将nvme硬盘分区为GPT
sudo parted /dev/nvme0n1    #进入parted
mklabel gpt                 #将磁盘设置为gpt格式
mkpart logical 0 -1         #将磁盘所有的容量设置为GPT格式
print                       #查看分区结果
# 格式化分区
sudo mke2fs -t ext4  /dev/nvme0n1p1
# 下载别人的系统迁移脚本
git clone https://gitee.com/one_DS/rootOnNVMe.git
cd rootOnNVMe           #进入目录
./copy-rootfs-ssd.sh    #执行复制脚本
# 安装启动脚本:将rootfs设置为NVME
./setup-service.sh      #将rootfs设置为NVME
sudo reboot             #重启

重启后如何迁移成功,可见如下:

1.4 刷机-软件包

此时无需再短接【 FC_REC和GND 】这两个引脚,使用micro-usb连接xavier和Ubuntu系统,再次启动sdkmanager进行软件包的安装。Step 01这里,软件默认会选择最新的JetPack,记得 自行更换为自己之前安装的版本 ,然后进行下一步。

请勿选择Jetson OS,不然可能会重新刷写Ubuntu系统。

将自己的xavier与Ubuntu连接在同一局域网下(校园网不算!) ,然后输入Xavier的Ubuntu系统的用户名及密码,进行下一步的安装。我这里的IPv4地址是软件自己识别出来的。

之后便会开始安装Jetson SDK组件,安装完成便可以正常使用啦。


硬件串口 ttyTHS0

将飞控的Telem2连接Xavier的硬件串口UART1 (不使用TTL转USB模块),对应于【 /dev/ttyTHS0 】,波特率暂时设置为115200。第一次使用时,需要给端口加临时权限 【 sudo chmod 666 /dev/ttyTHS0 】。临时权限在下次开机后就会失效,为此需要 加永久权限

# 关闭nvgetty服务
sudo systemctl stop nvgetty.service
sudo systemctl disable nvgetty.service
# 在/etc/udev/rules.d目录下创建99-serial.rules
cd /etc/udev/rules.d
sudo gedit 99-serial.rules
KERNEL=="ttyTHS0", MODE="0666"
sudo udevadm control --reload 
reboot

可用通过下面的流程 给其他usb设备加永久权限 ,如雷达。

# 查询usb设备的ID 【可用插拔对比】
lsusb
# 添加规则 
cd /etc/udev/rules.d/
# 文件名可用自行设置
sudo gedit 10-usb.rules
# 最简洁的形式
KERNEL==“ttyUSB[0-9]*”, MODE=“0666”
# 重启后生效
# 如果想要映射指定ID的USB设备为某个名字,可以设置下面的内容
# SYMLINK是设备的软链接名称,idVendor idProduct 为设备的唯一id
KERNEL==“ttyUSB[0-9]*”, ATTRS{idVendor}==“10c4”, ATTRS{idProduct}==“ea60”, MODE:=“0666”, SYMLINK+=“rplidar”
# 重新插入usb设备,可查看软链接(如果设置了SYMLINK)
ls /dev/ttyUSB*
# 这玩意有时候可能出bug,没有生效
# 为此,可以考虑每次手动加权限 —— 写在脚本文件中
sudo chmod 666 /dev/ttyUSB0  # 给USB0加权限
# 放脚本里面执行时,需要输入密码很麻烦,这里介绍一个【略过输入密码的方式】
允许一个用户运行特定命令而无需提供 sudo 密码,
则需要在 sudoers 文件中添加上这个命令。
# 【略过指定命令的输入密码】步骤如下:
# 我这里使用的是 chmod 指令,使用 whereis 查询指令地址
whereis chmod 
# result: /bin/chmod
# 编辑 sudoers 文件:
sudo visudo
# 将下面的命令添加到这个文件的最后, uav 为设备的用户名
uav ALL=NOPASSWD:/bin/chmod
# 我们可以用逗号分隔的值来添加额外的命令
uav ALL=NOPASSWD:/bin/chmod,/usr/bin/apt-get
# 保存并关闭这个文件,然后注销(或重启)你的系统,便可以生效
# 之后再运行下面的指令,便无需输入密码  
sudo chmod 666 /dev/ttyUSB0
# sudo apt-get install 也可以如此,但还是建议慎重
whereis apt-get

2 Ros melodic

我直接使用鱼香ros进行安装会出错,所以只能 手动走一遍ros安装流程

# 最近又试了试,手动换源之后使用 鱼香ros,可以快速安装ros
# 选择1进行Ros的安装
wget http://fishros.com/install -O fishros && sudo bash fishros
# 选择3配置rosdep
wget http://fishros.com/install -O fishros && sudo bash fishros
# 还需update
rosdepc update
ROS: blog.csdn.net/qq_414508
ROS update: zhuanlan.zhihu.com/p/39

最近 清华源似乎突然崩了【2023/4/1 -- 愚人节玩笑?】 ,导致我在nx上 【sudo apt-get update】一直报错,无法连接清华源。

【2023/4/1 -- 愚人节玩笑?】

可是我的【/etc/apt/sources.list】 里面一个清华源也没有,为什么总是报错呢 ?尝试了国内一大堆源之后还是报错,最终发现是 ros这里设置的软件源出现了问题,即【 /etc/apt/sources.list.d/ros-latest.list 】里面包含了清华源。

/etc/apt/sources.list 怎么改都报错
# 设置软件源【这里自行选择一个源即可】: /etc/apt/sources.list.d/ros-latest.list
# 选一个!!!!
# 清华的源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
# 中科大的源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
# 163的源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.163.com/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
# 设置最新的密钥:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
# 安装:
sudo apt-get update
sudo apt-get install ros-melodic-desktop-full -y
sudo apt-get install ros-melodic-rqt* -y

初始化rosdep:

# 1) 假设你的用户名为 username
# 没设置代理的情况下无法从github上面 git clone
# git clone https://github.com/ros/rosdistro.git
# 直接从gitee上面git clone即可
git clone https://gitee.com/zhao-xuzuo/rosdistro.git
# 此时主文件夹目录下出现rosdistro文件夹,路径为/home/username/rosdistro
# 2) 创建20-default.list文件
# 手动创建脚本所需的文件
sudo mkdir -p /etc/ros/rosdep/sources.list.d
cd /etc/ros/rosdep/sources.list.d
sudo gedit 20-default.list
# 输入以下内容并保存:
# os-specific listings first
yaml file:///home/username/rosdistro/rosdep/osx-homebrew.yaml osx
# generic
yaml file:///home/username/rosdistro/rosdep/base.yaml
yaml file:///home/username/rosdistro/rosdep/python.yaml
yaml file:///home/username/rosdistro/rosdep/ruby.yaml
gbpdistro file:///home/username/rosdistro/releases/fuerte.yaml fuerte
# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead

上下文路径中的 username需要替换为Ubuntu系统名称

# 3) 修改脚本URL为本地路径
cd /usr/lib/python2.7/dist-packages/rosdep2/
sudo gedit gbpdistro_support.py
# 将 FUERTE_GBPDISTRO_URL 后面路径改为如下,并保存
FUERTE_GBPDISTRO_URL = 'file:///home/username/rosdistro/releases/fuerte.yaml'
cd /usr/lib/python2.7/dist-packages/rosdep2/
sudo gedit rep3.py
# 将 REP3_TARGETS_URL 后面路径改为如下,并保存
REP3_TARGETS_URL = 'file:///home/username/rosdistro/releases/targets.yaml'
cd /usr/lib/python2.7/dist-packages/rosdistro/
sudo gedit __init__.py
# 将 DEFAULT_INDEX_URL 后面路径改为如下,并保存
DEFAULT_INDEX_URL = 'file:///home/username/rosdistro/index-v4.yaml'
# 4) 启动更新命令
sudo apt install python-rosdep -y
rosdep update
# fix ~/.bashrc
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
# sudo gedit ~/.bashrc
# add the below
# source /opt/ros/melodic/setup.bash
# for ros多机通信,需要使用ifconfig查看ip并修改
# 这里建议另外查看 第9部分-SSH ,进行网口配置
echo "#export ROS_HOSTNAME=ip_address_self" >> ~/.bashrc
echo "#export ROS_MASTER_URI=http://ip_address_master:11311" >> ~/.bashrc

3 Mavros

xavier的mavros安装没啥特别的,无需安装px4仿真需要的那些东西,详细介绍参考下文。

# ubuntu20.04 忽略下面这行
sudo apt-get install python-catkin-tools -y
mkdir -p ~/catkin_ws/src
mkdir -p ~/catkin_ws/scripts
# 使⽤catkin_make话,则为cd catkin_ws/src && catkin_init_workspace
cd catkin_ws && catkin init 
# 使⽤catkin_make话,则为 cd .. && catkin_make
catkin build
# 替换melodic - noetic 
sudo apt install ros-melodic-mavros ros-melodic-mavros-extras -y 
wget https://gitee.com/robin_shaun/XTDrone/raw/master/sitl_config/mavros/install_geographiclib_datasets.sh
sudo chmod a+x ./install_geographiclib_datasets.sh
# 下面这步需要装⼀段时间,可以耐⼼等待,也可以直接拷贝GeographicLib文件夹
sudo ./install_geographiclib_datasets.sh

4 Realsense -Xavier

reference:
github.com/IntelRealSen

安装D435、T265这类Realsense相机的驱动软件包。

# Step 1: Install the latest Intel® RealSense™ SDK 2.0
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
sudo apt-get install librealsense2-utils -y
sudo apt-get install librealsense2-dev -y
# Step 2: Install Intel® RealSense™ ROS from Sources
sudo apt-get install ros-melodic-ddynamic-reconfigure -y
###################################################
# ubuntu20.04 啥也不用管!
# ps:下面的内容暂时可以不搞了,已经将 realsense-ros放到了 uav_robot 里面
# 但还是需要修改下面的内容
cd /opt/ros/melodic/share/cv_bridge/cmake/
sudo gedit  cv_bridgeConfig.cmake
# 修改below (change the lastest to opencv4, still error) 
# set(_include_dirs "include;/usr/include;/usr/include/opencv")
set(_include_dirs "include;/usr/include;/usr/include/opencv4")
sudo apt-get install ros-melodic-image-geometry -y
cd /opt/ros/melodic/share/image_geometry/cmake/
sudo gedit image_geometryConfig.cmake
# do the same
##################################################
mkdir -p realsense_ws/src  # 工作空间名可以自行更改
cd ~/realsense_ws/src
# git clone http://github.com/IntelRealSense/realsense-ros.git
git clone https://gitee.com/IntelRealSense/realsense-ros.git
cd realsense-ros/
git checkout `git tag | sort -V | grep -P "^2.\d+\.\d+" | tail -1`
cd ..
catkin_init_workspace
cd ..
catkin_make clean
catkin_make clean 报错
# catkin_make clean 报错解决
cd /opt/ros/melodic/share/cv_bridge/cmake/
sudo gedit  cv_bridgeConfig.cmake
# 修改below (change the lastest to opencv4, still error) 
# set(_include_dirs "include;/usr/include;/usr/include/opencv")
set(_include_dirs "include;/usr/include;/usr/include/opencv4")
cd ~/realsense_ws
catkin_make clean
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release 报错
# 报错解决 catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
cd ~/realsense_ws/src/realsense-ros/realsense2_camera/src
gedit base_realsense_node.cpp
# 修改 texture_frame_itr = find_if(frameset.begin(), 
# 为 texture_frame_itr = std::find_if(frameset.begin(),
cd ~/realsense_ws
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
echo "source ~/realsense_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
# test 插入D435 看看
roslaunch realsense2_camera rs_camera.launch

4 Realsense-Orin

安装参考: blog.csdn.net/YOULANSHE

可以选用sdk版本 librealsense-2.48.0 和ros驱动功能包 realsense-ros-2.3.1 ,二者版本是对应的。目前测试来看,默认步骤将安装realsense-viewer v2.54.1,无法检测T265 ,而 v2.51.1及以下版本是可以正常检测的 。realsense-ros中的 realsense2_camera/CMakeLists.txt line 46 左右存在librealsense的版本信息。

if (WIN32)
find_package(realsense2 CONFIG REQUIRED)
else()
find_package(realsense2 2.48.0)
endif()

安装步骤如下:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
sudo apt-get install librealsense2-utils -y
sudo apt-get install librealsense2-dev -y
sudo apt-get install ros-noetic-ddynamic-reconfigure -y
sudo apt-get install git libssl-dev libusb-1.0-0-dev pkg-config 
sudo apt-get install libgtk-3-dev
sudo apt-get install libglfw3-dev
# 下载librealsense的代码
git clone -b v2.48.0 https://github.com/IntelRealSense/librealsense.git
cd librealsense
mkdir build&&cd build 
cmake .. 
make -j4  
sudo make install 
realsense-viewer
# 设置权限脚本
cd ~/librealsense
sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && udevadm trigger 

上面安装完驱动,下面接着安装ros程序。已经包含在了 Uav_ctrl的orin分支 ,这里可以跳过。

cd ~/catkin_ws/src
git clone -b 2.3.1 https://github.com/IntelRealSense/realsense-ros.git
cd ..
catkin_make clean
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
roslaunch realsense2_camera rs_camera.launch

5 Cartographer

使用脚本直接安装carotographer的依赖环境 (无需关心px4仿真的依赖问题,nx不需要)。

carto环境速配: zhuanlan.zhihu.com/p/55
carto环境脚本: wws.lanzouf.com/iilRj03

后文涉及大量私有仓库,仅我个人可用

文章从此处开始,将 涉及到我在gitee上面的私有仓库 ,仅我个人可用。

# 一般都把cartographer的工作空间放到carto文件夹下
mkdir -p ~/carto
cd ~/carto/ 
# 下载项目
# git clone https://github.com/xiangli0608/cartographer_detailed_comments_ws.git
# git clone https://gitee.com/poaozz/cartographer.git  # 主分支
# 使用2d建图的分支
git clone -b dev-2d https://gitee.com/poaozz/cartographer.git  
# 使用脚本安装依赖环境
cd cartographer
sudo apt-get install unzip -y
unzip cartographer_install-20210613.zip&&cd cartographer_install
# 对于Ubuntu 20.04,需要修改该脚本内容
# python3-wstool \ python3-rosdep \ python3-sphinx  # 加3个3
sudo ./auto-carto-build.sh
# 使用脚本进行编译
cd ~/carto/cartographer
./catkin_make.sh

6 Uav_ctrl

集成px4-avoidance、detect、uav_robot,其与Cartographer组成完整的项目代码。其中内含的脚本文件`xavier_sh`建议拷贝到“~/”下,以便ssh连接时使用。

sudo apt-get install ros-melodic-serial -y
sudo apt-get install ros-melodic-depth-image-proc -y
sudo apt-get install tmux -y
mkdir -p ~/uav_ctrl/src
cd ~/uav_ctrl/src
# ubuntu 18
git clone https://gitee.com/poaozz/uav_ctrl.git
# ubuntu 20.04 orin !
git clone -b orin https://gitee.com/poaozz/uav_ctrl.git
cd uav_ctrl&&./catkin_make.sh
# 拷贝脚本文件到“~/”下
cp –r xavier_sh/ ~/
# Ubuntu18 前面编译如果报错如下:
No rule to make target '/usr/lib/aarch64-linux-gnu/libopencv_objdetect.so.3.2.0'
# 安装依赖之后便可解决
sudo apt-get install libopencv3.2 -y
# Ubuntu20 如果编译报错: error PCL requires C++14 or above
# 建议使用vscode打开工作空间
# 搜索“ add_definitions(-std=c++11)”并将其都注释掉
# 应该共计4处需要注释
# 如 avoidance_pkg/avoidance/avoidance/CMakeLists.txt

在运行将D435深度图转点云的程序时,很可能会报错如下

roslaunch local_planner rs_d435.launch
roslaunch local_planner nodelet.launch
error: According to the loaded plugin descriptions the class depth_image_proc /point_cloud_xyz with base class type nodelet::Nodelet does not exist.
blog.csdn.net/qq_434063
sudo apt-get install ros-melodic-depth-image-proc -y

参考前面那篇文章,应该是找不到对应的ros功能包, 根据报错信息对应 安装即可。我上面的报错信息对应的就是 depth_image_proc 这个功能包。

# old record
# uav_robot  -- 忽略即可
# 内含 rplidar驱动程序、t265定位转发、carto_tf、realsense-ros (ego-planner中)
mkdir -p ~/uav_robot/src
cd ~/uav_robot/src
git clone https://gitee.com/poaozz/uav_robot.git
cd ~/uav_robot
# xavier如果没有修改/opt/ros/melodic/share/cv_bridge/cmake/下面的文件,会报错
catkin_make
# nx使用的一些脚本
cd ~/
git clone https://gitee.com/poaozz/nx_sh.git

7 Ego-planner

这里使用的其实是 ego-planner-swarm,他需要深度图(D435 /camera/depth/xxx)、里程计。

别人的gazebo仿真 可以参考
参考:
GitHub - ZJU-FAST-Lab/Fast-Drone-250
github.com/aphasiayc/px
mkdir -p ~/ego_ws/src
cd ~/ego_ws/src
git clone https://gitee.com/poaozz/ego-planner.git
# about px4ctrl : https://github.com/aphasiayc/px4ctrl
cd ~/ego_ws
catkin_make

Vscode

vscode:xavier需要下载 arm64 版本的安装包。
搜索安装如下插件( python、c/c++、ros、cmake tools )
将链接前面的 az764295.vo.msecnd.net 替换为 vscode.cdn.azure.cn

8 PX4飞控设置

需要设置相应的一些参数,此处以HGD项目的 视觉飞行 为例进行介绍( Tarot 650 Sport )。先刷个固件,然后鸡架(Airframe)选择默认的Quadrotor X;接着就是传感器校准、遥控器校准、飞行模式设置;再之后便是 参数设置

1 视觉飞行

首先,视觉飞行设置参数: ekf2_aid_mask ,default 0-GPS。另外还可以通过设置EKF2_EVXXX设置更多与视觉定位相关的参数,当然一般无需设置。

2 激光定高

使用串口版北醒的TFmini-Plus给PX4定高,需要设置 ekf2_hgt_mode 以修改定高数据输入

设置 sens_tfmini_cfg ,以设置该款传感器的数据输入(IIC版本不能用)。TELEM1和TELEM已经连接其他东西,故使用TELEM4。

3 机载电脑

TELEM2将用于连接机载计算机,默认关闭需要手动打开。设置参数 MAV_1_CONFIG 为TELEM2,之后需要重启一下PX4飞控。

之后还需对应修改TELEM2的波特率,默认是921600,但是如果使用某些USB转串口模块连接飞控和机载电脑,最大波特率可能只支持115200,就需要对应修改SER_TEL2_BAUD。 此文中直接连接xavier的硬件串口和PX4飞控的串口,可以直接使用默认的921600

4 其他

项目使用的 Tarot 650 Sport 鸡架,前面选择鸡架时选择的通用的Quadrotor X, 其轴距参数与实际飞机不同

Quadrotor X 默认参数

为提高PX4飞控的控制性能,我们最好 实际测量鸡架的上述参数 ,然后对应修改。测量XY方向的位置即可,无需管“Monment coefficient of xxx”。

目前测试结果表明, 大飞机起飞后电池电量会直接变成0% ,所以不能设置低电量条件下的自动降落或者什么的,不然会无法起飞。

SWAP分区

如果xavier内存版本是8GB,可用考虑 增加一下swap分区大小 。下面的配图和实际命令略有差别,只是示意图。

# 查看swap分区大小 
free -m   
# 创建一个 swapfile 文件夹 
# mkdir /home/user_name/swapfile 
mkdir /home/uav/swapfile 
cd /home/uav/swapfile  
# 创建一个大小 1G*10 的名为swap的空文件 
sudo dd if=/dev/zero of=swap bs=1G count=10 
# 将文件转换为 swap 类型的文件 
sudo mkswap -f swap  
# 激活swap文件 
sudo swapon swap

以上设置重启后失效,还需修改一个文件才能永久生效:

# 编辑文件 
sudo gedit /etc/fstab  
# 加入一行内容 【需要对应修改路径】 
/home/uav/swapfile/swap none swap defaults 0 0 

之后重启即可。

9 SSH连接

正常的SSH咱就不说了,这里主要介绍一下, 在没有外接屏幕键盘鼠标的情况下,如何进行Ubuntu系统设置SSH所需环境 。即使用 网线登录ubuntu系统 ,并查看系统所连接的WIFI及其IP,以便无线SSH连接。

为便于使用网线登录Ubuntu系统,我们需要事先 在目标Ubuntu上面固定网口IP 。也就是刚开始还是得使用外接 屏幕键盘鼠标进行简单的设置。 对于 Xavier ,需要打开Network Connections,双击Ethernet下面的网线连接,对其进行设置。(其他Ubuntu系统如NUC只是界面略有不同而已,设置内容通用)我们需要设置【 IPv4 Settings 】,修改为Manual、 并添加自己想要的IP address ,netmask可以填写255.255.255.0,Gateway不用管。保存之后,该Ubuntu连接上其他设备后,可见其有线网口的IP已经固定为你设置的IP。

将上述设置完固定网口IP的Xavier连接到我的笔记本UBuntu之后,便可以 使用SSH登录xavier系统

远程登录过去之后,使用ifconfig便可以 查看Xavier的无线网卡的IP ,根据这个IP改一下bashrc就可以使用SSH无线连接咯。

命令行 查看Xavier当前连接的WIFI。

nmcli dev wifi

更多 命令行查询wifi及连接wifi 的内容参见下文:

不向光的红外线:Ubuntu 16.04通过命令行连接Wi-Fi


我搜集了一些常用的命令:
# 搜索附近可用的wifi名称 
sudo iw wlan0 scan | grep SSID
# 查询更详细的内容
sudo wpa_cli -i wlan0 scan
sudo wpa_cli -i wlan0 scan_result
# 更好看
sudo nmcli device wifi rescan
nmcli device wifi list
# 运行如下命令以连接Wi-Fi,以“iQOO”网络为例:
sudo nmcli dev wifi connect 'iQOO' password '08520852' iface wlan0
# wlan0 是无线网卡名称, ifconfig可以查到
# 运行如下命令查看网络是否连接成功:
sudo nmcli dev status

10 USB端口绑定

对于两个相同的USB设备,我们无法通过ID对其进行区分,但是可以根据所插入的 USB端口绑定一个固定的设备名称 。比如,我有两个串口设备,改两个串口设备的产品ID完全相同,但是他们分别连接了飞控和雷达,为了启动程序时无需修改设备号,我们可以 将设备插入的USB端口固定 ,然后通过下面的操作 给他们分别绑定指定名称

ll /dev/ | grep ttyUSB # 绑定成功如下结果
lrwxrwxrwx   1 root root           7 6月   1 10:23 fwing -> ttyUSB1
lrwxrwxrwx   1 root root           7 6月   1 10:16 radar -> ttyUSB0
crwxrwxrwx   1 root dialout 188,   0 6月   1 10:16 ttyUSB0
crwxrwxrwx   1 root dialout 188,   1 6月   1 10:23 ttyUSB1

具体步骤如下:

# 查看两个USB设备的相关信息
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB1)
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
# 需要关注对应输出结果中的如下部分内容
# KERNELS=="1-2.1"  # 1
# ATTRS{idProduct}=="6001"  # 2
# ATTRS{idVendor}=="0403"   # 3

输出节选如下:

KERNELS=="1-2.1"  # 1
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{bMaxPower}=="90mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bcdDevice}=="0600"
ATTRS{bmAttributes}=="a0"
ATTRS{busnum}=="1"
ATTRS{configuration}==""
ATTRS{devnum}=="12"
ATTRS{devpath}=="2.1"
ATTRS{idProduct}=="6001"  # 2
ATTRS{idVendor}=="0403"   # 3

之后,需要 添加对应的USB设备规则

cd /etc/udev/rules.d/ 
# 文件名随意 xxx.rules
sudo gedit 99-usb.rules

我分别绑定了雷达和飞控的串口设备,文件中添加的内容如下:

# 雷达串口设备
KERNELS=="1-2.1",ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6001",SYMLINK+="radar",MODE="0777"
# 飞控串口设备
KERNELS=="1-2.3",ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6001",SYMLINK+="fwing",MODE="0777"



Realsense - 无效

解决Realsense摄像头插着开机后,需要重新插拔才能读取数据 -- 没用,修改后重启无法进入gui界面,需要将修改内容的改回来才行。

sudo apt-get install libusb-1.0-0-dev -y
# git clone https://github.com/mvp/uhubctl
git clone https://gitee.com/greymaner/uhubctl.git
cd uhubctl
sudo make install

观察USB hub口

sudo uhubctl
#刚开机没有重新插拔是没有Intel® Corporation Intel® RealSense™的

改文件

# 用户登录时,bash先自动执行系统管理员建立的全局登录script
sudo gedit /etc/profile 
# 在最后增加
sudo uhubctl -l 2-3 -a cycle -p 1-4
# 命令行参数 -l是USB hub口 -a cycle是关闭再开启的意思 -p是1-4口的意思。


【realsense2_camera】 The requested device with is NOT found. Will Try again

  1. 拔掉相机
  2. 在/etc/udev/rules.d/下添加该链接中的内容 github.com/IntelRealSen
cd /
cd etc/udev/rules.d/
sudo gedit 99-realsense-libusb.rules

# 99-realsense-libusb.rules

##Version=1.1##
# Device rules for Intel RealSense devices (R200, F200, SR300 LR200, ZR300, D400, L500, T200)
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0a80", MODE:="0666", GROUP:="plugdev", RUN+="/usr/local/bin/usb-R200-in_udev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0a66", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0aa3", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0aa2", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0aa5", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0abf", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0acb", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad0", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="04b4", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad1", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad2", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad3", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad4", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad5", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad6", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0af2", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0af6", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0afe", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0aff", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b00", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b01", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b03", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b07", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b0c", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b0d", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3a", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3d", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b48", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b49", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b4b", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b4d", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b52", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5b", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5c", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b64", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b68", MODE:="0666", GROUP:="plugdev"
# Intel RealSense recovery devices (DFU)
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ab3", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0adb", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0adc", MODE:="0666", GROUP:="plugdev"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b55", MODE:="0666", GROUP:="plugdev"
# Intel RealSense devices (Movidius, T265)
SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="8087", ATTRS{idProduct}=="0af3", MODE="0666", GROUP="plugdev"
SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="8087", ATTRS{idProduct}=="0b37", MODE="0666", GROUP="plugdev"
SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="03e7", ATTRS{idProduct}=="2150", MODE="0666", GROUP="plugdev"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad5", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor_custom", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0ad5", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0af2", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0af2", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0afe", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor_custom", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0afe", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0aff", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor_custom", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0aff", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b00", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor_custom", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b00", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b01", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor_custom", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b01", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3a", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3a", RUN+="/bin/sh -c ' chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3d", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b3d", RUN+="/bin/sh -c ' chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b4b", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b4b", RUN+="/bin/sh -c ' chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b4d", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b4d", RUN+="/bin/sh -c ' chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5b", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5b", RUN+="/bin/sh -c ' chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5c", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"
DRIVER=="hid_sensor*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b5c", RUN+="/bin/sh -c ' chmod -R 0777 /sys/%p && chmod 0777 /dev/%k'"
KERNEL=="iio*", ATTRS{idVendor}=="8086", ATTRS{idProduct}=="0b64", MODE:="0777", GROUP:="plugdev", RUN+="/bin/sh -c 'chmod -R 0777 /sys/%p'"