jetson orin+livox mid-70+imu+云台相机联合标定和数据采集

2023-10-26

将之前无人机上的x86多源数据采集和联合标定算法重建在新板子jetson orin上,解决之前多传感器采集数据时间戳没对齐的问题。

1. 准备工作

  1. 安装ros环境,推荐小鱼:http://fishros.com/#/fish_home,大佬的包避免了自己安装的很多坑;
  2. 安装livoxsdk: https://github.com/Livox-SDK/Livox-SDK;
  3. 安装云台相机sdk:https://wiki.amovlab.com/public/gimbalwiki/G1/doc/AmovGimbalROSSDK.html;
  4. 控制云台相机固定角度,matlab获得云台相机标定内参;
  5. 安装激光+相机联合标定算法,算法使用livox_camera_calib:https://github.com/hku-mars/livox_camera_calib;
  6. 安装激光+imu联合标定算法,算法使用lidar_align;

2. 设备环境

2.1 激光雷达 Livox-MID70

1-安装livox-sdk

sudo apt install cmake
git clone https://github.com/Livox-SDK/Livox-SDK.git
cd Livox-SDK
cd build && cmake ..
make
sudo make install

2-安装驱动livox_ros_driver

git clone https://github.com/Livox-SDK/livox_ros_driver.git catkin_ws/src    #在ros工作空间下
cd ~/catkin_ws
catkin_make

雷达使用mid70的话,之前修改了ip地址:雷达地址192.168.1.113 云台相机地址192.168.1.163。
设置电脑静态ip:sudo ifconfig enp2s0 192.168.1.110 netmask 255.255.255.0
sudo route add default gw 192.168.1.1

roslaunch livox_ros_driver livox_lidar_rviz.launch  启动设备命令,提前配好ip连接。
rostopic list  录制点云保存到rosbag
rosbag record ..
rosbag play .bag

在这里插入图片描述

2.2 云台相机-阿木实验室G1吊舱

方法一(x86旧板子用的方法):
获取吊舱数据,存到sd卡。
ubuntu启动云台相机在download文件夹下: ./AmovGimbalstudio_x86_v1.0.5.AppImage,windows下载AmovGimbalstudio
控制云台相机角度与雷达方向一致
no conda 接入串口:ls /dev/ttyUSB* 确保有串口/dev/ttyUSB*

(
sudo chmod 777 /dev/ttyUSB0 赋予串口临时权限
cd ~/gimbal-sdk-master/build
./GetGimbalState -S /dev/ttyUSB0 -b 115200获取吊舱IMU角度和编码器角度
./CameraControl -a 1视频
./CameraControl -a 2照片
)
gimbal-sdk-python文件夹下:
cd gimbal-sdk-python
conda deactivate
python3 downward.py
python3 amov_gimbal_python.py

python3 amov_gimbal_python.py 1-pic 2-video 3-角度控制 4-角速率控制 5-回中 6-获取舱的状态数据,包括imu角度和编码器角度
查看吊舱图像画面: python3 amov_gimbal_image.py

方法二(jetson orin新板子用的方法):
通过ros-sdk:https://wiki.amovlab.com/public/gimbalwiki/G1/doc/AmovGimbalROSSDK.html,存到硬盘。安装ros-sdk需要几步前期准备。

  1. 安装amov-gimbal-libs:https://api.gitee.com/amovlab/amov-gimbal-libs, uname -m查看操作系统的相关信息,选择对应的配置文件复制。
    在这里插入图片描述
    执行命令:sudo cp lib/*****/libAMOV_Gimbal.so /usr/lib/ #库文件 sudo cp inc/amov_gimbal_struct.h /usr/include/ #头文件 sudo cp inc/amov_gimbal.h /usr/include/ #头文件
    在这里插入图片描述
    构建库:git工程中提供以G1吊舱为样例的C++、python3使用例程。python例程通过调用ctypes中间层(/example/2py.cpp)实现,因此正确运行python例程需要构建C++例程。
