zoukankan      html  css  js  c++  java
  • UR6机器人雅可比矩阵及微分运算

            /// <summary>
            /// UR六关节机器人雅可比矩阵
            /// </summary>
            /// <param name="q">每个关节的角度值数组指针</param>
            /// <param name="T">雅可比矩阵指针</param>
            public unsafe void Jacobian(float* q, float* T)
            {
                float s1 = (float)Math.Sin(*q), c1 = (float)Math.Cos(*q); q++; // q1
                float q23 = *q, q234 = *q, s2 = (float)Math.Sin(*q), c2 = (float)Math.Cos(*q); q++; // q2
                float s3 = (float)Math.Sin(*q), c3 = (float)Math.Cos(*q); q23 += *q; q234 += *q; q++; // q3
                q234 += *q; q++; // q4
                float s5 = (float)Math.Sin(*q), c5 = (float)Math.Cos(*q); q++; // q5
                float s6 = (float)Math.Sin(*q), c6 = (float)Math.Cos(*q); // q6
                float s23 = (float)Math.Sin(q23), c23 = (float)Math.Cos(q23);
                float s234 = (float)Math.Sin(q234), c234 = (float)Math.Cos(q234);
    
                *T = (-s1 * c234 * c5 - c1 * s5) * d6 - s1 * s234 * d5 - c1 * d4 - s1 * c23 * a3 - s1 * a2 * s2;T++;
                *T = (-c1 * s234 * c5) * d6 + c1 * c234 * d5 - c1 * s23 * a3 + c1 * a2 * c2; T++;
                *T = (-c1 * s234 * c5) * d6 + c1 * c234 * d5 - c1 * s23 * a3; T++;
                *T = (-c1 * s234 * c5) * d6 + c1 * c234 * d5; T++;
                *T = (-c1 * c234 * s5 - s1 * c5) * d6; T++;
                *T = 0; T++;
    
                *T = (c1 * c234 * c5 - s1 * s5) * d6 + c1 * s234 * d5 - s1 * d4 + c1 * c23 * a3 + c1 * a2 * s2;T++;
                *T = (-s1 * s234 * c5) * d6 + s1 * c234 * d5 - s1 * s23 * a3 + s1 * a2 * c2; T++;
                *T = (-s1 * s234 * c5) * d6 + s1 * c234 * d5 - s1 * s23 * a3; T++;
                *T = (-s1 * s234 * c5) * d6 + s1 * c234 * d5; T++;
                *T = (-s1 * c234 * s5 + c1 * c5) * d6; T++;
                *T = 0; T++;
    
                *T = 0;T++;
                *T = -c234 * c5 * d6 - s234 * d5 - a3 * c23 - a2 * s2; T++;
                *T = -c234 * c5 * d6 - s234 * d5 - a3 * c23; T++;
                *T = -c234 * c5 * d6 - s234 * d5; T++;
                *T = s234 * s5 * d6; T++;
                *T = 0; T++;
    
                *T = 0; T++;
                *T = -s1; T++;
                *T = -s1; T++;
                *T = -s1; T++;
                *T = s234 * c1; T++;
                *T = c1 * c234 * c5 - s1 * s5; T++;
    
                *T = 0; T++;
                *T = c1; T++;
                *T = c1; T++;
                *T = c1; T++;
                *T = s234 * s1; T++;
                *T = s1 * c234 * c5 + c1 * s5; T++;
    
                *T = 1; T++;
                *T = 0; T++;
                *T = 0; T++;
                *T = 0; T++;
                *T = c234; T++;
                *T = -s234 * c5; T++;
            }
    
            /// <summary>
            /// UR六关节机器人关节微分运算(高斯约旦消元法求逆)
            /// </summary>
            /// <param name="q">每个关节的角度值</param>
            /// <param name="diffMat">末端空间位置姿态微分数组[dpx,dpy,dpz,δx,δy,δz]</param>
            /// <returns>六关节角度微分数组[dӨ1,dӨ2,dӨ3,dӨ4,dӨ5,dӨ6]</returns>
            public unsafe float[] Differential(float[] q, float[] diffMat)
            {
                float[] A = diffMat;
                float[,] JacobianMat = new float[6, 6];
                fixed (float* t = JacobianMat,p = q)
                {
                    float* J = t;
                    Jacobian(p, J);
                    for (int i = 0; i < 6; i++)
                    {
                        float m = J[i*6+i];
                        for (int j = i; j < 6; j++)
                        {
                            J[i*6+ j] /= m;
                        }
                        A[i] /= m;
                        for (int k = 0; k < 6; k++)
                        {
                            if (k != i)
                            {
                                m = J[k*6+ i];
                                for (int l = i; l < 6; l++)
                                {
                                    J[k*6+ l] -= m * J[i*6+ l];
                                }
                                A[k] -= m * A[i];
                            }
                        }
                    }
                }
                return A;
            }
  • 相关阅读:
    20200226 Java IO流——廖雪峰
    20200225 Java 多线程(2)-廖雪峰
    20200225 Java 多线程(1)-廖雪峰
    20200224 尚硅谷ElasticSearch【归档】
    20200224 一 概述
    20200222 尚硅谷Dubbo【归档】
    20200222 四、dubbo原理
    Improved robustness of reinforcement learning policies upon conversion to spiking neuronal network platforms applied to Atari Breakout game
    Reinforcement learning in populations of spiking neurons
    Solving the Distal Reward Problem through Linkage of STDP and Dopamine Signaling
  • 原文地址:https://www.cnblogs.com/xrll/p/13070896.html
Copyright © 2011-2022 走看看