Realsense D435i像素坐标转三维坐标:原理、实现与避坑指南

发布时间:2026/10/7 4:56:47
Realsense D435i像素坐标转三维坐标:原理、实现与避坑指南 1. 为什么像素到三维的转换是个“假简单”的问题做机器视觉的人大概都经历过这样一个阶段拿到 Realsense D435i装了 pyrealsense2跑通官方示例屏幕上跳出彩色流和深度流感觉一切都很美好。然后真正上手做项目比如机械臂抓取、AGV 避障、三维重建很快就卡在一个看起来“不就是查表吗”的问题上鼠标点中图像上的一个像素怎么知道这个点对应空间中的哪个位置这个问题之所以“假简单”是因为 D435i 给你的其实不是一个标准的点云。它给的是两张图——RGB 图和一帧深度图。深度图里每个像素存的是一个数值单位是毫米代表该像素对应的物体表面到相机平面的距离。但“距离”只是一个标量没有一个方向你并不知道这个点在空间的哪个方位。想要恢复完整的三维坐标 X、Y、Z必须同时知道三样东西像素坐标 (u, v)、该点的深度值 d以及相机的内参矩阵。只有把这三者组合起来才能把一个二维像素“反投影”到三维射线上的某个点。这篇文章要讲的就是从像素坐标到三维空间的完整转换链路D435i 的深度原理决定了深度值的可靠性边界针孔模型和内参矩阵决定了反投影公式怎么写而外参标定则决定了转换出来的三维点落在哪个坐标系里。我会把原理和代码都讲透最后给出一套我自己在机械臂抓取项目里反复验证过的实现流程和避坑清单。适合刚接触 Realsense、准备做视觉引导或三维测量的人参考也适合被坐标转换折腾得焦头烂额的开发者直接“抄作业”。2. D435i 的深度数据是怎么来的先弄懂数据源头才能理解转换误差很多教程一上来就讲内参矩阵、讲反投影公式把 D435i 当成一个黑盒。但我建议你先花十分钟理解它的深度成像原理因为坐标转换算出来的值再准也弥补不了深度图本身带进来的误差。误差的根源在硬件层不在算法层。2.1 主动红外双目立体视觉D435i 的核心测距机制D435i 不是激光雷达也不是 ToF飞行时间传感器它用的是主动红外双目立体视觉。拆开这台相机你会发现正面有两个红外摄像头中间还有一个红外激光投影仪。工作时激光投影仪会向场景投射一种肉眼不可见的红外散斑图案这个图案的作用是给白墙、桌面这类“没有纹理”的表面人为地叠加上特征点方便左右两个红外摄像头进行匹配。两个红外摄像头同时采集同一场景因为它们在物理上有一定间距基线距离所以同一个三维点在左右两张红外图上的成像位置是有差异的这就是视差。视差越大说明物体离相机越近视差越小说明物体越远。这个关系和人的双眼工作原理一致。D435i 的板载视觉处理器会实时计算整幅图像的视差图再根据标定好的内外参数换算成深度图通过 USB 传给主机。这个原理对坐标转换有一个非常重要的启示深度值的精度和物体表面的纹理丰富度、光照条件、距离范围强相关。在 0.3 米到 3 米这个最佳量程内D435i 的深度误差通常在 1% 到 2% 左右。也就是说一个距离相机 1 米远的点深度值误差可能在 1 到 2 厘米。这个误差在你做三维坐标转换时会被直接继承所以转换出来的 Z 轴坐标本身就不是一个精确值这是硬件极限不是算法 bug。2.2 四个数据流与两种坐标系彩色图和深度图并不天然对齐打开 Realsense Viewer你会看到 D435i 能吃出四路数据左红外、右红外、彩色、深度。这四路数据分别来自不同的传感器它们的像素坐标系原点图像左上角对应的物理传感器位置不同视场角FOV也不同。这里就引出了新手最容易踩的一个坑彩色图的分辨率如果是 1920x1080深度图的分辨率如果是 640x480那么彩色图上的像素 (960, 540) 和深度图上的像素 (320, 240) 指的根本不是同一个空间点。它们只是恰好都位于各自画面的中心。如果你直接取彩色图某个位置的像素然后去深度图相同像素位置取值拿到的深度大概率是错的。所以做坐标转换之前必须明确一件事你输入的像素坐标是在哪个坐标系下的像素坐标如果要以彩色图为准那么深度图必须先通过 Realsense 的 align 功能对齐到彩色坐标系如果要以深度图为准那么你用鼠标在彩色图上点的位置必须先映射到深度图坐标系。后面第三节会详细讲代码实现这里先把这个概念立起来。2.3 深度图本质是一张灰度图不是点云我见过有人把深度图直接当成三维点云来用这是概念上的混淆。深度图就是一张单通道图像每个像素存储一个 16 位无符号整数单位是毫米。它保留了图像的结构有行列、有邻域关系但每个像素只承载了一个标量距离并不承载方向信息。而三维点云是另外一种数据组织方式每个点是一个 (x, y, z) 三元组完全没有图像的行列结构。D435i 官方 SDK 提供的点云接口本质上就是遍历深度图每个像素用内参把 (u, v, d) 反投影成 (x, y, z)再按需叠加彩色信息。这个反投影过程就是本文的核心主题。理解了深度图的本质你就能明白为什么“像素坐标转三维坐标”在数学上并不复杂复杂的是如何保证转换的输入像素位置、深度值、内参都是准确的。3. 核心数学原理针孔模型、内参矩阵与反投影公式现在进入正题。像素坐标到三维坐标的转换有一个标准解法针孔相机模型。D435i 的官方 SDK 里已经封装好了反投影函数但如果你不知道底层公式长什么样遇到问题时就只能靠猜。这里我把公式推一遍并且告诉你每个符号在哪查、怎么验。3.1 针孔模型从三维点(x, y, z)到像素(u, v)的正投影先看正投影方向即三维空间中一个点是如何落到图像平面上的。理想针孔模型下相机坐标系的原点位于相机光心Z 轴指向相机前方X 轴向右Y 轴向下。空间中一个点 P (X, Y, Z)在图像平面上的投影坐标为x X / Z y Y / Z这里的 x 和 y 是归一化平面坐标量纲是“米/米”没有单位。接下来把归一化坐标转到像素坐标u fx * x cx v fy * y cy其中fx、fy 是焦距单位是像素由镜头物理焦距除以像元尺寸得到cx、cy 是主点坐标单位是像素理论上位于图像中心实际会有一点偏移。写成矩阵形式就是常说的内参矩阵 K[ fx 0 cx ] K [ 0 fy cy ] [ 0 0 1 ]像素坐标的齐次形式[u] [ fx 0 cx ] [X] [v] [ 0 fy cy ] [Y] [1] [ 0 0 1 ] [Z]注意这里的等号是“在尺度意义上相等”因为 K 乘以三维坐标得到的结果其实是像素坐标乘以 Z。完整的式子应该写成[ u ] [X] [ v ] K * 1/Z * [Y] [ 1 ] [Z]这个“除以 Z”的动作恰恰就是三维降到二维时丢失深度信息的地方。3.2 反投影从像素坐标( u, v )和深度值 d 恢复三维坐标反投影就是正投影的逆过程。已知像素坐标 (u, v) 和该像素的深度值 d单位与 Z 轴一致D435i 深度图默认是毫米求相机坐标系下的三维坐标。先反解归一化坐标x (u - cx) / fx y (v - cy) / fy由于深度图中存储的 d 就是该像素对应空间点的 Z 值于是X x * d (u - cx) / fx * d Y y * d (v - cy) / fy * d Z d这就是从像素坐标到三维相机坐标的核心公式。注意一个细节这里得到的三维坐标的参考系是相机坐标系原点在相机光心Z 轴指向相机正前方。如果你想要的是机械臂基座坐标系下的坐标那么还需要叠加一个外参变换这个放到第四节讲。3.3 畸变矫正为什么官方 API 要比手写公式更可靠上面的公式是在理想针孔模型下推导的但真实镜头存在径向畸变和切向畸变会让图像的边缘发生扭曲。D435i 的彩色镜头畸变相对明显深度镜头的畸变相对小一些但不是没有。如果要做高精度转换不能直接把原始像素坐标套进公式。标准做法是先用畸变系数对像素坐标进行矫正然后再执行反投影。这一整套逻辑librealsense 的 rs2_deproject_pixel_to_point 函数已经帮你处理好了——它会从相机参数对象里读取内参和畸变系数内部完成矫正和反投影。我见过有人为了省事从网上抄一份公式自己实现反投影结果在图像边缘区域误差特别大。原因就是没做畸变矫正。所以我的建议是除非你有特殊的性能需求比如在嵌入式设备上逐像素处理点云否则直接用官方 SDK 的接口不要手写完整反投影流程。官方接口经过了充分测试性能损耗无非是几十纳秒级别的函数调用不值得为了省这点开销引入误差。但理解公式仍然有价值至少你能判断出哪些参数误差会影响哪一维坐标。例如fx 的标定误差会直接影响 X 坐标估算而深度值误差会同时影响 X、Y、Z 三个方向且误差随距离线性放大。4. 动手实现librealsense 框架下的三种坐标转换方法理论讲完上代码。这一节我给出三种从像素坐标获取三维空间坐标的实现方式适用场景各不相同你可以按需选择。4.1 方法一使用官方反投影 API最推荐通用性最强这是最直接、最不容易出错的方式。核心思路拿到深度帧获取深度传感器的内参然后调用 rs2_deproject_pixel_to_point。import pyrealsense2 as rs import numpy as np # 初始化管线 pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) profile pipeline.start(config) # 获取深度传感器和彩色传感器的内参 depth_sensor profile.get_device().first_depth_sensor() depth_scale depth_sensor.get_depth_scale() # 通常为 0.001即 1 个深度单位 1mm depth_profile profile.get_stream(rs.stream.depth) color_profile profile.get_stream(rs.stream.color) depth_intrinsics depth_profile.as_video_stream_profile().get_intrinsics() color_intrinsics color_profile.as_video_stream_profile().get_intrinsics() # 取一帧数据 frames pipeline.wait_for_frames() depth_frame frames.get_depth_frame() color_frame frames.get_color_frame() if not depth_frame or not color_frame: raise RuntimeError(无法获取帧数据) # 假设你已经知道要查询的像素坐标例如彩色图上的一个目标点 # 注意如果直接使用彩色图上的像素坐标需要先保证深度图和彩色图对齐 # 或者手动将该坐标换算到深度图坐标系下。这里假设已经对齐到深度坐标系。 u 320 v 240 # 方案 A使用深度帧自带的内参直接查询距离然后手工反投影 distance depth_frame.get_distance(u, v) # 单位米 point_camera rs.rs2_deproject_pixel_to_point( depth_intrinsics, [u, v], distance ) print(相机坐标系下的三维坐标米:, point_camera)这里有两个细节值得注意细节一rs2_deproject_pixel_to_point 的三个参数分别是内参、像素坐标列表 [u, v]、深度值单位必须与内参定义一致通常是米。D435i 的深度内参中深度单位默认是米depth_frame.get_distance() 返回的也是米所以直接传入即可。但如果你用 numpy 从深度帧里取原始值比如depth_image[v, u]那个值是以 depth_scale 为单位的默认是毫米需要先乘以 0.001 转成米。细节二这里的像素坐标是在哪个坐标系下的上面的代码用的是深度图像素坐标。如果你手头只有彩色图上的像素坐标最简单的方式是先把深度图像素坐标和彩色图像素坐标建立映射关系或者使用 rs2.align 将深度帧对齐到彩色坐标系。4.2 方法二深度图与彩色图对齐后的像素坐标转换在实际应用中绝大多数场景是“我在彩色图像上识别到了目标物体想知道它的三维位置”。这要求深度图和彩色图逐像素对齐。librealsense 提供了专门的 Align 类from pyrealsense2 import align # 创建对齐对象将深度帧对齐到彩色坐标系 align_to_color align(rs.stream.color) frames pipeline.wait_for_frames() aligned_frames align_to_color.process(frames) aligned_depth_frame aligned_frames.get_depth_frame() color_frame aligned_frames.get_color_frame()对齐之后深度图的分辨率、FOV、原点都和彩色图保持一致。也就是说彩色图像素 (u, v) 对应的深度值可以放心地从 aligned_depth_frame 的 (u, v) 处获取。完整流程如下def get_3d_point_from_color_pixel(u, v, aligned_depth_frame, color_intrinsics): depth_value aligned_depth_frame.get_distance(u, v) if depth_value 0: return None # 该像素没有有效深度值 point rs.rs2_deproject_pixel_to_point( color_intrinsics, [u, v], depth_value ) return point这里的 color_intrinsics 获取方式color_profile profile.get_stream(rs.stream.color) color_intrinsics color_profile.as_video_stream_profile().get_intrinsics()注意深度帧对齐到彩色坐标系之后用于反投影的内参也应该用彩色相机的内参因为此时深度图已经以彩色相机的坐标系为参考了。如果你此时还用深度内参就得出的坐标会错。4.3 方法三手写反投影公式适合理解原理或脱离 SDK 实现如果出于某些原因无法使用官方 SDK例如高性能点云生成、嵌入式平台你可以基于内参矩阵自己写。下面是一段使用 numpy 的实现def deproject_pixel(u, v, depth_value_meter, intrinsics): 手写反投影intrinsics 为 rs2 intrinsics 对象或自定义数据结构 fx intrinsics.fx fy intrinsics.fy cx intrinsics.cx cy intrinsics.cy # 畸变矫正这里略去假设图像中心区域畸变可忽略 x (u - cx) / fx y (v - cy) / fy X x * depth_value_meter Y y * depth_value_meter Z depth_value_meter return [X, Y, Z]如果你处理的是深度图中心区域畸变确实可以忽略但在图像的边缘这个简化会带来明显误差。要做严格手写版需要引入畸变模型通常是 Brown-Conrady 模型包含 k1、k2、k3 三个径向畸变系数和 p1、p2 两个切向畸变系数。librealsense 的 rs2_deproject_pixel_to_point 内部处理了这一步所以我再次强调能用官方接口就别手写。4.4 深度图原始值 vs get_distance 方法的区别一个很容易踩的坑是深度值单位混淆。在 pyrealsense2 中depth_frame.get_distance(u, v)返回的是以米为单位的浮点数内部已经处理好了 depth_scale。np.asanyarray(depth_frame.get_data())返回的是原始 16 位整数数组其数值是 depth_scale 的倍数默认情况下 1 个单位 1 毫米。重新映射到实际米数depth_meters depth_raw * depth_scale其中depth_scale depth_sensor.get_depth_scale()通常为 0.001。如果你混用这两个单位坐标转换出来的 Z 轴会偏差 1000 倍这种错误很难排查因为 X、Y 看起来也怪怪的但又不至于完全离谱。建议在项目初始化时就做一个单位常量管理统一以米为内部单位。5. 外参与手眼标定从相机坐标系到机械臂坐标系的最后一跳像素坐标转出来的三维坐标是相机坐标系下的坐标。但实际项目里你要么需要把物体坐标发个机械臂去抓取要么需要把这些点放到一个固定的世界坐标系里做拼接。这就需要引入外参Extrinsics——它将相机坐标系变换到目标坐标系机械臂基座/世界坐标系。5.1 外参是什么怎么在 Realsense 里获取Realsense SDK 里的 extrinsics 通常指相机内部不同传感器坐标系之间的变换关系比如深度传感器坐标系到彩色传感器坐标系的变换。这个由出厂标定给出用户一般不需要关心。但如果你要把相机装在机械臂末端或固定在工作台上相机坐标系到机械臂基座坐标系的变换就需要自己标定。这个变换是一个 4x4 的齐次变换矩阵[ R t ] [ 0 1 ]其中 R 是 3x3 旋转矩阵t 是 3x1 平移向量。坐标系变换公式P_robot R * P_camera t把上一节得到的 P_camera相机坐标系下的三维点乘上这个矩阵就得到机械臂基座坐标系下的三维坐标。5.2 眼在手上 vs 眼在手外标定方法截然不同根据相机安装位置分两种场景眼在手上Eye-in-Hand相机装在机械臂末端随臂移动。标定时需要移动机械臂到多个位姿观察固定在空间中的标定板求解相机到机械臂末端的变换矩阵。这种标定通常用 OpenCV 的calibrateHandEye实现。眼在手外Eye-to-Hand相机固定在工作台上不随机械臂移动。标定时需要让机械臂带着标定板运动求解相机到机械臂基座的变换矩阵。这类标定也可以使用calibrateHandEye但输入参数有所不同。我在机械臂抓取项目里更多用的是眼在手外的方式相机朝下安装在工作台正上方机械臂基座固定。标定流程大概如下在机械臂末端装一个棋盘格标定板或者用 ChArUco 板控制机械臂运动到 NN≥15个不同的位姿记录每个位姿下机械臂末端的位姿从控制器读取在相机图像中检测标定板的角点用 PnP 求解标定板坐标系到相机坐标系的变换结合末端位姿数据用cv2.calibrateHandEye求解相机到机械臂基座的变换。这一步是整个系统里最容易出问题的地方标定结果差一点点机械臂抓取的位置就会偏几厘米。5.3 标定精度自检一个快速验证方法标定完成后别急着上机械臂。做一个静态验证把标定板放在工作台上某个位置用相机识别标定板上的某个角点通过像素坐标深度值求出它在相机坐标系下的坐标再用标定好的外参把该点变换到机械臂基座坐标系用机械臂示教器上的“直线运动”功能把工具末端移到该基座坐标位置。如果标定准确工具末端应该正好落在标定板的那个角点上。误差如果在 5 毫米以内对于大多数抓取任务来说已经可以接受如果偏了几厘米建议重新标定不要尝试在代码里做“补差”那样只会掩盖问题。6. 实测中的误差来源与修正策略坐标转换的流程跑通之后你会发现一个让人头疼的问题静止场景下同一个像素在连续多帧里算出来的三维坐标并不完全一样而且偶尔会突然跳到非常远或非常近的位置。这些误差不是随机噪声那么简单它们有明确的来源和对应的修正手段。6.1 深度噪声多帧融合与时间滤波D435i 的深度图单帧噪声大约在 1% 距离左右。对静态物体来说最简单有效的降噪方式是取多帧平均depth_frames [] for _ in range(5): frames pipeline.wait_for_frames() depth_frames.append(frames.get_depth_frame()) # 将多帧深度值平均 depth_image np.zeros((480, 640), dtypenp.float32) for df in depth_frames: depth_image np.asanyarray(df.get_data()).astype(np.float32) depth_image / len(depth_frames)如果你用 Realsense 后处理滤镜可以在管线里串联空间滤波器和时间滤波器效果更好。空间滤波器会填平小孔时间滤波器会抑制闪烁。推荐配置spatial rs.spatial_filter() spatial.set_option(rs.option.filter_magnitude, 2) spatial.set_option(rs.option.filter_smooth_alpha, 0.5) spatial.set_option(rs.option.filter_smooth_delta, 20) temporal rs.temporal_filter() temporal.set_option(rs.option.filter_smooth_alpha, 0.4) temporal.set_option(rs.option.filter_smooth_delta, 20)但要注意滤波会牺牲实时性和边缘细节。如果做高速抓取建议只在离线测量场景用强滤波在线场景用轻量滤波。6.2 深度值为 0 的像素为什么有些点永远算不出坐标深度图中值为 0 的像素并不代表“距离为 0”而是代表“该像素没有有效的深度估计”。常见原因包括物体表面太暗反射的红外光不足D435i 无法形成有效视差物体表面过于反光红外散斑被镜面反射到其他方向物体距离太近小于 0.3 米或太远超过 3 米物体表面是半透明的红外光直接穿透。在做坐标转换时必须先处理这些无效像素。get_distance()返回 0 时rs2_deproject_pixel_to_point算出来的坐标毫无意义。我通常的做法是返回 None 并让上层逻辑决定是跳过还是用相邻像素插值。6.3 深度不连续区域的“飞点”问题物体边缘的深度值极易出错。原因在于深度图上一个像素的深度值可能混合了前景和背景的信息导致计算出来的三维点处于前景和背景之间存在的一个虚拟位置。这些点被称为“飞点”或“边缘毛刺”。处理策略有两种在图像空间做边缘检测对边缘膨胀区域的深度值不信任在三维空间用离群点滤波比如半径内近邻点数阈值把孤立点剔除。我用得比较多的是第二种Open3D 的remove_radius_outlier很方便一行代码搞定。6.4 温度漂移一个被低估的误差源D435i 工作时会发热。温度变化会导致相机结构轻微变形影响内参稳定性。官方文档提到开机后的一段时间内深度值会发生漂移。所以精密测量场景下建议让相机开机预热 5 到 10 分钟再进行标定和测量。这个坑非常隐蔽。我早期做实验时早上标定完内参下午测量时发现坐标整体偏移了几个毫米百思不得其解。后来才意识到是热漂移问题。如果你发现系统误差随时间缓慢变化优先排查一下 相机的工作时长和温度。7. 值得保存的通用代码模板与参数速查最后放一套我沉淀下来的通用代码模板它把前面讲的所有环节组合在一起初始化、对齐、反投影、手眼变换、多帧滤波。可以直接复制到你的项目里作为起点。import pyrealsense2 as rs import numpy as np class D435iProjector: def __init__(self, align_to_colorTrue, use_filterTrue): self.pipeline rs.pipeline() self.config rs.config() self.config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) self.config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) self.profile self.pipeline.start(self.config) self.depth_sensor self.profile.get_device().first_depth_sensor() self.depth_scale self.depth_sensor.get_depth_scale() self.color_profile self.profile.get_stream(rs.stream.color) self.color_intrinsics self.color_profile.as_video_stream_profile().get_intrinsics() self.align rs.align(rs.stream.color) if align_to_color else None self.spatial rs.spatial_filter() if use_filter else None self.temporal rs.temporal_filter() if use_filter else None # 手眼标定矩阵相机坐标系 - 机械臂基座坐标系 self.T_cam2base np.eye(4) def set_hand_eye_matrix(self, T): 设置外参 4x4 矩阵 self.T_cam2base T def get_aligned_frames(self): frames self.pipeline.wait_for_frames() if self.align: frames self.align.process(frames) depth_frame frames.get_depth_frame() color_frame frames.get_color_frame() if self.spatial: depth_frame self.spatial.process(depth_frame) if self.temporal: depth_frame self.temporal.process(depth_frame) return depth_frame, color_frame def pixel_to_camera(self, u, v, depth_frame): depth depth_frame.get_distance(u, v) if depth 0: return None return np.array(rs.rs2_deproject_pixel_to_point( self.color_intrinsics, [u, v], depth )) def pixel_to_base(self, u, v, depth_frame): p_cam self.pixel_to_camera(u, v, depth_frame) if p_cam is None: return None p_hom np.array([p_cam[0], p_cam[1], p_cam[2], 1.0]) p_base self.T_cam2base p_hom return p_base[:3] / p_base[3] def stop(self): self.pipeline.stop() # 使用示例 projector D435iProjector(align_to_colorTrue, use_filterTrue) T np.eye(4) # 替换为标定得到的实际矩阵 projector.set_hand_eye_matrix(T) for _ in range(30): depth_frame, color_frame projector.get_aligned_frames() # 假设目标在彩色图上的像素坐标 point projector.pixel_to_base(320, 240, depth_frame) if point is not None: print(目标在机械臂基座坐标系下的位置:, point)关于参数速查我给出一份常用配置表方便你快速排查问题项目默认值说明深度分辨率640x480更高分辨率会降低帧率并增加噪声深度帧率30 FPS高速场景可降到 15 FPS 以提升曝光质量深度单位毫米原始值get_distance() 返回米有效深度范围0.3m - 3m超出此范围精度急剧下降彩色分辨率640x480 / 1920x1080取决于算法需求做目标检测常用 640深度误差约 1% - 2% 距离1 米处典型误差 1-2 厘米8. 再聊几句坐标转换只是开始真正难的是系统集成回到这篇文章的开头。像素坐标转三维坐标公式很简单代码也不复杂但要做好一个实际项目牵扯到的远不止这几行代码。机械臂抓取项目里你最需要关注的往往是坐标转换之外的那些事标定板够不够平整、机械臂的控制器读数准不准、光线会不会在某个角度造成反光、目标物体表面材质是不是深度相机的“克星”。我给初学者的建议是分三步走第一步先把单张图上的坐标转换跑通。用 Realsense Viewer 或者自己写的脚本鼠标点击图像任意位置输出对应的三维坐标并用尺子实测验证。第二步做静态标定验证。把相机固定在支架上在桌上放几个已知间距的标记点用坐标转换算出的距离和真实距离对比评估系统误差。第三步再上手机械臂。先做“点到点”的静态抓取成功之后再考虑动态跟踪、速度规划这些进阶能力。不要一上来就想复制网上那种全自动分拣 Demo很多 Demo 在固定光照、特定物体下才能跑通换个场景就崩了。从像素到三维空间本质上是把二维图像恢复成三维世界的物理信息。这条链路我走了不少弯路上面说的坑基本都是真金白银换来的教训。希望这篇文章能帮你把坐标转换这件事一次做对。后面如果你们在实际项目里遇到特别的误差问题欢迎在评论区把现象和数据贴出来我尽量给些排查思路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询