将之前无人机上的x86多源数据采集和联合标定算法重建在新板子jetson orin上,解决之前多传感器采集数据时间戳没对齐的问题。
1. 准备工作
- 安装ros环境,推荐小鱼:http://fishros.com/#/fish_home,大佬的包避免了自己安装的很多坑;
- 安装livoxsdk: https://github.com/Livox-SDK/Livox-SDK;
- 安装云台相机sdk:https://wiki.amovlab.com/public/gimbalwiki/G1/doc/AmovGimbalROSSDK.html;
- 控制云台相机固定角度,matlab获得云台相机标定内参;
- 安装激光+相机联合标定算法,算法使用livox_camera_calib:https://github.com/hku-mars/livox_camera_calib;
- 安装激光+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需要几步前期准备。
- 安装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
- 安装ros串口库 (已安装可忽略),roscore查看自己系统的ros版本,安装对应库:
sudo apt-get install ros-noetic-serial
- 安装 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
。 - 编译及安装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
解决下。 - 进入已有的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
- 安装构建好了,运行:
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
- 下载安装lidar_align:https://github.com/ethz-asl/lidar_align,https://github.com/wwtx/lidar_align_wwtx
- 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/云台相机数据,保证时间戳一致性。文章来源:https://www.toymoban.com/news/detail-672932.html
rosbag record -O lidarimu.bag /mavros/imu/data /livox/lidar /amov_gimbal_ros/amov_camera_image
ros录制多个话题脚本
脚本名自拟,如record_topic.bash文章来源地址https://www.toymoban.com/news/detail-672932.html
#!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 #录制多个话题
到了这里,关于jetson orin+livox mid-70+imu+云台相机联合标定和数据采集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!