海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)
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++)相关推荐
- Livox Lidar+海康Camera实时生成彩色点云
Livox Lidar + HIKROBOT Camera系列 最近在开发相机和激光雷达融合的slam算法,主要用于三维重建,想实时的得到彩色点云地图,传感器选择了海康威视的工业相机和大疆的固态激光 ...
- Livox Lidar+海康Camera 基于loam的实时三维重建生成RGB彩色点云
Livox Lidar + HIKROBOT Camera系列 最近在开发相机和激光雷达融合的slam算法,主要用于三维重建,想实时的得到彩色点云地图,传感器选择了海康威视的工业相机和大疆的固态激光 ...
- 如何在LabVIEW中进行海康机器视觉算法平台VisionMaster二次开发
目录 1.导言 庞大的NI LabVIEW软件平台 LabVIEW 平台的特点 海康机器人的视觉算法平台VisionMaster特点 如何在LabVIEW中进行海康视觉算法平台二次开发 2.方法与步骤 ...
- Linux环境中对海康威视工业相机SDK进行二次开发(QT+CMake+Opencv+海康SDK)
关于在Windows环境中对海康威视工业相机SDK进行二次开发的话,可以参考这两篇博客. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一) 海康威视工业相机SDK二 ...
- 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)
最近在做一个项目,涉及到工业相机,需要对其进行二次开发.相机方面选择了海康威视,网上关于海康威视工业相机SDK的开发资料很少,官方文档里面虽然写的是支持C++开发的,但其实是C.自己也摸索了一段时间, ...
- 海康摄像头二次开发python_python实现海康sdk二次开发,移动侦测事件(一)
1.概述 最近一段时间要从海康摄像头读取数据,作为程序的输入源,c++版本有海康有自己的demo,较为简单,很容易就实现了,但是为我们其他的程序都是基于python的,因此,需要使用Python调用海 ...
- Linux下海康威视工业相机的SDK二次开发
1.客户端软件MVS的安装 1.1安装包的下载和解压 去 官网 下载两个软件安装,分别是客户端和开发环境.(这里我们下载V2.1.1(Linux)和Runtime组件包(Linux)): 工业相机文档 ...
- 采用EasyNVR网页无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页上进行播放?
背景分析 安防摄像头在进行互联网直播中所使用的EasyNVR核心在于摄像机的音视频流的获取.转换.转码与高性能分发,同时同步完成对实时直播流的录像存储,在客户端(PC浏览器.Android.iOS.微 ...
- php对接海康视频教程_EasyNVR无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页播放...
原标题:EasyNVR无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页播放 市场上常见的海康.大华.宇视等网络摄像头只要支持RTSP协议,都可以接入到EasyNVR中,今天主要给大家分 ...
最新文章
- 在域模式中控制客户端运行和禁止软件
- 如果用float实现居中
- IOT(10)--RTOS
- ubuntu18.04安装unity tweak tool
- C#中字符与字符串(转)
- Vue.js 还是 React?你会选择哪一个?为什么?
- wpf绘制图片查看器
- 洛谷试炼场---提高历练地 普及练习场 新手村 入门难度
- 微机 —— 8086微处理器的内部结构
- 12V转5V原理图(LM2596)
- 菜鸡的Java笔记 数字操作类
- 百度AI平台申请使用流程
- 美团外卖【成都】技术团队,招人啦!
- vue与nodejs
- 网站访问速度慢的排查方法
- 东澳岛叹海胆之旅 面朝大海一起大快朵颐
- 微信小程序---家庭记账本开发(一)
- SQL Server 检测到基于一致性的逻辑 I/O 错误.....请执行完整的数据库一致性检查(DBCC CHECKDB)......
- 【心田花开】三年级语文阅读《独立宣言》赏析
- 多线程的创建和使用,多线程案例:火车站售票