HUD相机标定完成后辅助调节机器人角度时角度的计算方法
坐标系说明
车辆坐标系



标定说明
- 根据标靶四孔的三坐标计算出标靶中心坐标$O$
- 相机走到与$O$点相同的$YZ$坐标处, 保证相机中心与$O$点在同一轴线上
- 将标靶左上角圆孔中心坐标填入标定点.Point3DXYZ中
- 测量相机感光芯片到标靶的距离填入特征点.DotDistance中
- 调整相机角度使得图像中心十字位于标靶中心$O$处, 且目测图像角度偏差不大
- 拍照识别四个圆孔
- 标定内外参
- 将ROI框住某个圆孔点击标定验证, 查看输出角度进行微调后重复567步, 直到输出满足要求
- 若角度偏差大但图像很正, 可能是坐标参数的输入有问题
- 若某个点的偏移量大, 可适当调整曝光使识别更准确后再验证
图像说明





左上角为P1,右上角为P3
左下角为P7,右下角为P9
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| PointF3D Point3d = CameraAgorithm.Pixel2World(p, Camera, Camera.Extrinsics_Tz_mm - Camera.Point3DZ);
PointF3D P1 = CameraAgorithm.Pixel2World(_calibrationAgorithm.DotLeftTop, Camera, Camera.Extrinsics_Tz_mm - Camera.Point3DZ); PointF3D P3 = CameraAgorithm.Pixel2World(_calibrationAgorithm.DotRightTop, Camera, Camera.Extrinsics_Tz_mm - Camera.Point3DZ); PointF3D P7 = CameraAgorithm.Pixel2World(_calibrationAgorithm.DotLeftBottom, Camera, Camera.Extrinsics_Tz_mm - Camera.Point3DZ); PointF3D P9 = CameraAgorithm.Pixel2World(_calibrationAgorithm.DotRightBottom, Camera, Camera.Extrinsics_Tz_mm - Camera.Point3DZ);
PointF3D PCenter = CameraAgorithm.Pixel2World(new PointF(Camera.PixelWidth/2,Camera.PixelHeight/2), Camera, Camera.Extrinsics_Tz_mm - Camera.Point3DZ);
double RX = Math.Atan((P3.P_Y - P1.P_Y) / (P3.P_X - P1.P_X)) * 180 / Math.PI;
double RY = Math.Atan(((PCenter.P_X - m_Motion.Data_YPos.xValue.zFloat())) / (Camera.Extrinsics_Tz_mm - Camera.Point3DZ)) * 180 / Math.PI;
double RZ = Math.Atan(((PCenter.P_Y - m_Motion.Data_ZPos.xValue.zFloat())) / (Camera.Extrinsics_Tz_mm - Camera.Point3DZ)) * 180 / Math.PI;
|