最近在做一个关于车路协同的项目,需要做一个路侧系统,传感器有摄像头和激光雷达。相机和激光雷达联合标定费了老半天劲。在此记录一下。
- 雷达时间戳不对,导致摄像头和雷达的数据无法对齐。‘’
解决办法:修改雷达驱动发布点云消息时的时间戳
- 相机内参标定可以使用MATLAB,ROS的camera_calibration包。但是使用MATLAB的工具包时只能计算出来相机内参和相机畸变参数,相机投影矩阵只能自己计算(投影矩阵和相机内参的区别也就在于投影矩阵融入了畸变参数)。python代码如下:
import cv2
import numpy as np
intrinsicmtx = np.array([[3282.04407377046, 0, 1285.36005742231],
[0, 3304.32265017942, 1048.50567777262],
[0, 0, 1]])
dist=np.array([-0.550994259036344, 0.480339307652613, 0, 0])
projectmtx,roi=cv2.getOptimalNewCameraMatrix(intrinsicmtx ,dist,(2560 ,1440),0)
print(projectmtx)
而使用ROS包则可以直接给出投影矩阵,缺点就是需要棋盘格在图片上的x、y、skew(旋转)、size(大小)的变化需要满足他的要求才可以进行标定,所以最好直接连着相机进行标定,录rosbag可能会不满足他的条件。
- ROS2订阅保存图片python代码
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
path='/home/wangbin/calib/img/' #存放图片的位置
class ImageSubscriber(Node):
def __init__(self):
super().__init__('minimal_subscriber')
self.bridge = CvBridge()
self.subscription = self.create_subscription(
Image,
'/hk_opencv_example/image_raw',
self.listener_callback,
10)
self.subscription # prevent unused variable warning
def listener_callback(self, msg):
try:
cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
except CvBridgeError as e:
print(e)
timestr = '%.6f' % (float(msg.header.stamp.sec) +