3.3 柔顺控制代码实现

本文介绍了基于导纳控制的柔顺控制实现,适用于自动驾驶领域的机械臂末端控制。首先,文章阐述了柔顺控制的需求背景,然后详细解析了导纳控制的核心算法,并提供了相应的代码实现,包括头文件、源代码和CMakeLists.txt的编写。通过模拟测试验证了导纳控制的有效性。
摘要由CSDN通过智能技术生成

        本文隶属于工程机械臂末端柔顺控制(Ros+Gazebo仿真实现)

0 前言

        之前写了一个UR5的运动学库,参考3.2 写一个UR机器人运动学库,发现该运动学库需要补充一部分内容,主要是关于雅各比矩阵的,后面能不能用到雅各比不知道,但是运动学库里面怎么能不包含雅各比矩阵呢?所以先写上去再说。

        于是乎添加了一个获取当前雅各比矩阵的函数,代码如下:

bool Kinematics::GetJacobian(const JointsDisplacement &angles, JacobianMat &mat)
{
    try
    {
        TransMat T12 = FT::rotz(angles[0]) * FT::trans(0, 0, this->d[0]) * FT::rotx(this->alpha[0]) 
                        * FT::trans(this->a[0], 0, 0);
        TransMat T23 = FT::rotz(angles[1]) * FT::trans(0, 0, this->d[1]) * FT::rotx(this->alpha[1]) 
                        * FT::trans(this->a[1], 0, 0);
        TransMat T34 = FT::rotz(angles[2]) * FT::trans(0, 0, this->d[2]) * FT::rotx(this->alpha[2]) 
                        * FT::trans(this->a[2], 0, 0);
        TransMat T45 = FT::rotz(angles[3]) * FT::trans(0, 0, this->d[3]) * FT::rotx(this->alpha[3]) 
                        * FT::trans(this->a[3], 0, 0);
        TransMat T56 = FT::rotz(angles[4]) * FT::trans(0, 0, this->d[4]) * FT::rotx(this->alpha[4]) 
                        * FT::trans(this->a[4], 0, 0);
        TransMat T67 = FT::rotz(angles[5]) * FT::trans(0, 0, this->d[5]) * FT::rotx(this->alpha[5]) 
                        * FT::trans(this->a[5], 0, 0);

        TransMat T13 = T12 * T23;
        TransMat T14 = T13 * T34;
        TransMat T15 = T14 * T45;
        TransMat T16 = T15 * T56;
        TransMat T17 = T16 * T67;

        Direction o1, o2, o3, o4, o5, o6, o7;
        o1 << 0.0, 0.0, 0.0;
        o2 << T12(0, 3), T12(1, 3), T12(2, 3);
        o3 << T13(0, 3), T13(1, 3), T13(2, 3);
        o4 << T14(0, 3), T14(1, 3), T14(2, 3);
        o5 << T15(0, 3), T15(1, 3), T15(2, 3);
        o6 << T16(0, 3), T16(1, 3), T16(2, 3);
        o7 << T17(0, 3), T17(1, 3), T17(2, 3);

        Direction z1, z2, z3, z4, z5, z6, z7;
        z1 << 0.0, 0.0, 1.0;
        z2 << T12(0, 2), T12(1, 2), T12(2, 2);
        z3 << T13(0, 2), T13(1, 2), T13(2, 2);
        z4 << T14(0, 2), T14(1, 2), T14(2, 2);
        z5 << T15(0, 2), T15(1, 2), T15(2, 2);
        z6 << T16(0, 2), T16(1, 2), T16(2, 2);
        z7 << T17(0, 2), T17(1, 2), T17(2, 2);

        auto Jv1 = z1.cross(o7 - o1);
        auto Jv2 = z2.cross(o7 - o2);
        auto Jv3 = z3.cross(o7 - o3);
        auto Jv4 = z4.cross(o7 - o4);
        auto Jv5 = z5.cross(o7 - o5);
        auto Jv6 = z6.cross(o7 - o6);

        mat << Jv1(0), Jv2(0), Jv3(0), Jv4(0), Jv5(0), Jv6(0),
            Jv1(1), Jv2(1), Jv3(1), Jv4(1), Jv5(1), Jv6(1),
            Jv1(2), Jv2(2), Jv3(2), Jv4(2), Jv5(2), Jv6(2),
            z1(0), z2(0), z3(0), z4(0), z5(0), z6(0),
            z1(1), z2(1
以下是一个导纳控制的Matlab代码的示例: ```matlab flag1=0; while (flag1==0) disp(' 输入 1 以查看母线电压幅度') disp(' 输入 2 看母线电压相位') disp(' 输入 3 以查看有功功率流') disp(' 输入 4 以查看无功功率流') disp(' 输入 5 停止') sel = input('Introduce an option >> '); if sel==1 bar(V) title('节点电压幅值') xlabel('节点个数') ylabel('电压') disp('停顿:按任何键继续') pause elseif sel==2 bar((180/pi)*Theta) title('节点电压相位') xlabel('节点个数') ylabel('相角') disp('停顿:按任何键继续') pause elseif sel==3 bar(Pij) title('有功功率(Pij)') xlabel('节点') ylabel('有功功率') disp('停顿:按任何键继续') pause elseif sel==4 bar(Qij) title('无功功率 (Qij)') xlabel('节点') ylabel('无功功率') disp('停顿:按任何键继续') pause elseif sel ==5 flag1=1; else disp('not a valid choice') end end ``` 这段代码是一个循环,根据用户的选择来显示不同的结果。用户可以选择查看母线电压幅度、母线电压相位、有功功率流或无功功率流。每次选择后,代码会显示相应的图表,并在用户按下任意键后暂停。如果用户选择停止,循环将结束。这段代码可以用于导纳控制的计算和可视化。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* *3* [电力系统潮流【牛顿-拉夫逊法】(4节点、5节点、6节点、9节点)(Matlab代码实现)](https://blog.csdn.net/2201_75454341/article/details/128095725)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值