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,此标定库包含了大多数传感器之间的标定。
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