工業機器人末端姿態表示-歐拉角,俯仰滾動角


機器人運動學研究時,通常采用矩陣運算形式,所以包括末端關節的各關節空間姿態是向量形式 ,因此至少需要6個參數表達(n,o,a中的兩組),末端關節的姿態在運動學計算時會做為輸入參數,表達末端空間姿態的除用向量組形式外還有歐拉角(Euler Angles)、俯仰滾動角(roll-pitch-yaw)(也稱橫搖角,縱搖角,偏轉角)等,這樣輸入的參數會少些,我知道的廣數GSB-RB8就是采用俯仰滾動角輸入的,在實際操作中需要一個從向量組到角度的轉換;

歐拉角、俯仰滾動角(Tait–Bryan angles)分別參照:

https://en.wikipedia.org/wiki/Euler_angles

https://en.wikipedia.org/wiki/Euler_angles#Tait.E2.80.93Bryan_angles

兩者的區別在於旋轉軸及次序,例歐拉角為z-x-z’’,俯仰滾動角則為z-x-y’’,歐拉角為x-y-x’’,則俯仰滾動角則為:x-y-z’’,這需要一定的空間想象。 

向量組轉為歐拉角: 

α=arg(rahx,rahy) 小於零時α=arg(rahx,rahy)+ π 

β=arg(rahx, rahxCosα + rahySinα) 

γ=arg(-rohxSinα+ rohyCosα, -rnhxSinα+ rnhyCosα) 

向量組轉為俯仰滾動角: 

ξ = arg(rnhx,rnhy) 小於零時α=arg(rnhx,rnhy)+ π 

Ø= arg(rnhxCosξ+ rnhySinξ,-rnhx,) 

Ψ= arg(-rohxSinξ+ rohyCosξ, rahxSinξ - rahyCosξ) 

arg(x,y)表示復數z=x+iy的幅角,即Atan2(y,x)。

        /// <summary>
        /// 姿態的向量形式轉化為角度形式
        /// </summary>
        /// <param name="ev">向量[n,o,a] = {{nx,ox,ax},{ny,oy,ay},{nz,oz,az}}</param>
        /// <param name="euler">true為歐拉角,否則為俯仰滾動角</param>
        /// <returns>角度數組{α,β,ϒ}</returns>
        public static double[] TransToAng(double[,] ev, bool euler)
        {
            double[] RA = new double[3];
            double nx = ev[0, 0];
            double ny = ev[1, 0];
            double nz = ev[2, 0];
            double ox = ev[0, 1];
            double oy = ev[1, 1];
            double oz = ev[2, 1];
            double ax = ev[0, 2];
            double ay = ev[1, 2];
            double az = ev[2, 2];
            double α, β, ϒ;
            if (euler)
            {
                α = Math.Atan(ay / ax);
                α = α < 0 ? α + Math.PI : α;
                β = Math.Atan((ax * Math.Cos(α) + ay * Math.Sin(α)) / az);
                ϒ = Math.Atan((-nx * Math.Sin(α) + ny * Math.Cos(α)) / (-ox * Math.Sin(α) + oy * Math.Cos(α)));
            }
            else
            {
                α = Math.Atan(ny / nx);
                α = α < 0 ? α + Math.PI : α;
                β = Math.Atan((-nz) / (nx * Math.Cos(α) + ny * Math.Sin(α)));
                ϒ = Math.Atan((ax * Math.Sin(α) - ay * Math.Cos(α)) / (-ox * Math.Sin(α) + oy * Math.Cos(α)));
                ϒ = ϒ < 0 ? ϒ + Math.PI : ϒ;
            }
            RA = new double[] { α * 180.0 / Math.PI, β * 180.0 / Math.PI, ϒ * 180.0 / Math.PI };
            return RA;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM