云恒制造:【图像与点云融合教程(一)】Ubuntu20下配置海康相机和LIVOX AVIA雷达

1. 软硬件环境

雷达:LIVOX AVIA

相机:海康威视 MV-CA023-10UC

Ubuntu 20.04 x64 2. 相机驱动配置2.1 下载安装 MVS 客户端

下载链接:海康机器人-机器视觉-下载中心 (hikrobotics.com)

选择下图的MVS客户端下载:

云恒制造:【图像与点云融合教程(一)】Ubuntu20下配置海康相机和LIVOX AVIA雷达

解压后通过 deb 或 tar.gz 中的 setup.sh 进行安装均可,最终会安装在 /opt/MVS/ 路径下:

云恒制造:【图像与点云融合教程(一)】Ubuntu20下配置海康相机和LIVOX AVIA雷达

在 /etc/ld.so.conf.d 文件中新建文件 mvs.conf,内容如下:

/opt/vc/lib

/opt/MVS/lib/64

新建终端,执行: sudo ldconfig

重启电脑使环境配置生效,否则无法读取到相机。

2.2 测试2.2.1 Python 脚本测试

代码见附录1

效果如下(忘截图了,拿之前在Ubuntu16上拍的凑一下): 2.2.2 ROS 脚本测试

ROS1 环境配置使用一键安装脚本:

wget http://fishros.com/install -O fishros && . fishros# 然后跟着命令行提示安装即可

下载链接:luckyluckydadada/HIKROBOT-MVS-CAMERA-ROS: The ros driver package of Hikvision Industrial Camera SDK. (github.com)

# 创建工作空间目录mkdir p ~/ws_hikrobot_camera/src# 克隆代码git clone https://github.com/luckyluckydadada/HIKROBOT-MVS-CAMERA-ROS.git ~/ws_hikrobot_camera/src/hikrobot_cameracd ~/ws_hikrobot_camera# 编译catkin_make

使用 rviz 查看图像:

source ./devel/setup.bash roslaunch hikrobot_camera hikrobot_camera_rviz.launch

效果如下:

云恒制造:【图像与点云融合教程(一)】Ubuntu20下配置海康相机和LIVOX AVIA雷达 3. 雷达SDK和驱动配置3.1 SDK 的下载、安装与测试

下载链接:Release Livox-SDK 2.3.0 · Livox-SDK/Livox-SDK (github.com)

编译安装SDK: sudo apt install cmake# 下载安装包后解压cd LivoxSDKcd build && cmake ..makesudo make install

修改电脑的静态ip(ip设置为多少在雷达说明书中有写,型号相同的同学可以直接抄我的):

云恒制造:【图像与点云融合教程(一)】Ubuntu20下配置海康相机和LIVOX AVIA雷达

