longer95479@home:~$

[Paper Reading] Scalable Distance-based Multi-Agent Relative State Estimation via Block Multiconvex Optimization


Scalable Distance-based Multi-Agent Relative State Estimation via Block Multiconvex Optimization [WGWF24] RSS 2024
Author: Tianyue Wu, Zaitian Gongye, Qianhao Wang, and Fei Gao

针对的问题:

  • 从一系列距离测量中进行 相对位置估计
  • 由此建模得到的数学模型是 高维非凸

提出的方法:

  • 建模:generalized graph realization
  • introduce two collaborative optimization models, one of which is convex and thus globally solvable, and the other enables fast searching on non-convex landscapes to refine the solution offered by the convex one. Importantly, both models enjoy multiconvex and decompos able structures, allowing efficient and safe solutions using block coordinate descent that enjoys scalability and a distributed nature.

取得的效果:

  • 计算精度超越或等同于当前的集中式的基于松弛的凸优化方法
  • 可扩展性强于集中式的基于松弛的凸优化方法
  • 在连续系统场景下,该方法优于局部搜索方法


XI35 装机全过程


本篇记录 XI35 机体的组装过程,以及飞控、ORIN的配置,最终实现 fast-drone-250 的过程。

所有的 配件型号相关资料 可在 配件型号采购表 中找到。

总重 540g -> 780g(安装了相机和orin)

目录:

1 机体安装步骤

1.1 整体流程

  • 将电机安装到机架上,使用四个M2*6,注意机架的上下面,孔位有凹槽的为上面

  • 穿电池绑带

  • 将M3转M2橡胶减震柱穿过电驱和飞控的四角安装孔(技巧:橡皮筋技巧)

  • 使用M2*20安装电驱,8pin接口朝机头,接口贴着机架

  • 电机线修修剪(用剥线钳),焊接(加松香);电源线和滤波电容焊接

  • 连接飞控(见下面QCG版本问题),连接电池,更改电机序号映射和转向

  • 连接接收机(遥传一体模块中靠近LED的是RC接口)到飞控的 RC 端口,数传(遥传一体模块中的另一个接口)到 TELEM1 端口,GPS模块连接 到 GPS 端口

  • 线穿过镂空部分把这几个模块都放到机架顶部

  • (略)M2*12固定摄像头座,M2*16固定图传天空端

  • M3*6安装前六个铝柱的上部,第七个在尾部的立柱先不装(b站视频说错了,应该看三维动图)

  • (略)M2*12安装配重打印件

  • 3d打印天线座安装,大的套在机架尾部,小的套在涵道圈,打印件有弹性,孔偏小,需要M3螺丝旋转 着才能穿过

  • 把各个数据线的飞控端都装上(tele2(连接到orin的),gps,接收机)
  • 机架,七个铝柱,涵道圈,菱形底架,从上至下叠起来后从下往上安装M3*14

  • 调试完成后安装桨叶,使用M2*10安装

  • 打印相机和orin的安装连接件,使用M2*>=8的螺丝将其固定到机架上,螺母锁上

  • 安装orin:orin载板安装孔是M3,若使用M2立柱,导致只能用M2螺丝,螺帽太小会穿过,因此要在螺丝上加两个螺母
    • 或者直接使用 M3*>=25 立柱
    • 先将螺丝都穿过打印件后,再将其安装到机架上,降低安装难度
  • 安装 d435,使用 M6 螺丝

  • 飞控上的 uart4(/dev/ttyS3) 连接到 ORIN 的 uart1(/dev/ttyTHS0)(左侧端口)

参考:NxtPX4v2开源飞控装机和配置全流程教程

1.2 px4 与 orin 串口连接线的线序与焊接

由于 nxt-px4 和 orin 载板上的串口端口型号不同,需要将各自配套的线材剪断,并按照串口正确的线序进行焊接,线序对应关系如下:

nxt-px4 黑(GND) 红(5V) 黄(Tx) 绿(Rx)
orin 3(GND) x(5V) 1(Rx) 2(Tx)

2 飞控配置