CMakeList.txt内容(位于根目录)
#构建前需正确安装库
add_subdirectory(example/serial)                                    #添加串口子模块
add_library(AMOV_Gimbal_python SHARED example/2py.cpp)              #指定构建目标
target_link_libraries(AMOV_Gimbal_python serial AMOV_Gimbal)        #链接串口库、AMOV_Gimbal库   
target_include_directories(AMOV_Gimbal_python                       #指定头文件
    PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}
)

根目录amov-gimbal-libs下运行构建命令:
mkdir build
cd build
cmake ..
make

C++例程:

事先通过usb先连接好设备,这里已经配好了云台的ip为192.168.1.163,设置电脑静态ip:sudo ifconfig enp2s0 192.168.1.110 netmask 255.255.255.0。接入串口:ls /dev/ttyUSB* 确保有串口/dev/ttyUSB* sudo chmod 777 /dev/ttyUSB0 赋予串口临时权限

sudo cp build/example/serial/libserial.so /usr/lib/     #安装串口库
sudo chmod 777 /dev/ttyUSB0                                #赋予串口权限
./build/example_test /dev/tty* G1                             #以运行G1吊舱为例 

云台将间隔约2S向正方向与初始点间摆动并在控制台输出姿态信息,如下所示:
在这里插入图片描述
python 例程
通过/example/2py.cpp构建ctypes风格库从而使得python可以通过ctypes模块调用C++库 python例程为/example/example.py 该例程实现了云台在20°(roll),30°(pitch),40°(yaw)姿态与初始姿态往复运动 并通过控制台输出实时姿态信息,其余功能可参考例程函数实现。
图像快速获取:项目提供普通WEB相机与流媒体相机通过opencv获取图像的简易demo。使用前需编译或安装opencv-python,example/example_stream_cam_image.py 适用于流媒体相机,example/example_web_cam_image.py 适用于普通WEB相机

sudo cp build/libAMOV_Gimbal_python.so /usr/lib/
sudo chmod 777 /dev/ttyUSB0                                         #赋予串口权限
sudo chmod +x example/example.py                        #赋予可执行权限
python3 example/example.py
  1. 安装ros串口库 (已安装可忽略),roscore查看自己系统的ros版本,安装对应库:sudo apt-get install ros-noetic-serial
  2. 安装 Gstreamer (已安装可忽略),sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
  3. 编译及安装opencv (已启用Gstreamer的可忽略)。 编译选项添加 (-D WITH_GSTREAMER=ON)
    参考教程:https://blog.csdn.net/chiwang_andy/article/details/130930260,https://blog.csdn.net/inininnnn/article/details/131181463
    遇到opencv not found,使用sudo apt install libopencv-dev 解决下。
  4. 进入已有的ros工作站catkin_ws/src,下载sdk.
git clone https://gitee.com/amovlab/gimbal-sdk-ros.git
cd gimbal-sdk-ros/
git checkout V2.0.0

cd ../..
catkin_make
  1. 安装构建好了,运行:
cd catkin_ws                                 #进入此前工作空间路径
source devel/setup.bash              # 通过source devel/setup.bash命令,把ROS SDK功能包加入到环境变量中

1.运行吊舱节点(通过/amov_gimbal_ros/gimbal_control话题控制吊舱、通过/amov_gimbal_ros/gimbal_state话题获取吊舱状态信息)
roslaunch src/gimbal-sdk-ros/launch/gimbal_G1.launch
    通过/amov_gimbal_ros/set_camera_action服务控制相机(0:录像和停止录像 )视频会保存在TF卡中

2.获取相机视频画面(通过/amov_gimbal_ros/amov_gimbal_image话题获取ROS image图像)

rostopic list 录制图像保存到rosbag
修改默认节点参数及话题,可于src/gimbal-sdk-ros/launch/gimbal_XX.launch 中修改相应参数修改默认节点参数及话题.
在这里插入图片描述

rosbag record ..
rosbag play .bag

2.3 IMU

