日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

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

發(fā)布時(shí)間:2023/12/20 linux 258 豆豆
生活随笔 收集整理的這篇文章主要介紹了 海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Livox Lidar? + HIKROBOT Camera系列

最近在開發(fā)相機(jī)和激光雷達(dá)融合的slam算法,主要用于三維重建,想實(shí)時(shí)的得到彩色點(diǎn)云地圖,傳感器選擇了海康威視的工業(yè)相機(jī)和大疆的固態(tài)激光雷達(dá)。

??礐amera MVS Linux SDK二次開發(fā)封裝ROS packge過程記錄(c++)

Livox Lidar+??礐amera實(shí)時(shí)生成彩色點(diǎn)云

Livox Lidar+海康Camera實(shí)時(shí)三維重建生成RGB彩色點(diǎn)云地圖


前言

??档南鄼C(jī)沒有ros驅(qū)動(dòng),而且對(duì)linux開發(fā)不太用好(windows的支持還是不錯(cuò)的),就重寫了sdk接口,并創(chuàng)建了ros節(jié)點(diǎn)封裝成ros包,方便linux環(huán)境下ros的調(diào)用,用于開發(fā)后面的算法,完整版ros驅(qū)動(dòng):https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package,請(qǐng)自取。

本文主要是對(duì)sdk的封裝過程,和創(chuàng)建ros驅(qū)動(dòng)包的開發(fā)過程記錄。

雖然??档南鄼C(jī)是usb傳輸數(shù)據(jù),但是不同于其他usb設(shè)備的調(diào)用,??档南鄼C(jī)并不會(huì)在/dev/目錄下映射ttyUSB或video1這樣的設(shè)備,所以不能用open/read/write這樣的system call的方式打開設(shè)備,所以https://github.com/ros-drivers/usb_cam這樣的usb ros驅(qū)動(dòng)無法支持。基于此,就只能自己開發(fā)ros驅(qū)動(dòng)包。

海康的打開設(shè)備的方式在MvUsb3VDevice.h和MvGigEDevice.h中實(shí)現(xiàn)(分別對(duì)應(yīng)usb3.0相機(jī)和以太網(wǎng)相機(jī)),具體過程并沒有開源,只提供了相應(yīng)的so文件,??堤峁┝私y(tǒng)一的接口MV_CC_EnumDevices實(shí)現(xiàn)對(duì)兩種設(shè)備(usb3.0接口和以太網(wǎng)接口)的調(diào)用,因此開發(fā)一個(gè)ros驅(qū)動(dòng)包是兩種相機(jī)都適用的。

如果你的相機(jī)在/dev/下有映射(比如筆記本自帶的攝像頭一般是/dev/video1),可以使用https://github.com/ros-drivers/usb_cam這個(gè)驅(qū)動(dòng)包,如果是??颠@樣的方式,請(qǐng)使用我的ros驅(qū)動(dòng)包https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package。

??档南鄼C(jī)sdk雖然不開源,但是提供了armhf和aarch64架構(gòu)編譯的so文件,之后我會(huì)移植到j(luò)etson上。

環(huán)境

  • Ubuntu 18.04
  • 機(jī)器視覺工業(yè)相機(jī)客戶端MVS?V2.1.0(Linux)

  • 相機(jī)型號(hào):MV-CE060-10UC

適用于??禉C(jī)器視覺工業(yè)相機(jī)系列(以太網(wǎng)傳輸和usb傳輸同樣適用),相機(jī)接入pc或開發(fā)板的usb3.0接口或網(wǎng)口。

下載海康mvs sdk

https://www.hikrobotics.com/machinevision/service/download?module=0,選linux的最新版:機(jī)器視覺工業(yè)相機(jī)客戶端MVS?V2.1.0(Linux)

解壓

MVS_Linux_STD_V2.1.0_201228.zip解壓后,目錄中含有多種架構(gòu)已經(jīng)編譯好并打包的*.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架構(gòu),jetson選aarch64,pc機(jī)選x86_64,i386是32位pc。

armhf和aarch64區(qū)別就是armhf是armv7架構(gòu),如樹莓派。aarch64是armv8架構(gòu),如jetson?nano。

arm-none只有Samples,沒有編譯好的bin,也沒有dpkg包,??狄矝]有提供源碼,所以用不上。

所有的tar包都包含另一個(gè)MVS.tar.gz,繼續(xù)解壓后是海康打包的so和Samples。
Samples說明參照MVS/Samples/README-CH,安裝完sdk后可以在每個(gè)sample子目錄敲make編譯生成可執(zhí)行程序。

因?yàn)楹?禌]有提供源碼,只提供編譯好的so來給我們調(diào)用,所以下面的tar包安裝也不用編譯。

dpkg包安裝(二選一)

dpkg?-i?MVS-2.1.0_x86_64_20201228.deb

