标定方法:https://adamshan.blog.csdn.net/article/details/105736726 提及的cam_lidar_calibration包。
标定環境:雷神32線雷達,筆記本攝像頭,使用簡單的rosbag record -a -o 記錄的bag
存在問題以及解決方案:
問題1:最開始使用的作者提供的雷達和圖像資料包,标定成功後自己使用32線的雷神雷射雷達和筆記本攝像頭錄制了一個雷達相機功能包,使用autoware發現自己錄制的包存在時間不同步的問題,在cam_lidar_calibration裡有時間同步函數,這要求兩個話題的時間基本一緻才能收集兩者的話題等待兩者的到達同一時間的時候進入回調函數。
解決方案:分析圖像幀數高于雷達幀數,是以在播放bag包的時候将圖像的時間戳指派給雷達達到基本的同步。
Python代碼如下所示:
import rospy
import rosbag
import sys
from std_msgs.msg import Header
bag_name = 'leishen_cam_small_2021-06-17-18-33-24.bag'
out_bag_name = 'out_leishen_cam_small_2021-06-17-18-33-24.bag'
dst_dir = '/home/ubuntu/'
with rosbag.Bag(dst_dir+out_bag_name, 'w') as outbag:
new_stamp = Header()
new_stamp2 = Header()
for topic, msg, t in rosbag.Bag(dst_dir+bag_name).read_messages():
if topic == '/usb_cam/image_raw':
new_stamp.stamp = msg.header.stamp
outbag.write(topic, msg, new_stamp.stamp)
continue
elif topic == '/lslidar_point_cloud':
new_stamp2.stamp = msg.header.stamp
msg.header.stamp = new_stamp.stamp
outbag.write(topic, msg,new_stamp.stamp)
continue
print("finished")
經過這個代碼的轉換之後,就能通過message_filters的時間同步檢測。
接下來會遇到如下提示
問題2 之前标定成功用的是velodyne雷達,這次我們使用的是雷神雷達,就會出現上述的消息不配的情況。
在檢查發現兩個的雷達資料格式并不一樣。(消息的offset)
解決辦法:查找雷神的驅動程式,将其定義的雷達消息格式複制到标定算法需要的雷達資料消息格式。
轉換成:
struct PointXYZIR
{
PCL_ADD_POINT4D;/
uint8_t intensity;
uint8_t ring;
uint64_t timestamp;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW // make sure our new allocators are aligned
}EIGEN_ALIGN16;
}
POINT_CLOUD_REGISTER_POINT_STRUCT(PointXYZIR,
(float, x, x)(float, y, y)(float, z, z)
(uint8_t, intensity, intensity)
(uint8_t, ring, ring)
(double, timestamp, timestamp))
編譯後就能進行标定了
下面一點小心得:在做資料集的時候停頓個5秒,然後注意不要抖動,給采樣留夠時間。标定闆的大小最好不要有太大的邊框。背景選擇平面較少區域。
這種就很容易雷達檢測不全平面,影響算法效果。在标定過程中每次标定算法出錯,就藥把标定算法和rviz重新開機,特殊情況時平面檢測成柱狀就要連roscore全部關閉重開。
由于标定闆制作的非常粗糙。隻有如下效果,等待後續重新制作标定闆和資料集時使用。
更新:在雷神雷達驅動關閉掉時間同步,這樣雷達就會以ROS的時間為準
發現代碼對一些雷達不适用,雷神雷達的ring沒有按順序排列,在下一篇中對代碼進行修改