• 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;
            }
  • 相关阅读:
    Cocos2Dx(3)——动作类备忘
    npm publish发布包时出现403错误no_perms Private mode enable, only admin can publish this module:
    使用node.js定义一个web服务器
    node.js中events模块应用
    session应用:验证用户是否已登录
    简单实现三级导航栏
    promise对象代替回调函解决异步操作
    js一行代码解实现数组去重和排序
    中英文切换导航栏(最简单)
    错误:localhost将您重定向的次数过多
  • 原文地址:https://www.cnblogs.com/xrll/p/13070896.html
Copyright © 2020-2023  润新知