2.1 基本配置

  • 测试电机转向

  • 遥控器和接收机对频,并在地面站校准

  • 配置通道功能,用于飞行模式切换、紧急停止等(注意:有三档的前两档一致)详见 px4ctrl
    • 5通道2档:自稳和offboard
    • 6通道3档:是否接受命令
    • 7通道3档:急停
    • 8通道2档:px4ctrl对px4的重启
  • 电压电流采样设置,电池节数为6

  • 传感器校准
    • 飞控与罗盘方向设置:ROTATION_ROLL_180
    • 陀螺仪与加速度计校准
    • 校准地平线

细节参考 NxtPX4v2开源飞控装机和配置全流程教程

2.2 与 ORIN 通信相关的配置

主要参考 Nxt-FC,github 上的 readme 进行设置,不要按照商家给的安装教程里的进行设置。主要是配置 MAV_0 的参数

  • MAV_0_CONFIG: TELE2 (Serial Configuration for MAVLink (instance 0))
  • MAV_0_FLOW_CTRL: Auto-detected
  • MAV_0_FORWARD: Enabled
  • MAV_0_MODE: External Vision
  • MAV_0_RADIO_CTL: Enabled
  • MAV_0_RATE: 92160 B/s

2.3 获得高分辨率和高频率的 IMU 数据所需的配置

create file in your tf-card /etc/extras.txt

mavlink stream -d /dev/ttyS3 -s ATTITUDE -r 200

mavlink stream -d /dev/ttyS3 -s HIGHRES_IMU -r 1000

then using the following settings:

  • IMU_GYRO_RATEMAX: 2000Hz
  • IMU_INTEG_RATE: 400Hz
  • MAV_0_MODE: External vision
  • Set Uart4(SER_TELE2) to 921600
  • MAV_0_RATE 92160B/s

after these settings you will have 250Hz /imu/data_raw /imu/data

3 ORIN NX 配置

3.1 安装 jetpack 5.1.3 linux for jetson orin nx modules:

  • 在 PC 上的 ubuntu 里安装 sdkmanager

  • 按住 REC 键并给 orin 上电,上电后可松开,之后将 typeC 插到 Recovery Port(在底板短边上的那个typec口,即 USB1),另一端连接到 PC

  • 按照 sdkmanager 的引导操作即可,可选择组件安装
    • 此时 opencv 可以不装,因为此阶段安装的 opencv 不支持 cuda 加速
  • 下载镜像

  • 安装镜像
    • 注意 username不能是大写字母,否则 sdkmanager 无法自动设置orin的用户名等后续的默认设置参数,进一步导致无法通过usb以太网连接orin
    • 一切安装完成后,忘记拔掉 usb 将导致板子一直无法正常启动,外接屏幕无画面,拔掉后就一切正常
  • 如果 PC 上的 ubuntu 硬盘空间不足,可外接移动硬盘,将 Download Folder 和 Target HW image folder 设置在移动硬盘(FAT)里
    • 注意:移动硬盘的文件系统不能是 windows 的 FAT,而应该是 EXT4,否则镜像将会安装错误

3.2 ROS 安装

参考 从零制作自主空中机器人:

  • sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

  • sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

  • sudo apt update

  • sudo apt install ros-noetic-desktop-full

  • echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc

  • 建议没有ROS基础的同学先去B站学习古月老师的ROS入门教程

测试 ROS:

  • 打开三个终端,分别输入
    • roscore
    • rosrun turtlesim turtlesim_node
    • rosrun turtlesim turtle_teleop_key

3.3 realsense 驱动安装

  • 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-dkms

  • sudo apt-get install librealsense2-utils

  • sudo apt-get install librealsense2-dev

  • sudo apt-get install librealsense2-dbg

  • 测试:realsense-viewer

  • 注意测试时左上角显示的USB必须是3.x,如果是2.x,可能是USB线是2.0的,或者插在了2.0的USB口上(3.0的线和口都是蓝色的)
  • roslaunch realsense2_camera rs_camera.launch 无法正常工作,报符号错误,这是是手使用动编译的opencv4.5.4但没添加对应路径的问题

3.4 安装 mavros

  • sudo apt-get install ros-noetic-mavros
  • cd /opt/ros/noetic/lib/mavros
  • sudo ./install_geographiclib_datasets.sh

