Livox Lidar  + HIKROBOT Camera系列

最近在开发相机和激光雷达融合的slam算法,主要用于三维重建,想实时的得到彩色点云地图,传感器选择了海康威视的工业相机和大疆的固态激光雷达。

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

Livox Lidar+海康Camera实时生成彩色点云

Livox Lidar+海康Camera实时三维重建生成RGB彩色点云地图


前言

海康的相机没有ros驱动,而且对linux开发不太用好(windows的支持还是不错的),就重写了sdk接口,并创建了ros节点封装成ros包,方便linux环境下ros的调用,用于开发后面的算法,完整版ros驱动:https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package,请自取。

本文主要是对sdk的封装过程,和创建ros驱动包的开发过程记录。

虽然海康的相机是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驱动包是两种相机都适用的

如果你的相机在/dev/下有映射(比如笔记本自带的摄像头一般是/dev/video1),可以使用https://github.com/ros-drivers/usb_cam这个驱动包,如果是海康这样的方式,请使用我的ros驱动包https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package。

海康的相机sdk虽然不开源,但是提供了armhf和aarch64架构编译的so文件,之后我会移植到jetson上。

环境

  • Ubuntu 18.04
  • 机器视觉工业相机客户端MVS V2.1.0(Linux)

  • 相机型号:MV-CE060-10UC

适用于海康机器视觉工业相机系列(以太网传输和usb传输同样适用),相机接入pc或开发板的usb3.0接口或网口。

下载海康mvs sdk

https://www.hikrobotics.com/machinevision/service/download?module=0,选linux的最新版:机器视觉工业相机客户端MVS V2.1.0(Linux)

解压

MVS_Linux_STD_V2.1.0_201228.zip解压后,目录中含有多种架构已经编译好并打包的*.dpkg包,另外还有tar.gz(也含编译好的so和bin文件)。

MVS-2.1.0_aarch64_20201228.deb      MVS-2.1.0_i386_20201228.deb

MVS-2.1.0_aarch64_20201228.tar.gz   MVS-2.1.0_i386_20201228.tar.gz

MVS-2.1.0_armhf_20201228.deb        MVS-2.1.0_x86_64_20201228.deb

MVS-2.1.0_armhf_20201228.tar.gz     MVS-2.1.0_x86_64_20201228.tar.gz

MVS-2.1.0_arm-none_20201228.tar.gz

树莓派选armhf架构,jetson选aarch64,pc机选x86_64,i386是32位pc。

armhf和aarch64区别就是armhf是armv7架构,如树莓派。aarch64是armv8架构,如jetson nano。

arm-none只有Samples,没有编译好的bin,也没有dpkg包,海康也没有提供源码,所以用不上。

所有的tar包都包含另一个MVS.tar.gz,继续解压后是海康打包的so和Samples。
Samples说明参照MVS/Samples/README-CH,安装完sdk后可以在每个sample子目录敲make编译生成可执行程序。

因为海康没有提供源码,只提供编译好的so来给我们调用,所以下面的tar包安装也不用编译。

dpkg包安装(二选一)

dpkg -i MVS-2.1.0_x86_64_20201228.deb

安装在 /opt/MVS下,这里有个问题,运行需要去cd /opt/MVS/bin/ 再./MVS运行。

  • 可选操作:

虽然环境变量配置了lib目录,但是没有配置bin目录,而且即使配置了bin目录,在其他目录也会运行失败,因为MVS调用的很多lib没有在/opt/MVS/lib目录,而在bin目录,可能是担心lib重名吧。

可以按如下方法修改方法,找到对应行:

vim ~/.bashrc

export PATH=$PATH:/opt/MVS/bin:

export MVCAM_COMMON_RUNENV=/opt/MVS/lib

export LD_LIBRARY_PATH=/opt/MVS/lib/64:/opt/MVS/lib/32:/opt/MVS/bin:$LD_LIBRARY_PATH

下划线部分是我增加的内容,重启终端生效。

任意目录命令行敲MVS打开设备。

上面谨慎修改,因为/opt/MVS/bin目录加入到LD_LIBRARY_PATH后,会同样将这个目录里的libQt5*等库引入全局可见,跟系统安装的libQt版本不一致,比如我的rviz在调用Qt这个库的时候出现了不匹配打不开的情况,使用系统自带的则正常打开,所以谨慎修改。

