【Ubuntu18.04】激光雷达与相机联合标定(Livox+HIKROBOT)(一)

Livox+HIKROBOT联合标定

  • 引言
  • [1 海康机器人HIKROBOT SDK二次开发并封装ROS](#1 海康机器人HIKROBOT SDK二次开发并封装ROS)
    • [1.1 介绍](#1.1 介绍)
    • [1.2 安装MVS SDK](#1.2 安装MVS SDK)
    • [1.3 封装ROS packge](#1.3 封装ROS packge)
  • [2 览沃Livox SDK二次开发并封装ROS](#2 览沃Livox SDK二次开发并封装ROS)
  • [3 相机雷达联合标定](#3 相机雷达联合标定)
    • [3.1 环境配置](#3.1 环境配置)
      • [3.1.1 安装依赖------PCL 安装](#3.1.1 安装依赖——PCL 安装)
      • [3.1.2 安装依赖------Eigen 安装](#3.1.2 安装依赖——Eigen 安装)
      • [3.1.3 安装依赖------Ceres-solver 安装](#3.1.3 安装依赖——Ceres-solver 安装)
      • [3.1.4 下载源码,编译准备](#3.1.4 下载源码,编译准备)
      • [3.1.5 程序节点概括](#3.1.5 程序节点概括)
    • [3.2 相机内参标定](#3.2 相机内参标定)
      • [3.2.1 前期准备](#3.2.1 前期准备)
      • [3.2.2 cameraCalib标定](#3.2.2 cameraCalib标定)
        • [**`报错`** (若无报错则跳过此步骤)](#报错 (若无报错则跳过此步骤))

引言

Livox Lidar + HIKROBOT Camera 联合标定

参考链接:相机雷达标定文档

安装ROS环境,参考笔者的博客:【ROS】Ubuntu18.04安装Ros

1 海康机器人HIKROBOT SDK二次开发并封装ROS

1.1 介绍

参考链接:海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

海康的相机没有ros驱动,且对linux开发不太友好(但支持windows),因此需要重写了sdk接口,并创建了ros节点封装成ros包,方便linux环境下ros的调用

完整版ros驱动:https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package

  • 即使海康的相机是usb传输数据,但是不同于其他usb设备的调用,海康的相机并不会在/dev/目录下映射ttyUSB或video1这样的设备,所以不能用open/read/write这样的system call的方式打开设备,所以https://github.com/ros-drivers/usb_cam这样的usb ros驱动无法支持。因此只能自己开发ros驱动包。
  • 海康的打开设备的方式在MvUsb3VDevice.h和MvGigEDevice.h中实现(分别对应usb3.0相机和以太网相机),具体过程并没有开源,只提供了相应的so文件,海康提供了统一的接口MV_CC_EnumDevices实现对两种设备(usb3.0接口和以太网接口)的调用,因此开发一个ros驱动包是两种相机都适用的。海康的相机sdk虽然不开源,但是提供了armhf和aarch64架构编译的so文件。

1.2 安装MVS SDK

参考笔者的博客:【HIKROBOT】海康机器人:工业相机SDK二次开发

1.3 封装ROS packge

海康威视工业相机sdk的ros驱动包的安装步骤:

step1:安装

python 复制代码
# 创建catkin工作空间
mkdir ws_hk_mvs_ros  
# 克隆源码到工作空间(海康机器人的ROS软件包)
git clone https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package.git ws_hk_mvs_ros/src
cd ws_hk_mvs_ros
# 编译Catkin工作空间中的ROS包
catkin_make

step2:直接运行node
需要先启动roscore

python 复制代码
source ./devel/setup.bash 
rosrun hk_camera hk_camera_node

step3:launch启动node

python 复制代码
source ./devel/setup.bash 
roslaunch hk_camera hk_camera.launch

step4:launch启动node和rviz node

用 rviz 订阅 /hk_camera_node/image_raw 查看照片

python 复制代码
source ./devel/setup.bash 
roslaunch hk_camera hk_camera_rviz.launch


2 览沃Livox SDK二次开发并封装ROS

参考笔者博客:【Ubuntu18.04】Livox Tele-15使用教程
安装Livox环境和驱动

python 复制代码
# 安装Livox_SDK
git clone https://github.com/Livox-SDK/Livox-SDK.git
cd Livox-SDK
cd build && cmake ..
make
sudo make install

# 安装livox_ros_driver
cd  Livox-SDK  # 进入Livox-SDK目录
git clone https://github.com/Livox-SDK/livox_ros_driver.git ws_livox/src
cd ws_livox   # 进入工作空间
catkin_make

3 相机雷达联合标定

3.1 环境配置

3.1.1 安装依赖------PCL 安装

参考链接:Ubuntu18.04安装PCL 1.9.1(图文详解,附踩坑和测试)

step1:安装依赖

python 复制代码
sudo apt-get update
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common
sudo apt-get install libflann1.8 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev
sudo apt-get install mono-complete
sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre

step2:下载源码

建议安装1.9.1

python 复制代码
git clone https://github.com/PointCloudLibrary/pcl.git

step3:编译源码

python 复制代码
cd pcl
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr \ -DBUILD_GPU=ON-DBUILD_apps=ON -DBUILD_examples=ON \ -DCMAKE_INSTALL_PREFIX=/usr ..
python 复制代码
make

step4:安装

python 复制代码
sudo make install

step5:PCLVisualizer(需要可以安装)

python 复制代码
sudo apt-get install libopenni-dev
sudo apt-get install libopenni2-dev

3.1.2 安装依赖------Eigen 安装

简单命令安装

python 复制代码
sudo apt-get install libeigen3-dev

3.1.3 安装依赖------Ceres-solver 安装

下载ceres-solver-1.14.0

python 复制代码
git clone https://github.com/ceres-solver/ceres-solver

依赖安装

python 复制代码
 sudo apt-get install cmake
 sudo apt-get install libgoogle-glog-dev
 sudo apt-get install libatlas-base-dev
 sudo apt-get install libeigen3-dev
 sudo apt-get install libsuitesparse-dev
 sudo add-apt-repository ppa:bzindovic/suitesparse-bugfix-1319687
 sudo apt-get update
 sudo apt-get install libsuitesparse-dev

安装 ceres-solver

python 复制代码
tar zxf ceres-solver-1.14.0.tar.gz
mkdir ceres-bin && cd ceres-bin
cmake ../ceres-solver-1.14.0
make -j3
make install

至此需要的库安装完毕

3.1.4 下载源码,编译准备

python 复制代码
# 进入工作空间
cd ws_livox/src
git clone https://github.com/Livox-SDK/livox_camera_lidar_calibration.git 
cd ..    # 返回上一级目录
catkin_make
source devel/setup.bash
  • 此时工作空间的目录结构为:

3.1.5 程序节点概括

此项目包括如下节点:

  1. cameraCalib - 标定相机内参
  2. pcdTransfer - 将雷达点云rosbag转换成PCD文件
  3. cornerPhoto -获得照片角点
  4. getExt1 - 计算外参节点1,只优化外参
  5. getExt2 - 计算外参节点2,同时优化内参和外参
  6. projectCloud - 把雷达点云投影到照片上 colorLidar - 雷达点云着色

以下程序节点中如果想修改launch文件,需要到src/calibration/launch文件夹中找对应的launch文件。

3.2 相机内参标定

3.2.1 前期准备

  • 准备一块有黑白棋盘格的标定板(如下所示,可以打印出来)
  • 笔者实际用的标定版规格是:

3.2.2 cameraCalib标定

  • 要准备20张以上的照片数据,各个角度和位置都要覆盖,拍摄的时候不要距离太近(3米左右),如下图所示。

直接使用HIKROBOT的上位机来抓取并保存图片

选择指定的保存路径


抓取图片

  • 以下数据使用官网下载的数据集:

测试数据下载:data.zip

  • 获得照片数据后,配置cameraCalib.launch中对应的路径和参数,默认是把照片数据放在data/camera/photos下,然后在data/camera/in.txt中写入所有需要使用的照片名称,如下图所示


输入指令开始标定

python 复制代码
#进入工作空间
cd ws_livox/
source devel/setup.bash
roslaunch camera_lidar_calibration cameraCalib.launch
  • 成功运行显示如下:
  • 标定结果中会保存在data/camera/result.txt中,包括重投影误差,内参矩阵和畸变纠正参数。

内参结果

  • 一个3x3的内参矩阵(IntrinsicMatrix)
  • 5个畸变纠正参数 k1, k2, p1, p2, k3
报错 (若无报错则跳过此步骤)

解决方法:

参考链接:
解决 cv_bridge 与 opencv4 版本冲突问题

  • 下载 cv_bridge

下载 noetic 版本的 cv_bridge。(noetic 版本的 cv_bridge 在 melodic 下也能使用,不过要做一些修改,后续会说明)

下载地址:https://github.com/ros-perception/vision_opencv/tree/noetic

下载完成后,将 cv_bridge 拷贝到 ros 工作空间的 src 文件夹下。

此时工作空间的目录结构为:

为了不影响原来的包,将该文件夹重命名为 cv_bridge_new,并且将cv_bridge_new文件夹下 CMakeLists.txt 文件中 project 名称修改为 cv_bridge_new:

  • 在 CMakeLists.txt 文件中指定我们自己的功能包中所用的 opencv4:

  • 并且修改 package.xml 中包的名称:

  • 报错1:
  • 解决方法:

直接修改 cv_bridge_newCMakeLists.txt 文件:

python 复制代码
...
if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
# Debian Buster
find_package(Boost REQUIRED python3)
...
  • 报错2:
  • 解决方法:

修改 cv_bridge_new/src/module.hpp 文件下 void* do_numpy_import()函数为 (注意*要删除)

python 复制代码
static void do_numpy_import( )
{
    import_array( );
}

再次编译:

python 复制代码
catkin_make


再次输入指令开始标定

python 复制代码
#进入工作空间
cd ws_livox/
source devel/setup.bash
roslaunch camera_lidar_calibration cameraCalib.launch
相关推荐
烟锁池塘柳017 小时前
Camera ISP Pipeline(相机图像信号处理管线)
图像处理·数码相机·信号处理
3DVisionary17 小时前
XTOP3D的DIC技术在极端条件下的应用解决方案
数码相机·3d·航空工业·全场应变测量·航空机匣内部四测头同步测量·反射镜辅助dic观测·四测头方案
视觉人机器视觉2 天前
3D与2D机器视觉机械臂引导的区别
人工智能·数码相机·计算机视觉·3d·视觉检测
LabVIEW开发3 天前
LabVIEW开发中的电机控制与相机像素差
数码相机·labview
pixle04 天前
Three.js 快速入门教程【二】透视投影相机
开发语言·javascript·数码相机
go54631584654 天前
python实现将RGB相机与事件相机的照片信息进行融合以进行目标检测
python·数码相机·目标检测
看星猩的柴狗4 天前
ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测
数码相机
彩云的笔记4 天前
相机快门 deepseek
数码相机
视觉人机器视觉5 天前
机器视觉检测中,2D面阵相机和线扫相机的区别
人工智能·数码相机·计算机视觉·3d·视觉检测
虾球xz5 天前
游戏引擎学习第110天
数码相机·学习·游戏引擎