码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 机械臂速成小指南(十六):带抛物线过渡的线性规划


    👨‍🏫🥰🥳需要机械臂相关资源的同学可以在评论区中留言哦🤖😽🦄

    指南目录📖:

    🎉🎉机械臂速成小指南(零点五):机械臂相关资源🎉🎉

    机械臂速成小指南(零):指南主要内容及分析方法

    机械臂速成小指南(一):机械臂发展概况

    机械臂速成小指南(二):机械臂的应用

    机械臂速成小指南(三):机械臂的机械结构

    机械臂速成小指南(四):机械臂关键部件之减速机

    机械臂速成小指南(五):末端执行器

    机械臂速成小指南(六):步进电机驱动器

    机械臂速成小指南(七):机械臂位姿的描述方法

    机械臂速成小指南(八):运动学建模(标准DH法)

    机械臂速成小指南(九):正运动学分析

    机械臂速成小指南(十):可达工作空间

    机械臂速成小指南(十一):坐标系的标准命名

    机械臂速成小指南(十二):逆运动学分析

    机械臂速成小指南(十三):轨迹规划概述

    机械臂速成小指南(十四):多项式插值轨迹规划

    机械臂速成小指南(十五):线性规划

    机械臂速成小指南(十六):带抛物线过渡的线性规划

    🦾🌏🪐以下为正文🦾🌏🪐

            在上一章文末我们提到了线性规划的缺点:在起始点与终止点处存在速度的突变。因此,为了保证机械臂在起始与终止时的作业稳定性、安全性与精准性,我们使用抛物线对关节运动曲线进行过渡,这种关节空间轨迹规划方法称为带抛物线(parabolic)过渡的线性规划,使得关节角速度能以平滑的方式进行改变。

    一、理论分析

    带抛物线拟合的线性规划

    注:上图仅起到便于读者理解的作用,符号可能与下文不同

            为便于计算,我们设起始拟合段与终止拟合段的持续时间一致,二者关于轨迹中点(t_mid,θ_mid) 中心对称,且拥有大小相等、符号相反的恒定角加速度。

            设 为抛物线拟合区域的角加速度,t_acc 为拟合区域的持续时间,θ_a 为起始拟合段终点角度值。由于起始拟合段终点的速度必须等于直线段的速度,则有

    其中 而θ_a 可表示为

     联立上方两个式子,我们可以得到

    接着,求解t_acc ,得到

            我们注意到,上式可解的条件是抛物线拟合区域的加速度 满足

            当上式等号成立时,关节运动曲线将不存在直线段,而是仅由两段抛物线组成;而当 趋于无穷大时,所规划的关节运动曲线将重新变为一条直线,即回到线性规划的情况。

    二、程序仿真

            使用MATLAB对由抛物线过渡的线性插值的轨迹规划方法进行仿真。

    第一步,定义机械臂的DH参数

    1. %定义关节角度限制
    2. lim1_min = -170 * radian1; lim1_max = 170 * radian1; %关节1(-170,170)
    3. lim2_min = -132 * radian1; lim2_max = 0 * radian1; %关节2(-132,0)
    4. lim3_min = 1 * radian1; lim3_max = 141 * radian1; %关节3(1,141)
    5. lim4_min = -165 * radian1; lim4_max = 165 * radian1; %关节4(-165,165)
    6. lim5_min = -105 * radian1; lim5_max = 105 * radian1; %关节5(-105,105)
    7. lim6_min = -155 * radian1; lim6_max = 155 * radian1; %关节6(-155,155)
    8. %定义关节旋转范围
    9. lim1 = lim1_max - lim1_min;
    10. lim2 = lim2_max - lim2_min;
    11. lim3 = lim3_max - lim3_min;
    12. lim4 = lim4_max - lim4_min;
    13. lim5 = lim5_max - lim5_min;
    14. lim6 = lim6_max - lim6_min;
    15. %D-H参数表
    16. theta1 = 0; d1 = 169.77; a1 = 64.2; alpha1 = -pi/2; offset1 = 0;
    17. theta2 = 0; d2 = 0; a2 = 305; alpha2 = 0; offset2 = 0;
    18. theta3 = 0; d3 = 0; a3 = 0; alpha3 = pi/2; offset3 = pi/2;
    19. theta4 = 0; d4 = -222.63; a4 = 0; alpha4 = -pi/2; offset4 = 0;
    20. theta5 = 0; d5 = 0; a5 = 0; alpha5 = pi/2; offset5 = 0;
    21. theta6 = 0; d6 = -36.25; a6 = 0; alpha6 = 0; offset6 = -pi;

    第二步,运动学建模

    1. L(1) = Link([theta1, d1, a1, alpha1, offset1], 'standard');
    2. L(2) = Link([theta2, d2, a2, alpha2, offset2], 'standard');
    3. L(3) = Link([theta3, d3, a3, alpha3, offset3], 'standard');
    4. L(4) = Link([theta4, d4, a4, alpha4, offset4], 'standard');
    5. L(5) = Link([theta5, d5, a5, alpha5, offset5], 'standard');
    6. L(6) = Link([theta6, d6, a6, alpha6, offset6], 'standard');
    7. % 定义关节范围
    8. L(1).qlim=[lim1_min,lim1_max];
    9. L(2).qlim=[lim2_min,lim2_max];
    10. L(3).qlim=[lim3_min,lim3_max];
    11. L(4).qlim=[lim4_min,lim4_max];
    12. L(5).qlim=[lim5_min,lim5_max];
    13. L(6).qlim=[lim6_min,lim6_max];
    14. robot = SerialLink(L,'name','AR3');

    第三步,定义起始点、终止点以及储存关节角度、角速度、角加速度的数组

    1. T1=transl(-100,-100,300); %齐次变换矩阵
    2. T2=transl(200,-200,400); %齐次变换矩阵
    3. init_ang=robot.ikine(T1); %运动学逆解
    4. targ_ang=robot.ikine(T2); %运动学逆解
    5. q = zeros(step,N); %初始化机械臂的位置
    6. qd = zeros(step,N); %初始化机械臂的角速度
    7. qdd = zeros(step,N); %初始化机械臂的角加速度

    第四步,计算抛物线公式

    1. step = 50; %总步长,也可看作总时间
    2. t_mid = step / 2; %时间中点
    3. t_acc = 10; %抛物线拟合段的持续步长(时间)
    4. middle_ang = (targ_ang - init_ang) / 2 + init_ang; %计算角度中值
    5. a_ang = init_ang + (targ_ang - init_ang) / 12; %定义起始抛物线拟合段的终点角度值
    6. a_velocity = (middle_ang - a_ang) / (t_mid - t_acc); %终止抛物线拟合段的终点角速度值
    7. acceleration = a_velocity / t_acc; %加速度

    第五步,进行轨迹规划

    1. for t = 1:step
    2. % 起始抛物线拟合段
    3. if t <= t_acc
    4. q(t,:) = acceleration * (t)^2 / 2 + init_ang; %位置
    5. qd(t,:) = acceleration * t; %角速度
    6. qdd(t,:) = acceleration; %角加速度
    7. % 直线段
    8. elseif (t > t_acc) && (t <= step - t_acc)
    9. q(t,:) = a_velocity * (t - t_acc) + q(t_acc,:);%位置
    10. qd(t,:) = a_velocity; %角速度
    11. qdd(t,:) = 0; %角加速度
    12. % 终止抛物线拟合段
    13. else
    14. q(t,:) = q(step - t_acc,:) + a_velocity * (t - (step - t_acc)) - acceleration * (t - (step - t_acc))^2 / 2;%位置
    15. qd(t,:) = a_velocity - acceleration * (t + t_acc - step); %角速度
    16. qdd(t,:) = -acceleration; %角加速度
    17. end
    18. end

    效果如下图所示

    三、编程实现

            机械臂在运行过程中较为平稳,且在作往复运动时,臂体振动幅度变小。

  • 相关阅读:
    大数据之MapReduce
    LeetCode75——Day19
    docker基本用法
    为什么WinXP SP2有时候会忘记CD自动播放的设置?
    柠檬班unitest
    分布式环境下Spring Session Redis底层原理
    Expected linebreaks to be ‘LF‘ but found ‘CRLF‘. 使用 ESlint 插件自动格式化配置 解决报错
    网易云课堂-课程分析
    Linux基本指令(一)
    详解cv2.copyMakeBorder函数【OpenCV图像边界填充Python版本】
  • 原文地址:https://blog.csdn.net/m0_53966219/article/details/126058860
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号