这里使用的是 pixlvzwk2.4.8, 安装驱动:git clone https://github.com/PX4/PX4-Autopilot.git --recursive.
参考安装博客:https://blog.csdn.net/HuangChen666/article/details/128754106

cd PX4-Autopilot/
git submodule update --init --recursive
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh  执行ubuntu.sh脚本
make px4_sitl_default gazebo

安装MAVROS,sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras

配置和查看设备:

ls /dev/ttyACM0
sudo chmod 777 /dev/ttyACM0
source ./devel/setup.bash
roslaunch mavros px4.launch
新开终端rostopic echo /mavros/imu/data
采集imu数据:rosbag record ..
rosbag record /mavros/imu/data

同时采集雷达/imu/云台相机数据

rosbag record -O lidarimu.bag /mavros/imu/data /livox/lidar  /amov_gimbal_ros/amov_camera_image

3. 联合标定算法

2.1 雷达和相机联合标定算法:livox_camera_calib

实测中需要纵横纹理连续且清晰的,同时方法的精度受到环境中纹理的影响比较大,如果图像中有大量的和边缘平行的纹理,也会干扰特征匹配。建议室内楼梯,边缘容易提取。室外建议方形建筑。角度可以倾斜一点,不要和激光束接近平行。
如官方代码给的例子,pcd建议采集时间长一点:
在这里插入图片描述1-修改配置文件:~/catkin_ws/src/livox_camera_calib/config,修改配准图片和pcd读取位置,

# Data path. adjust them!
common:
    image_file: "/home/jetson/data/calib/image/2.png"
    pcd_file: "/home/jetson/data/calib/pcd/2.pcd"
    result_file: "/home/jetson/data/calib/extrinsic.txt"

# Camera Parameters. Adjust them!
camera:
    camera_matrix: [1364.45, 0.0,      958.327,
                0.0,     1366.46,  535.074,
                0.0,     0.0,      1.0     ]
    dist_coeffs: [0.0958277, -0.198233, -0.000147133, -0.000430056, 0.000000]

# Calibration Parameters.!
calib:
    calib_config_file: "/home/jetson/catkin_ws/src/livox_camera_calib/config/config_outdoor.yaml"
    use_rough_calib: true # set true if your initial_extrinsic is bad

如果这里使用的是云台,那么云台标定后的内参为,可直接用:
[Calib]
fx = 2104.7752770539305
fy = 2105.362380382873
u0 = 2276.460057518206
v0 = 1215.0545500692372
[Rectify]
mtx_0 = 2104.7752770539305
mtx_1 = 0.0
mtx_2 = 2276.460057518206
mtx_3 = 0.0
mtx_4 = 2105.362380382873
mtx_5 = 1215.0545500692372
mtx_6 = 0.0
mtx_7 = 0.0
mtx_8 = 1.0
dist_k1 = -0.31414978484346795
dist_k2 = 0.11767723680854802
dist_p1 = -0.00037118415206200555
dist_p2 = 0.00018745825701131476
dist_k3 = -0.021491455128815545
2-将点云数据由bag转化为pcd:

source ~/catkin/catkin_ws/devel/setup.bash
roslaunch livox_camera_calib bag_to_pcd.launch
存储在/home/sunwenhao/catkin/catkin_ws/src/livox_camera_calib/result/1.pcd

启动相机和雷达联合标定算法:

source ~/catkin/catkin_ws/devel/setup.bash 之前配了
roslaunch livox_camera_calib calib.launch

在这里插入图片描述

2.2 雷达和imu联合标定算法:lidar_align

  1. 下载安装lidar_align:https://github.com/ethz-asl/lidar_align,https://github.com/wwtx/lidar_align_wwtx
  2. catkin_make过程有问题,看ubuntu安装lidar_align时编译出错,激光雷达与IMU标定 和https://blog.csdn.net/qq_39607707/article/details/127361539,基本都可以解决了。
cd catkin_ws
catkin_make
source devel/setup.bash
roslaunch lidar_align lidar_align.launch

2.2 多源rosbag包采集数据

同时采集雷达/imu/云台相机数据,保证时间戳一致性。

