今天聊聊UVW平台用C#实现平移和旋转的功能。
众所周知,UVW平台功能强大,可以实现绕任意点旋转。本来我的工作就是视觉相关。
对于视觉来说, UVW平台在图像里面仅有一个旋转中心。因为相机位置固定, 我们只求出平台的旋转中心就可以做视觉引导。
进入正题。Talk is simple,code first.
下面R, θx1 , θx2 , θy1为供应商提供的固定参数, 和购买的平台有关,需要咨询供应商获取。
简单的理解就是把XYR方向的分量转成UVW对应的轴分量。 XYR分量可以叠加。
/// <summary>
/// UVW 类型数据,通常用于XYR增量转UVW增量
/// </summary>
public class DataUVW
{
#region Public-Members
private double R { get; set; } = 50;
private double θx1 { get; set; } = 90 * Math.PI / 180;
private double θx2 { get; set; } = 270 * Math.PI / 180;
private double θy1 { get; set; } = 180 * Math.PI / 180;
public double V { get; set; }
public double W { get; set; }
public double U { get; set; }
#endregion
#region Private-Members
#endregion
#region Constructors-and-Factories
/// <summary>
/// XYR移动量转UVW移动量
/// </summary>
/// <param name="MoveY">Y方向移动量</param>
/// <param name="MoveX">X方向移动量</param>
/// <param name="Rotatetion">旋转角度移动量</param>
public DataUVW(double MoveY, double MoveX, double Rotatetion)
{
Rotatetion *= -1;
double rad = Rotatetion * Math.PI / 180;
U = R * Math.Sin(rad + θy1) - R * Math.Sin(θy1);
V = R * Math.Cos(rad + θx1) - R * Math.Cos(θx1);
W = -1 * (R * Math.Cos(rad + θx2) - R * Math.Cos(θx2));
// W = R * Math.Cos(rad + θx2) - R * Math.Cos(θx2);
double tempX1 = MoveX;
double tempX2 = MoveX;
double tempY1 = MoveY;
U += tempY1;
V += tempX1;
W -= tempX2;
}
/// <summary>
/// XYR移动量转UVW移动量
/// </summary>
/// <param name="_dataXYR">封装的XYR体类</param>
public DataUVW(DataXYR _dataXYR)
{
_dataXYR.R *= -1;
double rad = _dataXYR.R * Math.PI / 180;
U = R * Math.Sin(rad + θy1) - R * Math.Sin(θy1);
V = R * Math.Cos(rad + θx1) - R * Math.Cos(θx1);
W = -1 * (R * Math.Cos(rad + θx2) - R * Math.Cos(θx2));
// W = R * Math.Cos(rad + θx2) - R * Math.Cos(θx2);
double tempX1 = _dataXYR.X;
double tempX2 = _dataXYR.X;
double tempY1 = _dataXYR.Y;
U += tempY1;
V += tempX1;
W -= tempX2;
}
public DataXYR ToXYR()
{
return new DataXYR(U, V, W);
}
#endregion
#region Public-Methods
#endregion
#region Private-Methods
#endregion
}