ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

海康相机接入Fast-LIVO2实战:ROS驱动、时间同步与标定避坑指南

海康相机接入Fast-LIVO2实战:ROS驱动、时间同步与标定避坑指南 先交代一下背景。前段时间在做移动平台的激光-惯性-视觉融合定位最终锁定了港大MaRS实验室开源的Fast-LIVO2方案。这套系统是FAST-LIVO的升级版核心思路是把激光雷达点云、IMU和相机图像在紧耦合框架里一起优化视觉部分用的是直接法不依赖特征点匹配而是把图像反投影成灰度点云再和激光雷达构建的地图做光度误差对齐。换句话说只要你有激光雷达、IMU、以及任意一台能出图像的相机理论上都能接进这套框架。项目里传感器选了海康工业相机不是因为别的就是因为手里的存量设备就是它而且MVS SDK在Linux下支持还算成熟。但真正把海康相机接进ROS、再接进Fast-LIVO2的这个过程远没有官方readme看起来那么顺滑。SDK版本兼容、USB带宽、相机时间戳、内外参标定、像素格式、配置文件对齐……任何一个环节掉链子视觉部分就直接退化系统整体精度跟着崩。这篇文章把我从零开始部署、踩坑、调通的全过程整理出来适合手里正好有海康工业相机、想跑Fast-LIVO2做SLAM或者纯定位的朋友参考尤其是那种刚装好ROS、准备把相机节点跑起来又不知道怎么接进SLAM系统的同学。1. 环境准备先把ROS和Fast-LIVO2的底子打好1.1 ROS版本与系统选择先说要紧的Fast-LIVO2官方代码目前还是对ROS1更友好所以我直接选了Ubuntu 20.04 ROS Noetic的组合。这不是说ROS2不能用而是Noetic的资料最多、坑最少很多依赖包在apt源里都是现成的省去自己编译的麻烦。如果你是新手装ROS这一步可以用“鱼香ROS一键安装”一条命令把ROS装好再用赵虚左那套ROS入门文档过一遍基础概念效率比去翻论坛快很多。装完后务必确认环境变量正常打开终端敲roscore不报错再往下走。这个教程体系对后续接机械臂、ROS小车、slam建图导航都有用基础打牢了后面不会卡太久。硬件上主机最好有USB 3.0口给海康相机用内存建议16GB以上因为Fast-LIVO2在跑的时候会同时维护激光局部地图、全局地图和可视化点云8GB机器会非常吃紧。1.2 Fast-LIVO2源码与依赖编译Fast-LIVO2的编译依赖主要是PCL、Eigen、OpenCV、gflags、glog、yaml-cpp以及Livox雷达驱动如果你用的是Livox系列雷达。前几项用apt装就行sudo apt install libpcl-dev libeigen3-dev libopencv-dev libgoogle-glog-dev libgflags-dev libyaml-cpp-devLivox雷达驱动需要单独拉源码编译具体版本以你手里的雷达型号为准。如果用的是非Livox雷达比如Ouster或VelodyneTime同步这块需要自己多留意因为海康相机给的是图像数据不涉及激光雷达本身的驱动但点云topic是否带时间戳会直接影响后续时间同步的难度。Fast-LIVO2源码编译没什么幺蛾子按readme流程走就能过。真正要注意的是编译前确认OpenCV版本和PCL版本之间不冲突如果你机器上装过多个OpenCV版本最好在CMakeLists里显式指定路径不然编译到一半报opencv2/xfeatures2d.hpp not found这类错会很难受。我自己编译时遇到过gflags版本太新的问题解决方法是把Fast-LIVO2源码里CMakeLists.txt里显式链接的gflags改为gflags_nothreads或者直接用apt默认版本。依赖齐了之后编译Fast-LIVO2本体cd ~/catkin_ws/src git clone https://github.com/hku-mars/Fast-LIVO2.git cd .. catkin_make编译完记得source devel/setup.bash然后用官方提供的示例数据跑一遍能正常出点云和轨迹说明系统环境没问题接下来才轮到海康相机登场。2. 海康工业相机ROS驱动部署从SDK到图像话题2.1 MVS SDK安装与平台验证海康机器人官网的Linux MVS SDK是一个deb安装包不同型号相机对应的SDK版本大同小异。安装命令sudo dpkg -i MVS-2.x.x_xxxx_linux_amd64.deb安装完成后SDK默认放在/opt/MVS。启动MVS viewer前需要先Source环境变量source /opt/MVS/setup.sh然后运行/opt/MVS/bin/MVS.sh如果能正常看到相机画面并调节曝光等参数说明SDK工作正常。这一步很关键很多问题如果在这里就暴露后面就少走弯路。比如预览画面闪烁、掉线多半是USB供电或带宽问题预览正常但程序里打不开相机基本就是路径权限或库环境变量问题。SDK装好之后还有个容易被忽略的点让当前用户拥有访问相机设备的权限。MVS的udev规则一般不会自动安装相机插上后如果报权限不足手动加一条udev规则sudo nano /etc/udev/rules.d/90-camera.rules # 内容根据相机VID/PID写海康相机一般类似 SUBSYSTEMusb, ATTRS{idVendor}xxx, MODE:0666然后sudo udevadm control --reload sudo udevadm trigger。这个操作做完之后普通用户就能直接打开相机否则每次都要sudo后面启动ROS节点会很麻烦。2.2 相机驱动节点的选型与编译海康相机接入ROS常见方案有三种官方SDK自带示例、GitHub上的开源驱动包、自己写一个发布节点。我测试下来最省事的是直接在GitHub搜“hikrobot_camera”或者用MVS SDK的C接口自己写一个几十行的发布器因为开源驱动包的相机型号兼容性参差不齐有些包还是基于旧版SDK编译的新版SDK升级后接口变了编译直接报错。我这里用的是一个基于MVS SDK的简单C节点发布/camera/image_raw和/camera/camera_info核心步骤分四块初始化SDK、枚举设备、开启流、循环取图并转成sensor_msgs::Image发布。取图部分伪代码如下// 关键在于这一行配置相机像素格式 MVCC_INTVALUE stParam; memset(stParam, 0, sizeof(MVCC_INTVALUE)); MV_CC_GetIntValue(handle, PayloadSize, stParam); // 循环取帧 MV_FRAME_OUT_INFO_EX stInfo; unsigned char* pData (unsigned char*)malloc(stParam.nCurValue); MV_CC_StartGrabbing(handle); while (ros::ok()) { MV_CC_GetOneFrameTimeout(handle, pData, stParam.nCurValue, stInfo, 1000); // stInfo 里有宽高、像素格式 // 把 pData 填进 sensor_msgs::Image注意编码和大小 // image.header.stamp ros::Time::now() 或相机时间戳 image_pub_.publish(image_msg); }编译这个节点时需要在CMakeLists里链接MVS的库路径一般是/opt/MVS/lib头文件在/opt/MVS/include。还有一个常见的坑MVS的动态库依赖一些系统so文件比如libjpeg.so在新版Ubuntu上偶尔缺失运行时报error while loading shared libraries用ldd查一下缺哪个就补装哪个。2.3 参数配置与图像话题验证相机节点跑起来后第一步是确认图像话题是否正常rostopic hz /camera/image_raw rqt_image_view /camera/image_raw这里重点检查两件事帧率是否稳定图像色彩/亮度是否正常。帧率不稳定可能是USB带宽不足或曝光设置不合理画面全黑全白、严重过曝多半是像素格式或曝光时间设置问题。Fast-LIVO2对图像质量要求不高但对图像时间戳的一致性要求很高所以发布图像时Header时间戳不要随手填ros::Time::now()优先用相机自带的硬件时间戳或者至少让图像、IMU、点云时间戳来源一致否则后面做时间同步会痛苦到怀疑人生。像素格式方面Fast-LIVO2里默认处理的是RGB或者灰度图如果相机输出的是BGR格式记得在发布时转成RGB或者直接在配置文件里注明编码。颜色通道弄反视觉模块照样能跑但灰度化后的图像亮度关系会乱掉光度误差优化出来的结果会很奇怪。我实际测试中发现曝光时间设成自动曝光足够应付室内场景但户外户外如果光线变化剧烈自动曝光的帧间亮度跳变会让直接法很受伤建议固定曝光或限制自动曝光范围。另外工业相机常默认开启去噪、锐化等ISP处理这些最好全部关掉SLAM系统需要的是原始图像经过美化的图像反而会引入额外延迟和伪影。3. 把海康相机塞进Fast-LIVO2配置、时间同步与运行模式3.1 配置文件的每一项要改什么Fast-LIVO2的config目录下每个数据集对应一个yaml文件核心是告诉系统激光雷达、IMU、相机分别是什么以及彼此之间的内外参关系。接入海康相机后我主要改这几个字段image_width和image_height必须和相机实际分辨率一致改错的话内参直接错位。camera_intrinsic相机内参fx、fy、cx、cy单位是像素。内参来源可以是MVS里的标定结果也可以自己用棋盘格跑OpenCV标定。camera_dist_coeffs畸变系数Fast-LIVO2用的是radtan模型的k1、k2、p1、p2有些标定工具输出的是plumb_bob或者fisheye模型顺序搞错视觉会立刻偏。imu_to_camIMU到相机的旋转平移矩阵这个必须用标定工具算手动量出来的误差会直接体现在地图偏移上。话题名称lidar_topic、imu_topic、camera_topic都要和实际一致。这里提一句Fast-LIVO2对畸变模型很敏感。海康相机出厂内参一般存在设备内存里但MVS导出的内参格式未必是OpenCV/radtan顺序。我当时直接用官方内参跑发现视觉残差很大图像和点云投影对不上后来改用棋盘格Kalibr重新标定一遍才恢复正常。3.2 时间同步与数据采集要点Fast-LIVO2本质是传感器融合系统最怕的就是传感器时间不同步。激光雷达和IMU一般通过设备驱动自带时间戳海康相机的图像时间戳则要看驱动实现。如果你和我一样是分别启动的节点那么图像时间戳默认是接收到图像那一刻的ROS时间如果系统负载高图像处理和发布之间会有几百毫秒到几秒的延迟Fast-LIVO2在图像和地图对齐时就会找不到对应时间的位姿。解决办法有两个在相机驱动节点里把image.header.stamp手动设置为相机SDK返回的硬件时间戳并转换成ROS时间这样能最大程度保证图像触发时刻的真实性。跑数据采集时用rosbag record同步录制rosbag record -O fastlivo2_data \ /livox/lidar /imu/data /camera/image_raw回放时用rosbag play --clock再启动Fast-LIVO2。这样至少保证数据源是在同一个时间基准下录的。另外如果你用的是USB相机USB3.0的传输延迟总体可控但如果相机上面同时挂着别的USB设备或者主板USB控制器质量一般实际延迟会抖动。建议相机独占一个USB控制器的口别和鼠标键盘混插。有人问PTP、IEEE 1588能不能用海康部分GigE相机支持但USB相机基本没有硬件同步能力纯靠软件对齐实用主义一点的做法就是保证各节点时间戳都使用同一主机的ROS时间并尽量降低处理延迟。3.3 三种运行模式与效果验证Fast-LIVO2有两种常用启动方式一种是完整建图模式同时开启LIO和视觉融合另一种是纯定位模式。官方源码里运行时主要用localization_only模式做重定位但我实际建图阶段还是用完整融合模式定位阶段再用localization_only加载已有地图。启动完整建图的命令通常长这样roslaunch fast_livo2 fast_livo2.launch config:config/your_camera_lidar.yaml跑起来之后RVIZ里能看到激光雷达实时构建的地图点云以及相机图像反投影后的着色点云。如果配置正确、外参标定精度足够你会看到两个点云高度重叠RGB颜色贴着激光雷达扫描的墙体边缘走如果图像点云和激光点云有明显的错位、偏移先别怀疑算法优先检查相机外参和时间戳。Fast-LIVO2官方还提供了轨迹保存功能是在yaml配置里打开save_path和save_frame_count跑完会输出位姿轨迹文件可以用EVO之类的工具评估精度。在测试的时候哪怕只是拿着设备在房间里走一圈也能明显看出视觉融合之后的地图精度比纯LIO高尤其是在长直走廊这类几何特征不明显的区域。4. 避坑指南海康相机×Fast-LIVO2的典型问题与排查4.1 SDK崩溃与“找不到共享库”这是本地上机最容易遇到的第一关。MVS SDK安装后运行相机程序提示无法加载libMvCameraControl.so十有八九是没设环境变量。在~/.bashrc里加上export LD_LIBRARY_PATH/opt/MVS/lib:$LD_LIBRARY_PATH但还不够新版MVS SDK还依赖一些第三方so比如libjpeg.so.8等Ubuntu 22.04以上版本默认没有老版本libjpeg需要手动安装兼容库sudo apt install libjpeg8-dev另一个容易被忽略的是MVS SDK和ROS节点必须用同一个版本的SDK库。如果你用别人编译好的驱动包而他们用的SDK版本和你机器上装的MVS版本不一致运行时会出现SDK版本不匹配或直接段错误这种情况建议直接用源码在当前环境重新编译节点。4.2 图像时间戳和IMU/点云不同步Fast-LIVO2在视觉对齐时需要查询图像时刻附近的历史IMU和激光帧如果图像时间戳比实际采集时间晚很多视觉残差会呈周期性跳动地图出现重影。排查方法很简单把图像话题的header.stamp和IMU话题并排打印出来看时间差如果差值有几百毫秒级别就说明驱动发布延迟过大。我用过的海康USB相机在MVS SDK取帧回调里可以直接拿到一个nHostTimeStamp或nDeviceTimeStamp不同型号字段名不同。把该时间戳转换为UNIX时间后填进图像消息头同步问题基本能解决。如果是录制好的rosbag则要保证回放时--clock开启并且相机节点的时间以回放时间为主。4.3 图像和激光点云对不齐、视觉退化这个问题我在调通系统后遇到过很多次有一个很关键的细节Fast-LIVO2的配置里imu_to_cam表示的是IMU坐标系到相机坐标系的变换写的是矩阵形式里面有R和t。标定出来的外参矩阵如果方向反了图像点云会整体偏移一大块。另一个常见问题是畸变系数顺序。OpenCV标定输出的是k1, k2, p1, p2, k3而Fast-LIVO2使用的模型是标准radtan也就是k1, k2, p1, p2如果把p1, p2和k1, k2顺序填反图像边缘会明显扭曲。我当时就是用OpenCV直接拿到的畸变参数填进去结果视觉残差大得离谱后来手动调整顺序才正常。还有一点是图像分辨率。如果你在内参标定时用的是1920×1080但运行时相机配置成1440×1080内参没有同步缩放整个图像的投影关系就全错了。配置里image_width、image_height、相机内参、像素格式这几个参数必须保持一致最好在标定那一步就把分辨率固定运行时不做任何切换。4.4 常见问题速查表问题现象可能原因排查/解决相机节点打不开设备权限不足 / SDK环境变量未配置加udev规则source /opt/MVS/setup.sh图像帧率低或掉线USB带宽不足、供电不稳换USB3.0口降低分辨率关闭自动曝光图像时间戳跳变驱动用ROS时间替代硬件时间戳使用SDK硬件时间戳填进header视觉点云和激光点云错位严重外参标定错误 / 畸变系数顺序不对用Kalibr重新标定检查k1k2p1p2顺序图像模糊导致视觉退化曝光时间过长、ISP去噪开启缩短曝光关闭去噪锐化Fast-LIVO2启动后无图像输入话题名不对 / 图像编码不支持rostopic list核对改成RGB或Mono8输出针对这个表里的问题我自己最深的体会是把所有传感器的时间戳来源先统一再谈标定和配置。时间不同步的问题如果不在数据采集前解决后面排查起来会非常痛苦而且会反复怀疑算法本身有问题实际上坑都在设备驱动上。结尾最后给打算入坑的朋友一个非常实用的建议真机联调前先用rosbag record录一段同时包含点云、IMU、图像的包然后离线跑Fast-LIVO2。离线模式方便调试配置改完重新跑一遍就能对比效果效率比每次抱着设备在桌子前走来走去高得多。我后面做海康相机和Fast-LIVO2的联合测试时基本都是在屋里录几段不同运动状态的数据包回到电脑前反复调参数。另外一个很小的技巧如果只是想验证视觉链路通不通不需要把所有传感器都接好再测。把相机节点启动后手动播放一个之前录好的激光点云bag再跑Fast-LIVO2图像和已有地图的对齐关系一眼就能看出来这比直接跑真机更容易定位问题出在哪一环。Fast-LIVO2这套框架上限很高但底层的传感器质量、时间同步、标定精度决定了它到底能发挥多少希望这篇实战记录能帮你少熬几个夜。
返回列表