rosbag record -O lidarimu.bag /mavros/imu/data /livox/lidar  /amov_gimbal_ros/amov_camera_image

ros录制多个话题脚本
脚本名自拟,如record_topic.bash

#!bin/bash
time=$(date "+%Y%m%d%H%M%S")
echo $time #字符串格式系统时间,使录制的包名不重复
 
rosbag record -O plan_$time  /mavros/imu/data /livox/lidar  /amov_gimbal_ros/amov_camera_image #录制多个话题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jetson orin+livox mid-70+imu+云台相机联合标定和数据采集 的相关文章

  • 内联汇编 - cdecl 和准备堆栈

    我最近一直在尝试通过使用缓冲区和不同汇编运算符的原始十六进制等效项来实现 C 中的动态函数 为了说明一个简单的跳转 byte buffer new buffer 5 buffer 0xE9 Hex for jump uint buffer
  • 如何让 Icecast 在端口 80 上运行 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在尝试让 Icecast 在端口 80 上工作时遇到问题 它在默认情况下工作 但当我尝试将其设置为端口 80 时 一切都中断了 我已确保
  • tomcat.conf 位于哪里?

    我找不到我的tomcat conf 我看过 etc tomcat6 但它不在那里 也不在 usr share tomcat6 我在哪里可以找到tomcat conf在 Linux Ubuntu 中 Try sudo updatedb loc
  • 如何在Linux中使用相对路径打开文件?

    我有一个程序 它使用相对路径 例如 打开文件 现在的问题是 当我从另一个目录执行程序时 相对路径不是相对于程序而是相对于工作目录 因此 如果我使用 path to program myprog 启动程序 它将无法找到该文件 有没有办法独立于
  • 比较不同文件中的列并打印那些不匹配的列

    我有两个文件 file1 和 file2 我想将 file1 的几列 1 2 3 和 4 与 file2 的几列 1 2 3 和 4 进行比较 并打印 file2 中与 file1 中任何行都不匹配的那些行 E g file1 aaa bb
  • 有没有办法使用 perf 工具查找流程中各个功能的性能?

    我正在尝试在流程中实现各个功能的性能 我该如何使用 perf 工具来做到这一点 还有其他工具吗 例如 假设 main 函数调用函数 A B C 我想分别获得主要功能以及功能 A B C 的性能 有没有一个很好的文档来了解 perf 源代码
  • 无法使用 RVM、Ruby 1.9.2 和 Rails 3 运行 RubyMine 调试器

    我已经设置了全新的 Ubuntu 安装并遵循本指南 http ryanbigg com 2010 12 ubuntu ruby rvm rails and you安装 RVM Ruby 1 9 2 和 Rails 3 然后我安装了RubyM
  • msgget() 和 mq_open 之间的区别

    我阅读了有关消息队列操作的信息 例如 msgget msgsnd 和 msgrcv 但是当我在堆栈溢出上搜索消息队列相关问题时 我发现还有另一组消息队列操作 例如 mq open mq send mq receive 谁能告诉我这两种类型的
  • 如何在汇编程序中使用 C 库?

    我想知道如何用汇编语言编写文本编辑器 但现代操作系统需要 C 库 特别是对于它们的窗口系统 我找到了这个page http pengu1n is programmer com posts 8304 html 这对我有很大帮助 但我想知道是否
  • git 忽略文件模式配置不起作用

    我在 ubuntu Linux 服务器上使用 gitolite git 服务器 我使用了一个钩子 它将在每次推送时调用并更新服务器的目录 其中包括实时站点的源代码 现在 每当我在本地电脑上更改某些内容并将更改推送到服务器时 都会调用挂钩并且
  • lseek() 的复杂度是 O(1) 吗?

    我知道我的问题在这里有答案 QFile 寻道性能 https stackoverflow com questions 6171403 qfile seek performance 但我对这个答案并不完全满意 即使在查看了以下实现之后gene
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • Boost 更新失败,现在不确定我拥有哪个版本

    在 Ubuntu 22 04 上运行此命令以获得 Boost 1 82 sudo add apt repository ppa mhier libboost latest sudo apt update sudo apt install l
  • 如何将回车符作为字符添加到文件中?

    我想要一个像这样的字符串 blablbabla
  • 使用 Shell 脚本自动安装 R-Studio

    有没有办法在 Linux 系统上自动安装 R Studio 它应该自动检测操作系统并安装具有所需依赖项的 R 和 R Studio 谢谢 我准备了以下 shell 脚本来使安装完全自动化 bin bash Program R Studio
  • 更改grep命令的分隔符

    我在用grep检测 a href xxxx something here a 当链接在输入中分成两行时 这不起作用 我想 grep 检查直到它检测到但现在它只是将输入输入到 grep 中 直到检测到新行为止 所以如果输入是这样的 a hre
  • 如何禁用浮点单元(FPU)?

    我想在 x86 系统中禁用 FPU MMX SSE 指令 并且我将为设备不可用异常实现一个处理程序 我已经提到过控制寄存器 wiki 页面 http en wikipedia org wiki Control register 看来我必须在
  • -bash:!/usr/bin/env:未找到事件[重复]

    这个问题在这里已经有答案了 我在尝试将 shebang 写入 python 脚本时收到此奇怪的错误消息 echo usr bin env python gt scripts sandbox py bash usr bin env event
  • 关闭终端后保持express进程存活

    我试图在关闭终端后保持进程正常运行 是一个带有express的node js项目 基本上 对于其他进程 我通过以下方式保持进程处于活动状态 node server js 我这样就可以完成 SSH 连接并关闭控制台 但对于 Express 我
  • 以非 root 用户身份在 UserData 中运行命令

    我正在尝试使用 EC2 UserData 脚本安装气流 我需要使用非 root 用户 ec2 user 运行一些命令 请参阅下面的脚本 UserData Fn Base64 Sub bin bash set xe Install GCC y

