海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)
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)要說明如下:
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)要說明如下:
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「冰狐智能辅助」如何在线实时调试?
- 下一篇: Linux图形化磁盘管理工具gparte