安裝在?/opt/MVS下,這里有個(gè)問題,運(yùn)行需要去cd?/opt/MVS/bin/?再./MVS運(yùn)行。

  • 可選操作:

雖然環(huán)境變量配置了lib目錄,但是沒有配置bin目錄,而且即使配置了bin目錄,在其他目錄也會(huì)運(yùn)行失敗,因?yàn)镸VS調(diào)用的很多l(xiāng)ib沒有在/opt/MVS/lib目錄,而在bin目錄,可能是擔(dān)心lib重名吧。

可以按如下方法修改方法,找到對(duì)應(yīng)行:

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

下劃線部分是我增加的內(nèi)容,重啟終端生效。

任意目錄命令行敲MVS打開設(shè)備。

上面謹(jǐn)慎修改,因?yàn)?opt/MVS/bin目錄加入到LD_LIBRARY_PATH后,會(huì)同樣將這個(gè)目錄里的libQt5*等庫(kù)引入全局可見,跟系統(tǒng)安裝的libQt版本不一致,比如我的rviz在調(diào)用Qt這個(gè)庫(kù)的時(shí)候出現(xiàn)了不匹配打不開的情況,使用系統(tǒng)自帶的則正常打開,所以謹(jǐn)慎修改。

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包,包含另一個(gè)MVS.tar.gz,繼續(xù)解壓,找到Samples目錄。

Samples說明參照MVS/Samples/README-CH,安裝完sdk后可以在每個(gè)Sample子目錄敲make編譯生成可執(zhí)行程序。

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

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

Please Intput camera index: 0? ? ? ? ? ? ? ? ? ? ?#? 只有一個(gè)相機(jī)此處填0,用于指定相機(jī)
Now you GetOneFrame, Width[3072], Height[2048], nFrameNum[0]

?? ?0 ?? ?to do nothing
?? ?1 ?? ?to convert RGB
?? ?2 ?? ?to save as BMP? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 2 為保存照片到當(dāng)前目錄
Please Input Index: 2
save image succeed

Press enter to exit.
打開當(dāng)前目錄的image.bmp照片,說明sdk的開發(fā)環(huán)境測(cè)試成功。
如果只是想使用相機(jī)的采集的topic做算法開發(fā),可以不用往下看了,直接clone ros的驅(qū)動(dòng)包https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package,參照Readme安裝即可。

二次開發(fā)sdk接口,增加常用功能,方便ros調(diào)用

1 代碼開發(fā)

代碼詳見https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package/blob/main/hk_camera/src/hk_camera.cpp
簡(jiǎn)要說明如下:

