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;
            }
  • 相关阅读:
    优化算法-BFGS
    Go语言及Web框架Beego环境无脑搭建
    使用WCF扩展记录服务调用时间
    红黑树LLRB
    springmvc国际化 基于请求的国际化配置
    Adapter Pattern
    泡泡屏保
    使用WCF扩展在方法调用前初始化环境
    OAuth的一个.NET开源实现
    Google C++编程风格指南
  • 原文地址:https://www.cnblogs.com/xrll/p/13070896.html
Copyright © 2011-2022 走看看