执行测试:“`cpp

cd build/sample/lidar/

./lidar_sample # 接着终端会不断输出信息 3.2 雷达 ROS 驱动配置

克隆代码(这一句将代码克隆到指定目录,这个目录是克隆时自动创建的,与我们平时创建ROS工作空间的操作有些不同,第一次看到这个可能会对该路径感到迷惑):

git clone https://github.com/Livox-SDK/livox_ros_driver.git ws_livox/src

编译工作空间:

cd ws_livoxcatkin_make

启动雷达节点测试(这一长串码可以在激光雷达机身外壳二维码下方读到,抄上去即可):

source ./devel/setup.shroslaunch livox_ros_driver livox_lidar_rviz.launch bd_list:=“0TFDG3B006H2Z11&1HDDG8M00100191”

在 rviz 中显示效果如下:

云恒制造:【图像与点云融合教程(一)】Ubuntu20下配置海康相机和LIVOX AVIA雷达 附录1import sys from ctypes import*import osimport numpy as npimport time#from Camera import Camera#from FTPService import FTPService #from GPIO_set import GPIO_setimport cv2#import configparsersys.path.append(“/opt/MVS/Samples/64/Python/MvImport”)#打开MVS中的MvImport文件,对于不同系统打开的文件路径跟随实际文件路径变化即可from MvCameraControl_classimport*#调用了MvCameraControl_class.py文件classHKCamera(): def __init__(self,CameraIdx=0, log_path=None):# enumerate all the camera devices deviceList = self.enum_devices()# generate a camera instance self.camera = self.open_camera(deviceList,CameraIdx, log_path) self.start_camera() def __del__(self):if self.camera is None:return# 停止取流 ret = self.camera.MV_CC_StopGrabbing()if ret !=0: raise Exception(“stop grabbing fail! ret[0x%x]”% ret)# 关闭设备 ret = self.camera.MV_CC_CloseDevice()if ret !=0: raise Exception(“close deivce fail! ret[0x%x]”% ret)# 销毁句柄 ret = self.camera.MV_CC_DestroyHandle()if ret !=0: raise Exception(“destroy handle fail! ret[0x%x]”% ret)@staticmethod def enum_devices(device=0, device_way=False):“”” device =0枚举网口、USB口、未知设备、cameralink 设备 device =1枚举GenTL设备“””if device_way ==False:if device ==0: cameraType = MV_GIGE_DEVICE | MV_USB_DEVICE | MV_UNKNOW_DEVICE | MV_1394_DEVICE | MV_CAMERALINK_DEVICE deviceList = MV_CC_DEVICE_INFO_LIST()# 枚举设备 ret =MvCamera.MV_CC_EnumDevices(cameraType, deviceList)if ret !=0: raise Exception(“enum devices fail! ret[0x%x]”% ret)return deviceListelse: pass elif device_way ==True: pass def open_camera(self, deviceList,CameraIdx, log_path):# generate a camera instance camera =MvCamera()# 选择设备并创建句柄 stDeviceList = cast(deviceList.pDeviceInfo[CameraIdx], POINTER(MV_CC_DEVICE_INFO)).contentsif log_path is not None: ret = self.camera.MV_CC_SetSDKLogPath(log_path)if ret !=0: raise Exception(“set Log path fail! ret[0x%x]”% ret)# 创建句柄,生成日志 ret = camera.MV_CC_CreateHandle(stDeviceList)if ret !=0: raise Exception(“create handle fail! ret[0x%x]”% ret)else:# 创建句柄,不生成日志 ret = camera.MV_CC_CreateHandleWithoutLog(stDeviceList)if ret !=0: raise Exception(“create handle fail! ret[0x%x]”% ret)# 打开相机 ret = camera.MV_CC_OpenDevice(MV_ACCESS_Exclusive,0)if ret !=0: raise Exception(“open device fail! ret[0x%x]”% ret)return camera def start_camera(self): stParam = MVCC_INTVALUE() memset(byref(stParam),0,sizeof(MVCC_INTVALUE)) ret = self.camera.MV_CC_GetIntValue(“PayloadSize”, stParam)if ret !=0: raise Exception(“get payload size fail! ret[0x%x]”% ret) self.nDataSize = stParam.nCurValue self.pData =(c_ubyte * self.nDataSize)() self.stFrameInfo = MV_FRAME_OUT_INFO_EX() memset(byref(self.stFrameInfo),0,sizeof(self.stFrameInfo)) self.camera.MV_CC_StartGrabbing() def get_Value(self, param_type, node_name):“””:param cam:相机实例:param_type:获取节点值得类型:param node_name:节点名可选intfloatenumboolstring 型节点:return:节点值“””if param_type ==“int_value”: stParam = MVCC_INTVALUE_EX() memset(byref(stParam),0,sizeof(MVCC_INTVALUE_EX)) ret = self.camera.MV_CC_GetIntValueEx(node_name, stParam)if ret !=0: raise Exception(“获取 int 型数据 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret))return stParam.nCurValue elif param_type ==“float_value”: stFloatValue = MVCC_FLOATVALUE() memset(byref(stFloatValue),0,sizeof(MVCC_FLOATVALUE)) ret = self.camera.MV_CC_GetFloatValue(node_name, stFloatValue)if ret !=0: raise Exception(“获取 float 型数据 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret))return stFloatValue.fCurValue elif param_type ==“enum_value”: stEnumValue = MVCC_ENUMVALUE() memset(byref(stEnumValue),0,sizeof(MVCC_ENUMVALUE)) ret = self.camera.MV_CC_GetEnumValue(node_name, stEnumValue)if ret !=0: raise Exception(“获取 enum 型数据 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret))return stEnumValue.nCurValue elif param_type ==“bool_value”: stBool = c_bool(False) ret = self.camera.MV_CC_GetBoolValue(node_name, stBool)if ret !=0: raise Exception(“获取 bool 型数据 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret))return stBool.value elif param_type ==“string_value”: stStringValue = MVCC_STRINGVALUE() memset(byref(stStringValue),0,sizeof(MVCC_STRINGVALUE)) ret = self.camera.MV_CC_GetStringValue(node_name, stStringValue)if ret !=0: raise Exception(“获取 string 型数据 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret))return stStringValue.chCurValueelse:returnNone def set_Value(self, param_type, node_name, node_value):“””:param cam:相机实例:param param_type:需要设置的节点值得类型int:float:enum:参考于客户端中该选项的EnumEntryValue值即可bool:对应0为关,1为开 string:输入值为数字或者英文字符,不能为汉字:param node_name:需要设置的节点名:param node_value:设置给节点的值:return:“””if param_type ==“int_value”: ret = self.camera.MV_CC_SetIntValueEx(node_name,int(node_value))if ret !=0: raise Exception(“设置 int 型数据节点 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret)) elif param_type ==“float_value”: ret = self.camera.MV_CC_SetFloatValue(node_name,float(node_value))if ret !=0: raise Exception(“设置 float 型数据节点 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret)) elif param_type ==“enum_value”: ret = self.camera.MV_CC_SetEnumValue(node_name, node_value)if ret !=0: raise Exception(“设置 enum 型数据节点 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret)) elif param_type ==“bool_value”: ret = self.camera.MV_CC_SetBoolValue(node_name, node_value)if ret !=0: raise Exception(“设置 bool 型数据节点 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret)) elif param_type ==“string_value”: ret = self.camera.MV_CC_SetStringValue(node_name, str(node_value))if ret !=0: raise Exception(“设置 string 型数据节点 %s 失败 ! 报错码 ret[0x%x]”%(node_name, ret)) def set_exposure_time(self, exp_time): self.set_Value(param_type=“float_value”, node_name=“ExposureTime”, node_value=exp_time) def get_exposure_time(self):return self.get_Value(param_type=“float_value”, node_name=“ExposureTime”) def get_image(self, width=None):“””:param cam:相机实例:active_way:主动取流方式的不同方法分别是(getImagebuffer)(getoneframetimeout:return:“”” ret = self.camera.MV_CC_GetOneFrameTimeout(self.pData, self.nDataSize, self.stFrameInfo,1000)if ret ==0: image = np.asarray(self.pData).reshape((self.stFrameInfo.nHeight, self.stFrameInfo.nWidth,3))if width is not None: image = cv2.resize(image,(width,int(self.stFrameInfo.nHeight * width / self.stFrameInfo.nWidth))) pass image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)return imageelse:returnNone def show_runtime_info(self, image): exp_time = self.get_exposure_time() cv2.putText(image,(“exposure time = %1.1fms”%(exp_time *0.001)),(20,50), cv2.FONT_HERSHEY_SIMPLEX,0.5,255,1)if __name__ ==__main__: camera =HKCamera()try:whileTrue: image = camera.get_image(width=800)if image is not None: camera.show_runtime_info(image) cv2.imshow(“”, image) key = cv2.waitKey(50)&0xFFif key == ord(e) or key == ord(E): cv2.destroyAllWindows()break except Exception as e: print(e)
<

免责声明:文章内容来自互联网,本站仅提供信息存储空间服务,真实性请自行鉴别,本站不承担任何责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:云恒制造:【图像与点云融合教程(一)】Ubuntu20下配置海康相机和LIVOX AVIA雷达 https://www.zentong.com/a/p/19761.html

(0)
上一篇 2023-05-03 17:29:50
下一篇 2023-05-03 17:32:33

猜你喜欢

联系我们

在线咨询: QQ交谈

邮件:362039258#qq.com(把#换成@)

工作时间:周一至周五,10:30-16:30,节假日休息。