海康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
簡要說明如下:
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
簡要說明如下:
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++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「冰狐智能辅助」如何在线实时调试?
- 下一篇: 用 Python 实现 RSI 指标线与