海康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;                   // 取回相机采集数据的结构体,包含pData
    MV_CC_PIXEL_CONVERT_PARAM stConvertParam;// 用于接收转化后数据的结构体,包含pDataForRGB
    
    HkCam();                                 // 相机接口构造函数,相机参数初始化
    ~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_node
	ros::ServiceServer service_start_, service_stop_;   # ros serviec-client模型
	sensor_msgs::Image img_msg;                         # 照片的消息类型:Image
	image_transport::CameraPublisher image_pub_;        # 照片话题:/hk_camera_node/image_raw
/image_raw
	HkCam 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_transport
  roscpp
  sensor_msgs
  std_msgs
  std_srvs
)
catkin_package( #这部分注释必须打开,不然出错  https://zhuanlan.zhihu.com/p/299148013
 INCLUDE_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

  • 43
    点赞
  • 201
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
### 回答1: 海康相机SDK海康威视公司提供的一套用于二次开发的软件开发工具包。使用海康相机SDK可以让开发者更加方便地集成和应用海康相机的功能。 首先,使用海康相机SDK进行C语言开发,需要先准备相应的开发环境,包括安装相机的驱动程序和SDK。安装完成后,可以通过编写C语言程序来调用SDK提供的接口实现相机的操作和控制。 在二次开发过程中,可以利用SDK提供的函数和接口,实现对相机的图像采集、图像处理、图像保存等功能。通过调用SDK提供的函数,可以实现相机参数的设置、视频流的获取、图像的采集和控制等操作。 此外,海康相机SDK还提供了一些实用的功能函数,比如图像导出、图像处理、图像匹配等,这些功能可以帮助开发者更加高效地处理相机的图像数据。 总之,海康相机SDK二次开发c可以实现对海康相机功能的深入应用和扩展。通过使用SDK提供的接口和函数,开发者可以方便地实现相机的各种操作和控制,实现更加丰富的相机应用。 ### 回答2: 海康相机SDK是一套用于二次开发的工具包,具有丰富的功能和接口,可以用于编写海康相机相关的应用程序。 开发海康相机SDK的C语言接口是一种常用的开发方式。通过使用C语言接口,开发者可以方便地与相机进行通信、控制和数据交换。 在二次开发海康相机SDK时,首先需要搭建开发环境。这包括安装相机SDK,配置开发工具,编译环境等。接下来,可以通过调用SDK提供的接口来实现自己想要的功能。例如,可以调用接口来连接相机、进行图像采集、设置相机参数、进行图像处理等操作。 在编写代码的过程中,需要熟悉SDK提供的接口文档,了解每个接口的功能和参数。同时,根据自己的需求,可以使用不同的接口进行代码编写。在编写代码时,需要注意接口的调用顺序和参数的设置,确保代码的正确性和稳定性。 除了基本的功能接口外,海康相机SDK还提供了其他的扩展功能。例如,可以通过SDK提供的接口来实现图像识别、运动检测、人脸识别等高级功能。 总之,通过使用海康相机SDK进行二次开发,可以快速而有效地开发出符合自己需求的相机应用程序。无论是进行图像采集、监控、人脸识别等应用,海康相机SDK都能提供强大的支持,为开发者节省时间和精力,实现更多的功能。 ### 回答3: 海康相机SDK是一套用于二次开发的工具包,主要针对海康相机进行开发。C语言是一种常用的编程语言,可以用于开发各种应用程序。通过使用海康相机SDK进行C语言二次开发,可以实现对相机的控制、图像采集、图像处理等功能。 首先,我们需要在开发环境中安装海康相机SDK,并配置好相应的开发工具。然后,我们可以使用C语言编写代码来调用SDK提供的接口函数,实现对相机的各种操作。这些接口函数包括相机的初始化、打开、关闭、设置参数、触发采集、获取图像数据等。 在进行二次开发时,我们可以根据具体需求选择适合的接口函数进行调用,实现自己想要的功能。例如,如果我们想要实现图像采集功能,可以使用SDK提供的接口函数来启动相机,设置采集参数,然后通过循环获取图像数据进行处理或保存。 此外,海康相机SDK还提供了一些辅助功能,如图像显示、图像保存、图像处理等。我们可以利用SDK提供的函数来实现这些功能,以满足自己的需求。 总之,通过海康相机SDK二次开发,我们可以使用C语言来控制海康相机,并实现各种功能。这为我们开发相机应用程序提供了丰富的工具和接口,并且可以根据具体需求进行定制。同时,掌握好C语言的基本语法和海康相机SDK的相关知识,对于进行二次开发将会有很大的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值