tar包安装(二选一)

tar -xvf MVS-2.1.0_x86_64_20201228.tar.gz
cd MVS-2.1.0_x86_64_20201228
sudo bash setup.sh

可选操作同上。

编译demo

解压tar包,包含另一个MVS.tar.gz,继续解压,找到Samples目录。

Samples说明参照MVS/Samples/README-CH,安装完sdk后可以在每个Sample子目录敲make编译生成可执行程序。

如:
cd Samples/64/ImageProcess/
make
./ImageProcess

[device 0]:
Device Model Name: MV-CE060-10UC
UserDefinedName:

Please Intput camera index: 0                     #  只有一个相机此处填0,用于指定相机
Now you GetOneFrame, Width[3072], Height[2048], nFrameNum[0]

0     to do nothing
    1     to convert RGB
    2     to save as BMP                                 # 2 为保存照片到当前目录
Please Input Index: 2
save image succeed

Press enter to exit.
打开当前目录的image.bmp照片,说明sdk的开发环境测试成功。
如果只是想使用相机的采集的topic做算法开发,可以不用往下看了,直接clone ros的驱动包https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package,参照Readme安装即可。

二次开发sdk接口,增加常用功能,方便ros调用

1 代码开发

代码详见https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package/blob/main/hk_camera/src/hk_camera.cpp
简要说明如下:

class HkCam
{
public:MV_CC_DEVICE_INFO_LIST stDeviceList;     // 列出所有海康相机设备void *handle;                            // 打开设备的句柄unsigned char *pData;                    // 用于存储相机原始数据 unsigned char *pDataForRGB;              // 将原始数据转为raw的RGB通道数据,后续发ros topic或存储int nRet;                                // mvs sdk调用的返回值MVCC_INTVALUE stParam;                   // 取回相机采集数据的结构体,包含pDataMV_CC_PIXEL_CONVERT_PARAM stConvertParam;// 用于接收转化后数据的结构体,包含pDataForRGBHkCam();                                 // 相机接口构造函数,相机参数初始化~HkCam();                                // 相机接口析构函数,调用shutdown()void start();                            // 打开相机,配置参数void shutdown();                         // 释放开辟的内存空间和设备句柄bool grab_rgb_image();                   // 采集一帧数据并转为rgb格式的数据
private:bool PrintDeviceInfo(MV_CC_DEVICE_INFO *pstMVDevInfo); //打印检测到的所有设备信息
};

2 后续

之后会补充一个相机参数配置函数,大部分参数可以默认,这个相机最需要配置参数是曝光时间:
为了让相机使用更流畅,帧率达到20帧,需要关闭自动调整曝光时间,改为手动,并配置一个合理值(如 20000),太大会使相机帧率下降,太小照片会特备暗,自动的话也会降低帧率。

ROS  package开发

请先完成ros的安装。
提示:https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package/是经过下面开发后的最终结果,所以下面的命令不用在HIKROBOT-MVS-ROS-package中操作,HIKROBOT-MVS-ROS-package的安装参考代码中的README。

1 创建ros工作区,初始化一个ros package,指定依赖包

mkdir  -p ~/ws_hk_camera/src
cd ~/ws_hk_camera/src
catkin_create_pkg hk_camra roscpp std_msgs  image_transport sensor_msgs  std_srvs # hk_camra 是包名,后面的参数是依赖的其他ros包

初始化后的样子:

ws_hk_camera/src
└── hk_camera  # 包目录├── CMakeLists.txt        # catkin_create_pkg 自动生成的,需要更改引入自己的代码文件,供catkin_make编译使用├── include               # catkin_create_pkg 自动生成的头文件目录,可以把海康sdk的头文件拷贝过来│   └── hk_camera         # catkin_create_pkg 自动生成的├── package.xml           # catkin_create_pkg 自动生成的,指定依赖的ros包,可以修改维护者的个人信息└── src                   # 源码目录

2 代码开发

完整的目录:

