相机-雷达标定(一):最快验证-数据准备
一、背景相机与激光雷达的联合标定至少需要一组时间对齐、空间对齐的图像与点云数据。本文聚焦于数据采集环节记录相机和雷达两路数据的采集流程。采集总原则相机和雷达在整个采集过程中位置完全固定不可移动、不可碰触、不可调整角度同一组数据中相机图像与雷达点云尽可能同时采集主要保证环境静态标定板不要发生动态的变化。多组数据依次采集每组的标定板姿态可以不同但相机和雷达本身不动这里快速验证只取一组。二、硬件连接与网络配置2.1 设备清单相机采集图像方法众多C/PythonNVR/直连Window/Ubuntu自带工具都行。最好还是用网线直连调SDK这样可以保证图像采集实时性并且图像质量不会损失如果简单走个流程验证一下的话怎么采集都可以。设备型号网络相机NVR海康威视 NVR 相机192.168.10.168:554RTSP/ :8000SDK激光雷达禾赛 QT128C2X192.168.1.2012.2 网络配置相机与雷达属于不同网段需分别配置电脑的两个网口或一个有线 一个无线接口设备本地 IP 配置有线网卡雷达192.168.1.111有线网卡相机192.168.10.142注意建议雷达和相机分接到不同的物理网口避免单网卡频繁切换网段也可以考虑把相机和雷达设置为同一网段。三、相机数据采集3.1 采集方式通过海康 HCNetSDK 预览主码流 PlayCtrl 解码抓帧获取 1920x1920 的高清图像。相比 RTSP 方式延迟从 ~1348ms 降到 ~170ms且画质清晰但是这个延迟还是有点离谱且画质仍有损失不如C下调用SDK效果好。3.2 环境conda activate boeye pipinstallHCNetSDK-python opencv-python numpy3.3 采集代码核心代码image_capture_sdk.pyimportctypesimportosimportsysimporttempfileimportthreadingfromtypingimportOptionalimportcv2importnumpyasnpfromHCNetSDK.SDK_Structimport(NET_DVR_USER_LOGIN_INFO,NET_DVR_DEVICEINFO_V40,NET_DVR_PREVIEWINFO,)_LIB_DIRos.path.join(os.path.dirname(__import__(HCNetSDK).__file__),Libs,linux)def_ensure_library_path():自动设置 LD_LIBRARY_PATH 并重载进程避免手动 exportif_LIB_DIRinos.environ.get(LD_LIBRARY_PATH,):returnos.environ[LD_LIBRARY_PATH]_LIB_DIR:os.environ.get(LD_LIBRARY_PATH,)os.execv(sys.executable,[sys.executable]sys.argv)_ensure_library_path()_REALDATACALLBACKctypes.CFUNCTYPE(None,ctypes.c_long,ctypes.c_uint,ctypes.POINTER(ctypes.c_byte),ctypes.c_uint,ctypes.c_long,)classHKSnapshot:海康相机 SDK 实时抓图主码流高清def__init__(self,ip,port8000,useradmin,password,channel1,is_nvrFalse,stream_type0,jpeg_quality95):self.ipip self.portport self.useruser self.passwordpassword self.channelchannel self.is_nvris_nvr self.stream_typestream_type# 0主码流self.jpeg_qualityjpeg_quality self._user_id-1self._play_port-1self._real_handle-1self._preview_buf[]self._preview_lockthreading.Lock()self._preview_readythreading.Event()self._callbackNone# 防止 GC 回收回调defconnect(self):sdkctypes.CDLL(os.path.join(_LIB_DIR,libhcnetsdk.so))self._playctypes.CDLL(os.path.join(_LIB_DIR,libPlayCtrl.so))self._sdksdk sdk.NET_DVR_Init()sdk.NET_DVR_SetConnectTime(3000,1)loginNET_DVR_USER_LOGIN_INFO()login.bUseAsynLogin0login.sDeviceAddressself.ip.encode(utf-8)login.wPortself.port login.sUserNameself.user.encode(utf-8)login.sPasswordself.password.encode(utf-8)deviceNET_DVR_DEVICEINFO_V40()self._user_idsdk.NET_DVR_Login_V40(ctypes.byref(login),ctypes.byref(device))ifself._user_id0:raiseConnectionError(f登录失败:{sdk.NET_DVR_GetLastError()})self._start_preview()returnselfdef_start_preview(self):playself._play portctypes.c_int32(-1)play.PlayM4_GetPort(ctypes.byref(port))self._play_portport.value play.PlayM4_SetStreamOpenMode(port,0)play.PlayM4_OpenStream(port,None,0,1024*1024)play.PlayM4_Play(port,0)def_on_data(handle,dtype,buf,size,user):ifsize0andbuf:datactypes.string_at(buf,size)withself._preview_lock:self._preview_buf.append(data)iflen(self._preview_buf)50:self._preview_ready.set()self._callback_REALDATACALLBACK(_on_data)pvNET_DVR_PREVIEWINFO()pv.lChannelself.channel pv.dwStreamTypeself.stream_type pv.dwLinkMode0# TCPpv.hPlayWnd0pv.bBlocked1self._real_handleself._sdk.NET_DVR_RealPlay_V40(self._user_id,ctypes.byref(pv),self._callback,0)self._preview_ready.wait(timeout5)self._flush_to_decoder()def_flush_to_decoder(self):withself._preview_lock:packetsself._preview_buf[:]self._preview_buf.clear()portctypes.c_int32(self._play_port)forpktinpackets:pbufctypes.create_string_buffer(pkt,len(pkt))self._play.PlayM4_InputData(port,pbuf,len(pkt))self._preview_ready.clear()def_grab_frame(self):importtime self._flush_to_decoder()time.sleep(0.1)portctypes.c_int32(self._play_port)w,hctypes.c_uint(0),ctypes.c_uint(0)self._play.PlayM4_GetPictureSize(port,ctypes.byref(w),ctypes.byref(h))bmp_sizew.value*h.value*41024bmp_bufctypes.create_string_buffer(bmp_size)bmp_outctypes.c_uint(bmp_size)self._play.PlayM4_GetBMP(port,bmp_buf,bmp_size,ctypes.byref(bmp_out))bmp_databmp_buf.raw[:bmp_out.value]withtempfile.NamedTemporaryFile(suffix.bmp,deleteFalse)astmp:tmp.write(bmp_data)tmp_pathtmp.nametry:imgcv2.imread(tmp_path)finally:os.unlink(tmp_path)returnimgdefsave(self,file_path):imgself._grab_frame()cv2.imwrite(file_path,img,[cv2.IMWRITE_JPEG_QUALITY,self.jpeg_quality])defdisconnect(self):ifself._play_port0:portctypes.c_int32(self._play_port)self._play.PlayM4_Stop(port)self._play.PlayM4_CloseStream(port)self._play.PlayM4_FreePort(port)self._play_port-1ifself._real_handle0:self._sdk.NET_DVR_StopRealPlay(self._real_handle)self._real_handle-1ifself._user_id0:self._sdk.NET_DVR_Logout_V30(self._user_id)self._user_id-1self._sdk.NET_DVR_Cleanup()3.4 交互式采集Enter保存一张图像ESC退出importsysimporttermiosimportttyimportglobdefinteractive_capture(cam):count1existingglob.glob(image_*.jpg)forfinexisting:try:numint(f.replace(image_,).replace(.jpg,))countmax(count,num1)exceptValueError:passprint( 交互式抓图模式 )print(按 Enter 保存图像按 ESC 退出)old_settingstermios.tcgetattr(sys.stdin)try:tty.setraw(sys.stdin.fileno())whileTrue:chsys.stdin.read(1)ifch\x1b:print(\r\n退出抓图模式)breakifchin(\r,\n):filenamefimage_{count:03d}.jpgtry:cam.save(filename)print(f\r已保存:{filename})exceptExceptionase:print(f\r保存失败:{e})count1finally:termios.tcsetattr(sys.stdin,termios.TCSADRAIN,old_settings)if__name____main__:withHKSnapshot(ip192.168.10.168,port8000,useradmin,passwordbolight3,channel2,is_nvrTrue,)ascam:interactive_capture(cam)3.5 运行conda activate boeye python image_capture_sdk.py启动后等待连接就绪约 1 秒按 Enter 采集一张文件自动按image_001.jpg、image_002.jpg顺序命名。四、激光雷达数据采集4.1 硬件连接连接12V 5A适配器注意下面这个卡口感觉设计上有缺陷描述的卡扣几乎没有作用有时还有静电可插拔次数太少远远没有雷蒙头接口用的舒服可能是为了满足某种特殊要求吧。将其它线缆都接通先将网卡IP配置成同网段然后给设备上电上电后确保能ping通设备。在浏览器输入IP访问记住里面的目标IP和端口信息等下图中的核心就是目标IP192.168.1.200和2364端口4.2 问题排查有时会出现能ping通但是采集不到数据的情况用PandarView查看点云提示如下排查方法如下断电重新插拔听雷达是否有电机转动本地IP要设置成192.168.1.200与192.168.1.201配置界面一致检查是否有进程占用2364端口出现过自己开发的程序没有关闭忘了清理端口的情况用PandarView显示配置如下4.3 点云采集先下载SDK雷达数据采集使用 Windows 平台下的 Qt 可执行程序调用SDK自己实现用claude code实现很简单通过点击按钮触发采集界面如下图所示。当前 QT128C2X 运行在 10 Hz默认 600 RPM双回波模式每帧约 23 万点。对机械雷达而言帧率只由电机转速决定600 RPM 10Hz是出厂默认。回波模式只改变每帧点数不影响帧率。需要更高帧率可通过 Web 界面或 PandarView 把转速调到 1200 RPM20 Hz但会牺牲水平角分辨率需要更长探测距离的密集点云则降低转速。日常 10Hz已能满足绝大多数自动驾驶、机器人、建图场景的需求。五、联合采集流程5.1 准备工作固定相机和雷达的相对位置后续整个采集过程都不可移动确认相机和雷达都已上电、网络可达放置标定板建议在视场中放置多个不同位置/角度的标定板采集多组数据5.2 同步采集步骤关键相机图像和雷达点云应在尽可能短的时间内采集建议间隔 1 秒采集过程中相机和雷达本身绝对不能移动。调整好标定板姿态保持静止同时或快速连续地操作在 Linux 终端按 Enter 采集相机图像在 Windows 端点击雷达采集按钮记录本组图像文件名与点云文件名的对应关系如image_001.jpg↔lidar_001.pcd更换标定板姿态重复步骤 1~3建议采集 10~20 组不同姿态的数据覆盖图像的不同区域5.3 数据组织建议calibration_data/ ├── image_001.jpg ←→ lidar_001.pcd ├── image_002.jpg ←→ lidar_002.pcd ├── ... └── pairs.txt # 文件名对应关系可选pairs.txt格式示例image_001.jpg, lidar_001.pcd image_002.jpg, lidar_002.pcd ...六、注意事项设备固定整个采集过程中相机和雷达位置、姿态绝对不可变化否则标定结果无效时间同步单组数据内图像和点云的采集间隔尽量短避免标定板被风吹动或人为晃动造成的数据不一致光照稳定避免采集过程中光照突变标定板要求建议使用专业标定板尺寸足够大图案清晰无反光覆盖性标定板应出现在图像和点云的不同位置左、中、右、上、下距离多样化近、中、远网络冲突相机192.168.10.x和雷达192.168.1.x属于不同网段确保电脑路由正确不要相互干扰七、参考资料禾赛 QT128C2X 用户手册海康威视设备网络 SDK 开发文档HCNetSDK-python 包