3.5 安装ceres与glog与ddyanmic-reconfigure

  • 解压3rd_party.zip压缩包

  • 进入glog文件夹打开终端

  • sudo chmod 777 autogen.sh && sudo chmod 777 configure

  • ./autogen.sh && ./configure && make && sudo make install

  • sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev libgoogle-glog-dev libgtest-dev

  • 进入ceres文件夹打开终端

  • mkdir build

  • cd build

  • cmake ..

  • sudo make -j4

  • sudo make install

  • sudo apt-get install ros-noetic-ddynamic-reconfigure

注意,安装的版本是 `ceres 2.0.0` 版本,编译需使用 `std=c++14` 及以上,后续需把 vinsfusiongpu 里的所有包都改成 c++14 标准

3.6 OpenCV 安装

如果我们在 sdkmanager 中勾选了安装 opencv 的选项,安装的版本将会是 OpenCV 4.5.4,但不支持 cuda 加速,此时我们下载相同版本的 opencv 源码,在 CMAKE 选项上打开支持 cuda 加速的选项,再进行编译。

安装过程参考 Jetson Orin NX 开发指南(5): 安装 OpenCV 4.6.0 并配置 CUDA 以支持 GPU 加速,注意版本的不同即可,我们安装的是 4.5.4

注意,编译支持cuda的 opencv时,cmake选项里 CUDA_ARCH_BIN=8.7,而不是 7.2

3.7 安装 cv_bridge 功能包

为什么需要自己下载 cv_bridge 源码并编译呢?

安装 noetic full版本时已经下载了 cv_bridge 的二进制文件,其编译时使用的是 opencv 4.2 的函数,因此链接时需要链接到opencv 4.2的 so 文件,但 orin 上新安装的支持 cuda 加速的 opencv 是 4.5.4 版本,因此该 cv_bridge 只能链接到 4.5 版本的 opencv 库,vins 在执行到 cv_bridge 相关的函数时就无法正常执行,最后报内存溢出的错。

解决办法:下载 cv_bridge 的源码,然后指定 4.5 版本的opencv进行编译,编译完成后将其路径添加到 ~/.bashrc 文件中,并刷新环境变量,具体参考 Jetson Orin NX 开发指南(5): 安装 OpenCV 4.6.0 并配置 CUDA 以支持 GPU 加速

3.8 下载并编译 Fast-drone-XI35

原本需要分成两部:

  • clone 浙大官方的 Fast-drone-250 的仓库
  • 将其中的 vins-fusion 替换成 fins-fusion-gpu 版本

为了简化操作:

  • 把替换成 gpu 版本的 fast-drone-250 push 到 Fast-Drone-XI35直接 clone 该仓库即可,之后进行编译

其中所作的修改均是针对的 vins-fusion-gpu,包括:

  • 由于 ceres 2.0.0 需使用 std=c++14,因此把 vinsfusiongpu 里的所有包的 CMakeLists.txt 都改成 c++14 标准

  • 设置 OpenCV 路径为带有 GPU 加速的 opencv 4.5.4,opencv 可以指定到 编译的文件夹安装的文件夹

  • 由于 vins-fusion-gpu 原仓库使用的是 opencv 3,而现在安装的是 opencv 4,OpenCV 4 系列和 OpenCV 3 系列有一些变量的名称发生了改变,因此我们这里只要将相应的变量名称进行修正,就能顺利通过编译

  • 具体参考:Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行

4 Docker 配置与使用

TODO

5 需要注意的问题

飞控相关

  • 安装好后typeC不好插

  • 小心滤波电容短路

  • QGC v4.0.11无法识别 px4 pro 1.14.0
    • QGC 4.3.0 可以识别
  • imu频率在地面站上看一直是50Hz,不知用NX板连接 SER_TELE2 时会不会达到250Hz
  • 智能充充电电流设置为1.3A会时不时自动停止充电,需要频繁人为重启,设置为1A则正常(电池充放电能力为0.5C,既 3000mAh*0.5h^-1 = 1500mA = 1.5A)

  • 电机线焊接方向没选择好,导致挤在一起,可能会影响散热
    • !!!加上电源线没焊好,会挡住飞控上的 TELE2 接口,不得不重新焊接