ws_hk_camera/src
└── hk_camera  # 包目录├── CMakeLists.txt        # catkin_create_pkg 自动生成的,需要更改引入自己的代码文件,供catkin_make编译使用├── include               # catkin_create_pkg 自动生成的头文件目录,把海康sdk的头文件拷贝过来│   ├── CameraParams.h    # 海康sdk的头文件│   ├── hk_camera         # catkin_create_pkg 自动生成的│   ├── MvCameraControl.h # 海康sdk的头文件│   ├── MvErrorDefine.h   # 海康sdk的头文件│   └── PixelType.h       # 海康sdk的头文件├── launch                # roslaunch文件,批量启动node│   ├── hk_camera_rviz.launch │   └── hk_camera_view.launch├── package.xml           # catkin_create_pkg 自动生成的,指定依赖的ros包,可以修改维护者的个人信息├── rviz_cfg              # hk_camera_rviz.launch 的rviz节点的配置文件│   └── hk_camera.rviz└── src                   # 源码目录├── hk_camera.cpp     # 封装海康sdk的类的实现├── hk_camera.h       # 封装海康sdk的类头文件├── hk_camera_node.cpp# ros节点类的实现└── hk_camera_node.h  # ros节点类的头文件

ros node的实现详见https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package/blob/main/hk_camera/src/hk_camera_node.cpp
简要说明如下:

class HkCamNode
{
public:ros::NodeHandle node_;                              # 定义ros节点:/hk_camera_noderos::ServiceServer service_start_, service_stop_;   # ros serviec-client模型sensor_msgs::Image img_msg;                         # 照片的消息类型:Imageimage_transport::CameraPublisher image_pub_;        # 照片话题:/hk_camera_node/image_raw
/image_rawHkCam cam_;                                         # 二次开发的海康sdk接口HkCamNode();                                        # 创建ros节点~HkCamNode();bool service_start_cap(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res);#打开服务请求bool service_stop_cap(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res); #停止服务请求bool send_image();                                  # 调用HkCam的grab_rgb_image封装成sensor_msgs::Image在topic上实现发照片消息bool spin();                                        # 持续触发
};int main(int argc, char **argv)
{ros::init(argc, argv, "hk_camera");  # ros程序初始化,定义节点名为hk_camera// 启动时可以更改节点名字,如hk_camera_rviz.launch中定义的节点为hk_camera_node会替换此处的第三个参数HkCamNode a;                         # 创建ros节点a.spin();                            # 持续触发return EXIT_SUCCESS;
}

3 修改CmakeLists.txt

ws_hk_camera/src/hk_camera/CMakeLists.txt 由  catkin_create_pkg hk_camra roscpp std_msgs  image_transport sensor_msgs  std_srvs 生成,但是很多依赖并没有打开,处于注释状态,需要取消注释,并引用自己的cpp和h文件,修改后如下:

cmake_minimum_required(VERSION 3.0.2)   # cmake要求的最低版本,cmake --version查看cmake版本
project(hk_camera)                      # 工程名称## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)       # 代码是否使用了c++11新特性# 依赖
find_package(catkin REQUIRED COMPONENTS # 查找依赖的其他ros包image_transportroscppsensor_msgsstd_msgsstd_srvs
)
catkin_package( #这部分注释必须打开,不然出错  https://zhuanlan.zhihu.com/p/299148013INCLUDE_DIRS include                    LIBRARIES CATKIN_DEPENDS image_transport roscpp sensor_msgs std_msgs std_srvs
)# include
include_directories(                    # 头文件所在目录include                               # ws_hk_camera/src/hk_camera/include${catkin_INCLUDE_DIRS}
)################## 自定义内容 ##################
# 按下列顺序指定link_directories、add_executable、target_link_libraries
# lib目录
link_directories(/opt/MVS/lib/64)       # 指定海康sdk的lib目录
# 源cpp 和 输出exe
add_executable(${PROJECT_NAME}_node src/hk_camera_node.cpp src/hk_camera.cpp)  # 指定可执行程序名称和我们的cpp文件
# 指定要链接的so文件
target_link_libraries(${PROJECT_NAME}_node${catkin_LIBRARIES}                   MvCameraControl                       # 海康sdk的so文件
)

4 安装和使用

详见https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package/blob/main/README.md