相关新闻

【截图工具】Pixpin截图时自带边框设置

【截图工具】Pixpin截图时自带边框设置

使用Pixpin截图粘贴到文档中时,有时候图片大部分是白色的,跟文档底色几乎融为一体,边界不明显,可以按照如下操作让图片自带边框 1、先随便截图 2、点击右侧第3个圆形图标 3、点击边框、选择颜色、设置强度(即边框的宽度…

2026/10/15 2:04:02 阅读更多 →
高效办公利器|OpenClaw (龙虾)Windows、Mac 全套环境自动部署+功能演示

高效办公利器|OpenClaw (龙虾)Windows、Mac 全套环境自动部署+功能演示

🔹 工具简述 OpenClaw 是当前开源领域备受瞩目的工具,凭借其本地离线运行、图形化操作界面以及全流程自动化等核心优势,吸引了广泛的用户群体。与常规的对话型 AI 产品不同,它是一款能够直接操控本机软硬件的智能数字员工。用户只…

2026/10/13 18:52:26 阅读更多 →
从Java到AI Agent:34岁程序员转型大模型开发踩坑实录+全套实战资料包(收藏备用)

从Java到AI Agent:34岁程序员转型大模型开发踩坑实录+全套实战资料包(收藏备用)

本文分享了作者从8年Java后端开发者成功转型AI Agent开发的心路历程和实战经验,揭示了"把Demo当产品"、“Agent工具堆砌"和"盲目学习"三大转型坑,并提出了"最小可用Agent先行”、"真实文档RAG实践"和"系统…

2026/10/7 23:01:09 阅读更多 →

最新新闻

一网统飞定义、痛点、逻辑与落地试点

一网统飞定义、痛点、逻辑与落地试点

基层低空政务治理中长期存在一个典型痛点现象:城管、水利、公安、应急、自然资源等政务部门,各自独立采购无人机、机巢、地面站等硬件设备,各自搭建专属管理系统、各自组建运维队伍、各自开展飞行作业。各部门设备独立管控、飞行独立审批、数…

2026/10/15 16:48:54 阅读更多 →
Positron 中的 context7 项目脚手架:解析 project-setup-info-context7 Skill 的加载机制与使用流程

Positron 中的 context7 项目脚手架:解析 project-setup-info-context7 Skill 的加载机制与使用流程

开发工具代码编辑器数据科学 【免费下载链接】positron Positron, a next-generation data science IDE 项目地址: https://gitcode.com/gh_mirrors/po/positron 点击查看 免费下载 GitHub Copilot Chat 内置了一组"代理技能(Agent Skills&#xf…

2026/10/15 16:48:54 阅读更多 →
无线话筒射频链路复现指南:从综合文档到可量产方案

无线话筒射频链路复现指南:从综合文档到可量产方案

简介:这份资源是围绕无线话筒技术整理的综合性文档包,面向音频工程初学者、电子设计爱好者及需要了解无线传输原理的从业者,帮助其系统认识无线话筒的工作机制与工程实现。压缩包共12个文件,约70KB,以Altium Designer工…

2026/10/15 16:48:54 阅读更多 →
Apollo-11项目全解析:从AGC源码复刻到模拟器与教学实践

Apollo-11项目全解析:从AGC源码复刻到模拟器与教学实践

1. 从“Apollo-11”这个名字说起:它到底指什么第一次看到“Apollo-11”这个标题,很多人脑子里蹦出来的第一反应是阿波罗登月计划。这个联想没错,但如果只停留在“登月”这个层面,就完全错过了它在技术圈里真正的分量。在软件工程和…

2026/10/15 16:48:54 阅读更多 →
Web安全实战指南:从漏洞原理到纵深防御体系构建

Web安全实战指南:从漏洞原理到纵深防御体系构建

Web安全这块儿,入行门槛看着不高,但水是真的深。你可能听说过“三百亿条数据泄露”“某大厂被脱库”这类新闻,往深了挖,背后基本都是Web层面的漏洞被利用。无论是刚转行做开发、想往安全方向走的运维,还是已经有几年经…

2026/10/15 16:48:54 阅读更多 →
粮油方向论文降重:三类做法的实际体验对比

粮油方向论文降重:三类做法的实际体验对比

粮油方向的论文,重复率高的地方很固定:国标检测方法的步骤描述、原料特性的通用表述、工艺原理的铺垫段。这三类占了重复的大头。要降得干净,得先分清哪些能改、哪些碰不得。 一、先划"不能改"的线 这一步必须在动手前做&#xf…

2026/10/15 16:47:54 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →