1. 为什么要标定旋转中心

  • 在机器视觉实际应用过程中,有这样的案例:机械手要抓取物料,物料每次的角度不一样,机械手的末端工具中心与其自身的旋转中心不重合,如果想完成这个抓取的工作,有两种解决方案:
  1. TCP标定(Tool Center Point)
  • 一般机械手都会有建立新工具坐标系的功能,比如EPSON。TCP标定的本质就是求旧的工具坐标系与新的工具坐标系的旋转平移矩阵。一般是定义新的工具编号,放一个参考点,多次旋转U轴(旋转轴)(4次),然后移动X,Y(base下)使新工具坐标末端对准参考点,
  • 对完之后点击示教就行了。以上使EPOSN的简单流程。
  1. 标定旋转中心和旋转半径
  • 如果机器人没有TCP标定的功能怎么办呢?其实这种概率比较低,因为市场上几乎所有的机器人都会有这种功能了,大部分是由于操作机器人的工程师业务不够熟练,所以就把这个任务交给机器视觉工程师了。
  • 还有另外一种情况,如果你使用的运动机构是运动控制卡控制的,这里我们讨论的是有旋转轴的机构,而且旋转轴上的工具末端中心又和旋转轴不重合,这时候就不得不标定旋转中心和旋转半径了。
  • 其实一般带有旋转轴的机构,我们都会标定旋转中心的,因为靠机械定位误差比较大,机器视觉工程师要对最终的精度负责,标定旋转中心是必要的,要不然我们要旋转轴干嘛呢?

2. 如何标定旋转中心

2.1 标定旋转中心的操作步骤

  • 如下图,在旋转轴工具上放置一个Mark点,旋转角度,获得三个点,三点拟合圆,获得圆心坐标和旋转半径(默认已经做完九点标定,这三个点转为世界坐标后再计算圆心坐标和旋转半径)。
  • 在这里插入图片描述

2.2 三点拟合圆心代码:

通过下面的计算,我们能得到旋转中心和旋转半径。
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 求圆心
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double[] xy = new double[3];
            xy = RotateCenter(double.Parse(txtX1.Text),double.Parse(txtY1.Text),double.Parse(txtX2.Text),double.Parse(txtY2.Text),double.Parse(txtX3.Text),double.Parse(txtY3.Text));
            txtxcen.Text = xy[0].ToString();//X
            txtycen.Text = xy[1].ToString();//Y
            txtrcen.Text = xy[2].ToString();//R

        }
        public double[] RotateCenter(double x1,double y1,double x2,double y2,double x3,double y3)
        {
            double a, b, c, d, e, f;
            a = 2 * (x2-x1);
            b = 2 * (y2-y1);
            c = x2 * x2 + y2 * y2 - x1 * x1 - y1 * y1;
            d = 2 * (x3 - x2);
            e = 2 * (y3 - y2);
            f = x3 * x3 + y3 * y3 - x2 * x2 - y2 * y2;
            double x = (b * f - e * c) / (b*d-e*a);
            double y = (d*c-a*f) / (b*d-e*a);
            double r = Math.Sqrt((x1 - x) * (x1 - x) + (y1 - x) * (y1 - x));
            double[] xyr = new double[3];
            xyr[0] = x;
            xyr[1] = y;
            xyr[2] = r;
            return xyr;
        }
    }
}

3. halcon多点拟合圆的方法

如果你使用的算法库是halcon,那么我将给您提供一个更方便的多点拟合圆的方法:

  • 博客链接:https://blog.csdn.net/weixin_38566632/article/details/118580370?spm=1001.2014.3001.5501
  • 这种方法更灵活,您可以自由增加点数而不受限制。
    在这里插入图片描述
  • halcon代码:
    Row := [0,100.5,100,3]
    Col := [4,0,100,99.4]
    
    gen_contour_polygon_xld (Contour, Row, Col)
    fit_circle_contour_xld (Contour, 'geotukey', -1, 0, 0, 3, 2, Row_C, Column_C, Radius_C, StartPhi_C, EndPhi_C, PointOrder_C)
     
    dev_set_color ('blue')
    gen_circle_contour_xld (ContCircle, Row_C, Column_C, Radius_C, 0, 4 * acos(0), 'positive', 1)
    

4. 如何使用旋转中心计算偏移量

这一步就是最重要的一步了,如何使用旋转中心和旋转半径来确定偏移量呢?
在这里插入图片描述

在这里插入图片描述

已知:旋转中心坐标和旋转半径R
〖R=l〗_OB 〖=l〗_OA

设:
在这里插入图片描述

因为
三角形BAC 和 三角形 OAD是相似三角形
所以
在这里插入图片描述

求解上面方程:
在这里插入图片描述

5. 计算一点绕另一点旋转一定角度后新点的坐标

using System;

namespace RotatePoint
{
    class Program
    {
        static void Main(string[] args)
        {
            double X = 0;
            double Y = 0;
            //顺时针角度为负数
            RotateAngle(1, 1, -45, 2, 2, ref X, ref Y);

            Console.WriteLine(X+","+Y);
            Console.ReadKey();
        }

        public static string RotateAngle(double XRotation, double YRotation, double ARotate, double XBefore, double YBefore, ref double XAfter, ref double YAfter)
        {
            try
            {
                double Rad = 0;
                Rad = ARotate * Math.Acos(-1) / 180;
                XAfter = (XBefore - XRotation) * Math.Cos(Rad) - (YBefore - YRotation) * Math.Sin(Rad) + XRotation;
                YAfter = (YBefore - YRotation) * Math.Cos(Rad) + (XBefore - XRotation) * Math.Sin(Rad) + YRotation;
                return "OK";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }
}

  • 标定旋转中心的目的就是,计算旋转一定角度后新点的坐标;

X,Y和角度纠偏的步骤:

  • X,Y和角度的偏差,在机械动作上是同时进行纠偏的,但是在算法中却不是,我们往往是先转正角度,然后算出转正角度后新位置的坐标;
  • 此时新位置和模板角度是相同的,只需要平移就能重合,这个平移量就是9点标定时算出并保存的仿射变换矩阵来计算的了。

对我的文章感兴趣的小伙伴,可以关注我,我会一直更新这类的文章,和大家一起探讨学习。如果您觉得文章写的还不错的话,就帮我点个赞吧。