5 rviz查看topic

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)相关推荐

  1. Livox Lidar+海康Camera实时生成彩色点云

    Livox Lidar  + HIKROBOT Camera系列 最近在开发相机和激光雷达融合的slam算法,主要用于三维重建,想实时的得到彩色点云地图,传感器选择了海康威视的工业相机和大疆的固态激光 ...

  2. Livox Lidar+海康Camera 基于loam的实时三维重建生成RGB彩色点云

    Livox Lidar  + HIKROBOT Camera系列 最近在开发相机和激光雷达融合的slam算法,主要用于三维重建,想实时的得到彩色点云地图,传感器选择了海康威视的工业相机和大疆的固态激光 ...

  3. 如何在LabVIEW中进行海康机器视觉算法平台VisionMaster二次开发

    目录 1.导言 庞大的NI LabVIEW软件平台 LabVIEW 平台的特点 海康机器人的视觉算法平台VisionMaster特点 如何在LabVIEW中进行海康视觉算法平台二次开发 2.方法与步骤 ...

  4. Linux环境中对海康威视工业相机SDK进行二次开发(QT+CMake+Opencv+海康SDK)

    关于在Windows环境中对海康威视工业相机SDK进行二次开发的话,可以参考这两篇博客. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一) 海康威视工业相机SDK二 ...

  5. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

    最近在做一个项目,涉及到工业相机,需要对其进行二次开发.相机方面选择了海康威视,网上关于海康威视工业相机SDK的开发资料很少,官方文档里面虽然写的是支持C++开发的,但其实是C.自己也摸索了一段时间, ...

  6. 海康摄像头二次开发python_python实现海康sdk二次开发,移动侦测事件(一)

    1.概述 最近一段时间要从海康摄像头读取数据,作为程序的输入源,c++版本有海康有自己的demo,较为简单,很容易就实现了,但是为我们其他的程序都是基于python的,因此,需要使用Python调用海 ...

  7. Linux下海康威视工业相机的SDK二次开发

    1.客户端软件MVS的安装 1.1安装包的下载和解压 去 官网 下载两个软件安装,分别是客户端和开发环境.(这里我们下载V2.1.1(Linux)和Runtime组件包(Linux)): 工业相机文档 ...

  8. 采用EasyNVR网页无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页上进行播放?

    背景分析 安防摄像头在进行互联网直播中所使用的EasyNVR核心在于摄像机的音视频流的获取.转换.转码与高性能分发,同时同步完成对实时直播流的录像存储,在客户端(PC浏览器.Android.iOS.微 ...

  9. php对接海康视频教程_EasyNVR无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页播放...

    原标题:EasyNVR无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页播放 市场上常见的海康.大华.宇视等网络摄像头只要支持RTSP协议,都可以接入到EasyNVR中,今天主要给大家分 ...

最新文章

  1. 在域模式中控制客户端运行和禁止软件
  2. 如果用float实现居中
  3. IOT(10)--RTOS
  4. ubuntu18.04安装unity tweak tool
  5. C#中字符与字符串(转)
  6. Vue.js 还是 React?你会选择哪一个?为什么?
  7. wpf绘制图片查看器
  8. 洛谷试炼场---提高历练地 普及练习场 新手村 入门难度
  9. 微机 —— 8086微处理器的内部结构
  10. 12V转5V原理图(LM2596)
  11. 菜鸡的Java笔记 数字操作类
  12. 百度AI平台申请使用流程
  13. 美团外卖【成都】技术团队,招人啦!
  14. vue与nodejs
  15. 网站访问速度慢的排查方法
  16. 东澳岛叹海胆之旅 面朝大海一起大快朵颐
  17. 微信小程序---家庭记账本开发(一)
  18. SQL Server 检测到基于一致性的逻辑 I/O 错误.....请执行完整的数据库一致性检查(DBCC CHECKDB)......
  19. 【心田花开】三年级语文阅读《独立宣言》赏析
  20. 多线程的创建和使用,多线程案例:火车站售票

热门文章

  1. Scala学习(二)groupByKey和reduceByKey
  2. Ubuntu20.04 运行 EasyConnect
  3. 离散分类和非离散分类问题中的模型评价
  4. log4j支持同时按日期和文件大小分割日志
  5. TD8655芯片手册详解
  6. 葡萄酒质量和时间关系
  7. LeetCode 127. 单词接龙(C++)*
  8. 戴尔台式计算机usb驱动,整套解决方案:如何为戴尔计算机设置USB闪存驱动器?...
  9. 一元三次方程的求解问题
  10. 2022冬季版凯立德完整版