orin 相关

  • orin载板安装孔是M3,使用M2立柱,导致只能用M2螺丝,螺帽太小会穿过,因此要在螺丝上加两个螺母

  • orin和nxtpx4通过串口相连,但两端的接口不同,需要自己焊接线

  • px4的/dev/ttyS3 连接到 orin 的 /dev/ttyTHS0

  • 安装ceres与glog与ddyanmic-reconfigure时,执行 ./autogen.sh && ./configure && make && sudo make install 前要加两句 sudo chmod 777 autogen.sh && sudo chmod 777 configure

  • unable to locate package libcxsparse3.1.2
    • 使用sdkmanager预装的opencv不支持cuda,需要卸载,重新安装支持cuda加速的版本
    • 或者不卸载,直接安装支持 cuda 加速的版本,之后cmake文件里把路径指向编译所在的文件夹,因为卸载时用 autoremove会把 ros的full版本删掉一部分,需要重新下回来,并照着vinsfusiongpu的readme修改路径
    • 更好的操作是不要使用 sudo make uninstall 卸载 opencv,而是
      • 找到之前装opencv的build文件夹,进入后执行卸载指令 sudo make uninstall
      • 然后再把之前留在usr文件夹里的剩余文件都删掉
      • sudo rm -r /usr/local/include/opencv4 /usr/local/share/opencv4 /usr/local/lib/libopencv*
      • sudo rm -r /usr/include/opencv4 /usr/share/opencv4 /usr/lib/libopencv* `
  • roslaunch realsense2_camera rs_camera.launch 无法正常工作,报符号错误,这是是手使用动编译的opencv4.5.4但没添加对应路径的问题
  • VINS无法正常运行,原因有多个
    • 一个是是编译支持cuda的 opencv时, cmake选项里 CUDA_ARCH_BIN=8.7,填成了7.2
    • 另一个重要原因是,安装 noetic full版本时已经下载了 cv_bridge 的二进制文件,其编译时使用的是 opencv 4.2的函数,因此链接时需要链接到opencv 4.2的 so文件,但orin上新安装的支持cuda加速的opencv是 4.5.4 版本,因此该cv_bridge 只能链接到 4.5 版本的opencv库,vins在执行到cv_bridge 相关的函数时就无法正常执行,最后报内存溢出的错。解决办法:下载 cv_bridge 的源码,然后指定 4.5版本的opencv进行编译,编译完成后将其路径添加到 ~/.bashrc 文件中,并刷新环境变量
    • 参考 Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行_jetson orin nx跑vins-CSDN博客
  • 设置好外参初始值后,里程计输出出现姿态较准确,但平移量反复波折,仿佛被约束在一点,不随实际运动而运动,且容易出现巨大漂移
    • 外参中旋转矩阵的符号错了,本来以为相机坐标系是z朝前y朝上,实际情况时z朝前y朝下,修改后里程计正常
  • 自动起飞后会超调一下

  • 飞行过程上下起伏,可能需要调一下PID参数

  • 起飞和飞行时机身倾斜,需要校准一下地平线

参考



[Paper Reading] Hong Kong World: Leveraging Structural Regularity for Line-Based SLAM


  • 使用半搜索的方法估计 DDs(主方向) 或消失点,并计算其投影平面的法向量
  • 既然检测出了 DDs,那么就该利用它,使用 DDs 的空间位置关系来计算相机的位姿,比传统方法更加精确有效
    • 匹配2D-2D 直线,然后三角化(怎么获得帧间相对位姿的?)
    • 匹配跟 DDs 对齐的 3D 直线和 2D 直线(而不是所有直线),然后估计相机姿态
  • 使用一种滤波方法来微调已估计出来的 DDs,然后使用这个细调后的 DDs 来优化相机位姿和 3D 直线,相当于利用了“垂直”的先验
  • 建立了数据集(图片序列)

图1和图2介绍了 Manhattan worldAtlanta worlda mixture of manhattan world 以及 Hongkong world 的区别。Hongkong world 主要的优势是比前两者模型更准确,比第三种模型更简洁

We consider a normal that is not orthogonal to any DD as an outlier. Note that for a set of inliers with respect to the same DD, they are all orthogonal to this DD



Total views. cowboys. Hits