前言
本文不讲原理,旨在会用,不踩坑。
一、UVW平台介绍
疑问: 如何理解可以以平台任意一点为中心进行旋转? 我们目前是以平台的旋转中心最为相机的原点坐标。
关于原理
目前,我们使用的是旋转标定,这个方式找到的中心应该不是很准。
三、关于uvw的公式
那三个轴是如何进行旋转了的呢?可以看下图:
1 每个轴按顺时针或逆时针走一个距离,就是旋转。
2 图中W动,U轴V轴不动,就是X方向的平移
3 图中U轴V轴同时动,X不动,就是Y方向的平移。
每个制造uvw平台的公式都会提供自己的公式,用来计算角度到uvw分量的计算。
1 平台的半径
2 平台轴初始的三个角度
这次用的平台提供的参数如下:
公式如下:
上面的是用于计算角度的。下面是计算极限的,我们先关注角度这个部分。
1 角度的计算
这个无非是通过三角函数计算出角度到uvw的分量。但是我们对位的时候,一般都是平移+加上角度。
不过对应我们的uvw平台旋转也是通过平移实现的。
所以要实现平移+旋转。其实就是两个步骤。
1 通过三角函数计算出角度到uvw的分量
2 叠加平移分量和角度分量,其实就是相加。
这里,我直接给出C#代码实现:
/// <summary>
/// XYR移动量转UVW移动量
/// </summary>
/// <param name="MoveY">Y方向移动量</param>
/// <param name="MoveX">X方向移动量</param>
/// <param name="Rotatetion">旋转角度移动量</param>
public void DataUVW(float MoveX, float MoveY, float Rotatetion)
{float R = GlobalData.Instance.saveInfo.R;float θx = GlobalData.Instance.saveInfo.X;float θy1 = GlobalData.Instance.saveInfo.Y1;float θy2 = GlobalData.Instance.saveInfo.Y2;Rotatetion *= -1;//double rad = Rotatetion * Math.PI / 180;//偏移补偿MoveY += GlobalData.Instance.saveInfo.OffsetY;MoveX += GlobalData.Instance.saveInfo.OffsetX;GlobalData.Instance.U = -(float)(R * Math.Sin(Rotatetion + θx) - R * Math.Sin(θx));GlobalData.Instance.V = (float)(R * Math.Cos(Rotatetion + θy1) - R * Math.Cos(θy1));GlobalData.Instance.W = -(float)(R * Math.Cos(Rotatetion + θy2) - R * Math.Cos(θy2));float tempX = -MoveX;float tempY1 = MoveY;float tempY2 = -MoveY;//角度补偿GlobalData.Instance.U += GlobalData.Instance.saveInfo.OffsetA;GlobalData.Instance.V += GlobalData.Instance.saveInfo.OffsetA;GlobalData.Instance.W += GlobalData.Instance.saveInfo.OffsetA;//角度和平移的叠加GlobalData.Instance.U += tempX;GlobalData.Instance.V += tempY1;GlobalData.Instance.W += tempY2;
}
踩坑记录
1 首先,要注意Math的库里的三脚函数,参数都是弧度,不是角度,所以先要把角度转为弧度再进行计算。
2 其实每个轴对应的初始角度顺序不能错!
3 要根据电机实际的运动方向适当的添加正负号。
特别是角度和平移叠加的时候,方向要一致!
额外的记录
为啥正转一度和反转一度,通过计算的得到的平移的距离的绝对值不相同?
暂不明白,大概意思是,旋转的中心不是平台的正中心导致的。所以正转一度和反转一度平移的距离的绝对值不相同。
参考文章:
https://blog.csdn.net/weixin_38672958/article/details/129190738