从零用自己数据跑R3LIVE

1、相机内参标定

相机选用4mm的广角相机,相机内参标定选择用最常见的棋盘格方法,首先安装ROS自带的包

sudo apt install ros-melodic-camera-calibration

用usb_cam启动相机后进行标定 。

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.06 image:=/uab_cam/image_raw camera:=/camera --no-service-check

--size:标定板的长X宽

--square:棋盘中小格的边长(m)
image:=/... : 订阅图像的话题
camera:=/camera: 相机name

标定完之后,会生成一个内参文件,Intrinsic是相机矩阵,Distortion是畸变矩阵。

Intrinsic:
[430.229,0,306.853],[0,437.83,248.373],[0,0,1]

Distortion:
[0.156215,-0.156542,-0.004833,-0.001379]

2、cam2lidar外参标定

外参标定我采用的是自动+手动的方式,先用算法进行自动配准,再用手动标定修正。

自动标定算法采用的是livox_camera_calib算法

GitHub - hku-mars/livox_camera_calib: This repository is used for automatic calibration between high resolution LiDAR and camera in targetless scenes.

此方法效果较好,但需要特定的场合,经过我的测试,选择深度差距大且平整的场景进行数据采集,例如楼道。

        自动标定算法特别依赖数据的场景,一个好的场景是能够达到不错的标定效果。之后再手动标定进行进一步修正,采用的是 SensorsCalibration,此标定库包含了大多数传感器之间的标定。

扫描二维码关注公众号,回复: 15634073 查看本文章

https://github.com/PJLab-ADG/SensorsCalibration

最终的标定结果如下图所示。 

标定完之后,会生成一个外参数矩阵

Extrinsic:
[-0.00650189,-0.999724,-0.0225309,0.0946092],[0.0035881,0.0225079,-0.999741,0.162664],[0.999972,-0.00658104,0.00344083,-0.00686066],[0,0,0,1]

3、记录rosbag

之后就可以采集数据了,需要注意的一点是,不同传感器之间的时间同步问题,因为LIVOX默认是从开始启动激光雷达开始算时间的并不是ROS系统时间,如果直接记录数据,是跑不起来的。下面给出两种解决方案。

  • 将激光雷达连接对应的网卡和系统时间同步:

ifconfig  查看网口 比如网口是 eno1

如果出现下列提示,则可以使用硬件同步
 `hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)`
 `hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)`
 `hardware-recive (SOF_TIMESTAMPING_RX_HARDWARE)`

sudo apt install ptpd
sudo ptpd -M -i eno1 -C 

当出现best master的时候,用wireshark确认一下,

wireshark --  eno1-- 搜索框搜索 ptp -- 出现Sync Message信号

之后再启动激光雷达,时间戳就是和本机同步的。

  • 直接用R3LIVE作者提供的LIVOX驱动

GitHub - ziv-lin/livox_ros_driver_for_R2LIVE

作者之间将时间戳再源码中更改了,所以用这个驱动启动直接记录数据是可行的。再记录之前需要打开livox_lidar_config.json文件中的时间同步功能。并选择一个接口名称,我这里选择的是相机的接口。

再记录数据时,可以记录压缩格式的图像topic,例如usb_cam/image_raw/compressed,这样rosbag会小一点。

4、安装编译R3LIVE

https://github.com/hku-mars/r3live

跟着官网reademe走就可以了,作者写的很详细 。

5、跑结果

主要需要改yaml文件,将得到的相机内参,外参,畸变矩阵填入。注意3*3的旋转矩阵,是4*4的变换矩阵左上3*3部分的转置。再把launch文件的topic改为自己的就可以了。

r3live_vio:
   image_width: 640
   image_height: 480
   camera_intrinsic:
      [460.799008, 0.000000, 280.624145,
    0.000000, 459.386391, 167.344099,
    0.0, 0.0, 1.0] 
   camera_dist_coeffs: [-0.107372, 0.087416, 0.001676, -0.001356, 0.000000]  #k1, k2, p1, p2, k3
   # Fine extrinsic value. form camera-LiDAR calibration.
   #转置矩阵
   camera_ext_R:       
          [-0.00650189,0.0035881,0.999972,
            -0.999724,0.0225079,-0.00658104,
            -0.0225309,  -0.999741,   0.00344083]
   # camera_ext_t: [0.050166, 0.0474116, -0.0312415] 
   camera_ext_t: [0.0946092,0.162664,-0.00686066] 
<launch>
    <!-- Subscribed topics -->
    <param name="LiDAR_pointcloud_topic" type="string" value= "/laser_cloud_flat" />
    <param name="IMU_topic" type="string" value= "/livox/imu" />
    <param name="Image_topic" type="string" value= "/usb_cam/image_raw" />
    <param name="r3live_common/map_output_dir" type="string" value="$(env HOME)/r3live_output" />
    <rosparam command="load" file="$(find r3live)/../config/my_data_r3live_config.yaml" />

    <node pkg="r3live" type="r3live_LiDAR_front_end" name="r3live_LiDAR_front_end"  output="screen" required="true"/>
    <node pkg="r3live" type="r3live_mapping" name="r3live_mapping" output="screen" required="true" />
    
    <arg name="rviz" default="1" />
    <group if="$(arg rviz)">
        <node name="rvizvisualisation" pkg="rviz" type="rviz" output="log" args="-d $(find r3live)/../config/rviz/r3live_rviz_config.rviz" />
    </group>
</launch>

之后 运行就可以建图了。

roslaunch r3live my_data_r3live_bag.launch 

猜你喜欢

转载自blog.csdn.net/HUASHUDEYANJING/article/details/131507019