随机推荐

  • easyui-datagrid获取行和列数据

    1 获取当前行 var row dg datagrid getSelected 2 获取所有选中行 var rows dg datagrid getSelections 3 获取所有行 var rows dg datagrid getRow
  • 安卓11上的存储权限问题

    这篇文章 想来发布的有些晚了 安卓11已经发布多时了 关于安卓11上的存储权限变更的文章数不胜数 所以这篇文章只做为自己的一个简单的记录吧 在说11之前 我们先回忆以下10上存储权限的变更 每个应用会生成自己对应的沙盒文件路径 自己的应用只
  • 计算机基础相关知识面试题

    之前写过一篇面试题 但是在春招面试 笔试问了很多计算机网络 数据结构 操作系统等相关知识点记点之前总结的还是不够参考的 再来一篇 顺序有点乱 但是每一个都是参考的 已备大家复习使用吧 文章目录 UDP 传输控制协议 和TCP 用户数据报协议
  • Redis——初识Redis

    Redis简介 Redis的数据结构致力于帮助用户解决问题 而不是像关系型数据库那样 要求用户扭曲问题来适应数据库 除此之外 通过复制 持久化和客户端分片 client side sharding 等特性 用户可以很方便的将Redis扩展成
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十八)Gamma校正

    Vries的教程是我看过的最好的可编程管线OpenGL教程 没有之一 其原地址如下 https learnopengl cn github io 05 20Advanced 20Lighting 01 20Advanced 20Lighti
  • 编写一个golang websocket示例

    示例代码 创建一个websocket对象 var ws websocket Dial ws localhost 8000 echo http localhost 发送消息 if err ws Send byte hello world er
  • Latex编译中文出现的问题

    Latex编译中文出现的问题 记录一下使用latex编译中文遇到的一些问题 本文是在win11系统下使用的TexStudio MikTex组合 编译使用的是pdfLatex 编辑器的设置 首先会发现 编辑器中的中文字符全是乱码 这时 在Te
  • 应用于标签的伪类选择器(link、visited、active、hover)

    CSS3根据选择符的用途可以把选择器分为标签选择器 类选择器 ID选择器 全局选择器 组合选择器 继承选择器和伪类选择器等 伪类选择符定义的样式最常应用于 a 标签上 它表示4种不同的状态 link 未访问链接 visited 已访问链接
  • GnuWin32的安装与使用

    使用过Linux的伙计估计都会喜欢上linux各种各样强大的命令如 find vim cp mv wget curl grep ls等等 而GnuWin32使windows用户可以在命令行窗口中使用各种各样的linux命令 就跟使用普通的w
  • lighttpd不支持Expect: 100-continue的解决办法

    由于lighttpd1 4 21之前的版本不支持Expect 100 continue 所以有可能访问出现 HTTP 1 1 417 Expectation Failed 等错误提示 搜集整理了很多解决方法 如下 1 升级到 lighttp
  • Chrome:将禁用修改document.domain以放宽同源策略

    你好 我是tiantian 几天前 Chrome developer 博客发布了这么一篇文章 大致意思是 Chrome未来将禁用修改document domain 如果你的网站依赖于设置document domain 来解决跨域的问题 那么
  • ubuntu安装elasticsearch和head插件(所有可能出现的问题解决)超详细

    一 单例安装 首先去官网 elastic co 下载tar gz的压缩包 或者使用命令行下载 wget https artifacts elastic co downloads elasticsearch elasticsearch 6 7
  • 当鼠标光标放在一张图片上,如何显示另一张图片?

    我们会遇到一种情境 这种情境是当正常打开一个页面 有文字配有图片 可是当鼠标的光标移动到这张图片上时 会显示另一张图片 这种效果应该怎么做 在学习html和css阶段的程序员 我们可以使用hover来对图片进行处理 hover的基本意思为选
  • 【c语言】两个栈实现一个队列

    两个栈实现一个队列 核心思想 模拟出队列先进先出的数据结构 假设有两个栈input和output input模拟栈的数据插入 当需要模拟出队列操作时 input栈中的A B C D会按照D C B A的顺序进入栈output 只要outpu
  • TensorRT部署(图像分类)之engine生成及反序列化推理(第二讲)

    1 日志文件类创建 class TRTLogger public nvinfer1 ILogger public virtual void log Severity severity nvinfer1 AsciiChar const msg
  • adams怎么打开自带模型_少了这套Enscape专属模型库,你装的Enscapen废了一半

    文末领取此套Enscape离线资源库 真实植物 Enscape 我们一直都在用 大家也都很熟悉 而且Enscape作为渲染界的劳模 几乎可以保持月更的节奏 其操作简单 容易上手 渲染真实越来越多的被使用 虽然Enscape很好用 比Lumi
  • SAP MM学习笔记17-在库品目评价中的标准原价 S 和移动平均价格 V

    SAP中有2种价格 标准原价 S 和 移动平均价格 V 1 标准原价 S 2 移动平均价格 V 在MM03 会计1 Tab中 现行评价区域中 有原价管理区分 比如下面这个物料 100 100 它的原价管理区分是 S 它的合计额 就是 标准原
  • getch()、_sleep() 函数的正确用法

    前段时间由于需要 写了一段代码 用到了函数 getch 但是当时出错了 提示该标识符未被定义 一时无解 后来又有一个朋友 问我怎么将一个字符串中的字符以一种动态的方式进行输出 我当时告诉他的是使用 sleep 函数 也没有细想 后来发现 根
  • 反汇编 之thiscall约定

    thiscall是C 中的非静态类成员函数的默认调用约定 对象的每个函数隐含接收this参数 采用thiscall约定时 函数的参数按照从右到左的顺序入栈 被调用的函数在返回前清理传送参数的栈 include
  • jetson orin+livox mid-70+imu+云台相机联合标定和数据采集

    将之前无人机上的x86多源数据采集和联合标定算法重建在新板子jetson orin上 解决之前多传感器采集数据时间戳没对齐的问题 1 准备工作 安装ros环境 推荐小鱼 http fishros com fish home 大佬的包避免了自