class HkCam { public:MV_CC_DEVICE_INFO_LIST stDeviceList; // 列出所有??迪鄼C(jī)設(shè)備void *handle; // 打開設(shè)備的句柄unsigned char *pData; // 用于存儲(chǔ)相機(jī)原始數(shù)據(jù) unsigned char *pDataForRGB; // 將原始數(shù)據(jù)轉(zhuǎn)為raw的RGB通道數(shù)據(jù),后續(xù)發(fā)ros topic或存儲(chǔ)int nRet; // mvs sdk調(diào)用的返回值MVCC_INTVALUE stParam; // 取回相機(jī)采集數(shù)據(jù)的結(jié)構(gòu)體,包含pDataMV_CC_PIXEL_CONVERT_PARAM stConvertParam;// 用于接收轉(zhuǎn)化后數(shù)據(jù)的結(jié)構(gòu)體,包含pDataForRGBHkCam(); // 相機(jī)接口構(gòu)造函數(shù),相機(jī)參數(shù)初始化~HkCam(); // 相機(jī)接口析構(gòu)函數(shù),調(diào)用shutdown()void start(); // 打開相機(jī),配置參數(shù)void shutdown(); // 釋放開辟的內(nèi)存空間和設(shè)備句柄bool grab_rgb_image(); // 采集一幀數(shù)據(jù)并轉(zhuǎn)為rgb格式的數(shù)據(jù) private:bool PrintDeviceInfo(MV_CC_DEVICE_INFO *pstMVDevInfo); //打印檢測(cè)到的所有設(shè)備信息 };

2 后續(xù)

之后會(huì)補(bǔ)充一個(gè)相機(jī)參數(shù)配置函數(shù),大部分參數(shù)可以默認(rèn),這個(gè)相機(jī)最需要配置參數(shù)是曝光時(shí)間:
為了讓相機(jī)使用更流暢,幀率達(dá)到20幀,需要關(guān)閉自動(dòng)調(diào)整曝光時(shí)間,改為手動(dòng),并配置一個(gè)合理值(如 20000),太大會(huì)使相機(jī)幀率下降,太小照片會(huì)特備暗,自動(dòng)的話也會(huì)降低幀率。

ROS? package開發(fā)

請(qǐng)先完成ros的安裝。
提示:https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package/是經(jīng)過下面開發(fā)后的最終結(jié)果,所以下面的命令不用在HIKROBOT-MVS-ROS-package中操作,HIKROBOT-MVS-ROS-package的安裝參考代碼中的README。

1 創(chuàng)建ros工作區(qū),初始化一個(gè)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 是包名,后面的參數(shù)是依賴的其他ros包

初始化后的樣子:

ws_hk_camera/src └── hk_camera # 包目錄├── CMakeLists.txt # catkin_create_pkg 自動(dòng)生成的,需要更改引入自己的代碼文件,供catkin_make編譯使用├── include # catkin_create_pkg 自動(dòng)生成的頭文件目錄,可以把海康sdk的頭文件拷貝過來│?? └── hk_camera # catkin_create_pkg 自動(dòng)生成的├── package.xml # catkin_create_pkg 自動(dòng)生成的,指定依賴的ros包,可以修改維護(hù)者的個(gè)人信息└── src # 源碼目錄

2 代碼開發(fā)

完整的目錄:

ws_hk_camera/src └── hk_camera # 包目錄├── CMakeLists.txt # catkin_create_pkg 自動(dòng)生成的,需要更改引入自己的代碼文件,供catkin_make編譯使用├── include # catkin_create_pkg 自動(dòng)生成的頭文件目錄,把??祍dk的頭文件拷貝過來│?? ├── CameraParams.h # ??祍dk的頭文件│?? ├── hk_camera # catkin_create_pkg 自動(dòng)生成的│?? ├── MvCameraControl.h # 海康sdk的頭文件│?? ├── MvErrorDefine.h # ??祍dk的頭文件│?? └── PixelType.h # ??祍dk的頭文件├── launch # roslaunch文件,批量啟動(dòng)node│?? ├── hk_camera_rviz.launch │?? └── hk_camera_view.launch├── package.xml # catkin_create_pkg 自動(dòng)生成的,指定依賴的ros包,可以修改維護(hù)者的個(gè)人信息├── rviz_cfg # hk_camera_rviz.launch 的rviz節(jié)點(diǎn)的配置文件│?? └── hk_camera.rviz└── src # 源碼目錄├── hk_camera.cpp # 封裝??祍dk的類的實(shí)現(xiàn)├── hk_camera.h # 封裝海康sdk的類頭文件├── hk_camera_node.cpp# ros節(jié)點(diǎn)類的實(shí)現(xiàn)└── hk_camera_node.h # ros節(jié)點(diǎn)類的頭文件

ros node的實(shí)現(xiàn)詳見https://github.com/luckyluckydadada/HIKROBOT-MVS-ROS-package/blob/main/hk_camera/src/hk_camera_node.cpp
簡(jiǎn)要說明如下:

class HkCamNode { public:ros::NodeHandle node_; # 定義ros節(jié)點(diǎn):/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_; # 二次開發(fā)的??祍dk接口HkCamNode(); # 創(chuàng)建ros節(jié)點(diǎn)~HkCamNode();bool service_start_cap(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res);#打開服務(wù)請(qǐng)求bool service_stop_cap(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res); #停止服務(wù)請(qǐng)求bool send_image(); # 調(diào)用HkCam的grab_rgb_image封裝成sensor_msgs::Image在topic上實(shí)現(xiàn)發(fā)照片消息bool spin(); # 持續(xù)觸發(fā) };int main(int argc, char **argv) {ros::init(argc, argv, "hk_camera"); # ros程序初始化,定義節(jié)點(diǎn)名為hk_camera// 啟動(dòng)時(shí)可以更改節(jié)點(diǎn)名字,如hk_camera_rviz.launch中定義的節(jié)點(diǎn)為hk_camera_node會(huì)替換此處的第三個(gè)參數(shù)HkCamNode a; # 創(chuàng)建ros節(jié)點(diǎn)a.spin(); # 持續(xù)觸發(fā)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 生成,但是很多依賴并沒有打開,處于注釋狀態(tài),需要取消注釋,并引用自己的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( #這部分注釋必須打開,不然出錯(cuò) 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} )################## 自定義內(nèi)容 ################## # 按下列順序指定link_directories、add_executable、target_link_libraries # lib目錄 link_directories(/opt/MVS/lib/64) # 指定??祍dk的lib目錄 # 源cpp 和 輸出exe add_executable(${PROJECT_NAME}_node src/hk_camera_node.cpp src/hk_camera.cpp) # 指定可執(zhí)行程序名稱和我們的cpp文件 # 指定要鏈接的so文件 target_link_libraries(${PROJECT_NAME}_node${catkin_LIBRARIES} MvCameraControl # ??祍dk的so文件 )

4 安裝和使用

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

5 rviz查看topic

總結(jié)

以上是生活随笔為你收集整理的海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。