【激光雷达-相机联合标定工具】lidar_camera_calibration

LiDAR-Camera Calibration using 3D-3D Point correspondences

简介

原项目来自LiDAR-Camera Calibration using 3D-3D Point correspondences,修改用于对相机和Robosense LiDAR联合标定。这里会简单写写标定步骤和我遇到的问题,我修改后的包已经放在了github上。

参考资料

其他依赖

标定步骤

camera_calibration

  1. 启动相机节点
  2. roslaunch capture_img run.launch 获取图片,使用MATLAB进行标定

lidar_camera_calibration

  1. create dir “/home/user/image_data/”
  2. 启动相机和激光雷达节点
    • roslaunch lidar_camera_calibration start_lidar_camera.launch
  3. 启动aruco节点,检查是否能识别到标志
    • roslaunch lidar_camera_calibration aruco.launch
  4. 启动标定节点
    • roslaunch lidar_camera_calibration calibration.launch

Attention

  1. 注意Aruco标志的方向,要和原项目中保持一致。

  2. sudo apt-get install ros-xxx-velodyne

  3. 将文件夹lidar_camera_calibration下的dependencies路径下的两个目录aruco_mapping和aruco_ros拷贝到ROS工作空间的src路径下,再进行编译。

  4. find_transform.launch启动ArUco mapping节点并修改其中的重映射命令使得获取正确的相机图片话题

    <remap from="/image_raw" to="xxx"/>

  5. 修改参数设置文件,主要是相机内参设置

  6. 注意一些文件被修改过(这里是因为我的两张ArUco图大小不一样,所以强行修改了源代码,如果两张图一样大小可以直接注释掉)

    1. aruco_mapping.cpp
    if(vis_marker.id == 26)
    {
        vis_marker.scale.x = 0.23;
        vis_marker.scale.y = 0.23;
    }
    else if(vis_marker.id == 582)
    {
        vis_marker.scale.x = 0.24;
        vis_marker.scale.y = 0.24;
    }
    else
    {
        vis_marker.scale.x = marker_size_;
        vis_marker.scale.y = marker_size_;
    }
    
    1. markerdetector.cpp
    if(detectedMarkers[i].id == 26)
    {
        //std::cout << "ID26" << std::endl;
        detectedMarkers[i].calculateExtrinsics ( 0.23,camMatrix,distCoeff,setYPerpendicular );
    }
    else if(detectedMarkers[i].id == 582)
    {
        //std::cout << "ID582" << std::endl;
        detectedMarkers[i].calculateExtrinsics ( 0.24,camMatrix,distCoeff,setYPerpendicular );
    }
    else
    {
        //std::cout << "wrong ID!!!!!!!!!!!!!!!!" << std::endl;
        detectedMarkers[i].calculateExtrinsics ( markerSizeMeters,camMatrix,distCoeff,setYPerpendicular );
    }
    
  7. 启动标定节点前,需要保证aruco标记能够在相机画面内可见。

  8. 注意PreprocessUtils.h的lidar线数设置

    std::vector <std::vector<myPointXYZRID *>> rings(16);

  9. 标定时注意如果是VNC远程连接工控机,需要外接键鼠直接标定,否则需要修改Corners.cpp代码。

    while (collected != 3*LINE_SEGMENTS[q]) {
    
        cv::setMouseCallback("cloud", onMouse, &_point_);
    
        cv::imshow("cloud", image_edge_laser);
        cv::waitKey(0);
        ++collected;
        std::cout << "collected:" << collected << std::endl;
        if(collected%3==1) //for VNC connect
            polygon.push_back(_point_);
    }
    

标定后使用

这个坑我也是翻了原项目的issue才发现怎么解决。
主要用到Final Rotation和Average translation作为[R|t],其中final_rotation = rotation_avg * lidarToCamera

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值