今天聊聊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
    }
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