- A+
所属分类:.NET技术
1、机械手头部相机与龙门架头部相机的区别?
- 上篇文字讲解了机械手头部相机标定原理及方法,中间有提到只适用于龙门架,那为什么呢?
- 答:龙门架在运动过程中,固定在龙门架上的移动相机相对与龙门架本身只有平移关系,而架在机械手上的相机存在角度旋转;机械手在运动过程中机械臂J1与机械臂J2两个的角度一直在变化,而龙门架的X,Y并没有旋转
2、原理分析
- 如上图所示,J2上面挂载一个相机, 怎么计算旋转关系呢?
- 换个角度看问题,相机相对于P1点的相对位置从来就没有改变,也就是说图像坐标点相对于P1坐标点从来没有改变。
- 假如新建一个坐标系W2,W2以P1为坐标系原点,J2臂延长方向为X轴,J2垂直方向为Y轴。那么相机的图像坐标系与W2存在固定的仿射变换关系(和固定相机一样了)
- 而W2与机械手坐标系存在旋转与平移的关系,平移关系可以通过P1的点位来确定,旋转关系可以通过J1,J2的角度来确定。
- 通过这样分解机械手头部相机就变成了坐标系(平移+旋转)+仿射变换了。
3、详细步骤
- 从原理分析我们可以看到其实龙门架的头部相机标定是机械手头部相机标定的一个特例(无旋转)
- 故其操作步骤和龙门架头部相机标定是一样的,只是后台代码有少许差异
- 详细操作步骤请参考上篇文章《移动相机九点标定工具原理及实现(包涵部分源码)》
4、源码
private void updatePoiMatrix(Position pcbPoi,Position poi1, Position poi2,Position takePhotoPoi) { //更新对应的数组 imagePoiList.Add(new Position() { X = (poi1.X + poi2.X) / 2, Y = (poi1.Y + poi2.Y) / 2 }); //dstPoi- takePhotoPoi,获取takePhoto的J1与J2, System.Windows.Point p1=new System.Windows.Point(); p1.X = pcbPoi.X - takePhotoPoi.X; p1.Y = pcbPoi.Y - takePhotoPoi.Y; var jAngles=this.currentRobot.GetJAngle(); double angleJ = -jAngles[0] - jAngles[1]; System.Windows.Point p2= MatrixHelper.GetRotatePoint(p1, angleJ, new System.Windows.Point() { X = 0, Y = 0 }); Position newDstPoi = new Position(); newDstPoi.X = p2.X; newDstPoi.Y = p2.Y; robotPoiList.Add(newDstPoi); } /// <summary> /// 逆时针旋转,获取旋转后的点位 /// </summary> /// <param name="p1">待旋转的点</param> /// <param name="angle">旋转角度</param> /// <param name="center">旋转中心</param> /// <returns></returns> public static Point GetRotatePoint(Point p1, double angle, Point center) { //使用旋转矩阵求值 RotateTransform rotateTransform = new RotateTransform(angle, center.X, center.Y); Point p = new Point(p1.X, p1.Y); System.Windows.Point p2 = rotateTransform.Transform(p); return p2; }
5. 后续计划[敬请期待],如需完整代码请微信联系
- 下相机定位算法
- 基于头部相机的载具定位算法
- 基于顶部相机的塑盘取料算法
- 基于头部相机的检测算法实现
- 一种面向接口接口、依赖注入的运控框架的总体介绍及分层实现