码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 机械臂速成小指南(十七):直线规划


    ​

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

    指南目录📖:
    🎉🎉机械臂速成小指南(零点五):机械臂相关资源🎉🎉
    机械臂速成小指南(零):指南主要内容及分析方法
    机械臂速成小指南(一):机械臂发展概况
    机械臂速成小指南(二):机械臂的应用
    机械臂速成小指南(三):机械臂的机械结构
    机械臂速成小指南(四):机械臂关键部件之减速机
    机械臂速成小指南(五):末端执行器
    机械臂速成小指南(六):步进电机驱动器
    机械臂速成小指南(七):机械臂位姿的描述方法
    机械臂速成小指南(八):运动学建模(标准DH法)
    机械臂速成小指南(九):正运动学分析
    机械臂速成小指南(十):可达工作空间
    机械臂速成小指南(十一):坐标系的标准命名
    机械臂速成小指南(十二):逆运动学分析
    机械臂速成小指南(十三):轨迹规划概述
    机械臂速成小指南(十四):多项式插值轨迹规划
    机械臂速成小指南(十五):线性规划
    机械臂速成小指南(十六):带抛物线过渡的线性规划
    机械臂速成小指南(十七):带抛物线过渡的线性规划
    🦾🌏🪐以下为正文🦾🌏🪐

    在前面的章节中我们介绍了三种常见的关节空间轨迹规划方法:多项式插值轨迹规划、线性规划以及带抛物线过渡的轨迹规划。下面,我们将开始介绍笛卡尔空间轨迹规划方法,本篇文章主要介绍直线规划。在这里插入图片描述

    一、理论分析

    1.什么是笛卡尔空间轨迹规划

    三维空间过定点O,作三条互相垂直的数轴,它们都以O为原点且一般具有相同的长度单位。这三条轴分别叫做x轴(横轴)、y轴(纵轴)、z轴(竖轴);统称坐标轴。通常把x轴和y轴配置在水平面上,而z轴则是铅垂线;它们的正方向要符合右手规则,即以右手握住z轴,当右手的四指从正向x轴以π/2角度转向正向y轴时,大拇指的指向就是z轴的正向,这样的三条坐标轴就组成了一个空间直角坐标系,点O叫做坐标原点。这样就构成了一个笛卡尔坐标。

    当我们使用关节空间轨迹规划时,末端执行器在空间中一定会经过我们设定好的轨迹点,但在两个轨迹点之间的轨迹形状我们无法确定。
    在加工工件、规避障碍等工作场景下,我们必须明确机械臂在起始点与目标点之间的轨迹形状,这时我们必须从笛卡尔空间入手,确定末端执行器在笛卡尔空间中的轨迹函数,即笛卡尔空间轨迹规划。
    每个路径点通常由工具坐标系相对于工作台坐标系的期望位姿来确定。使用笛卡尔空间轨迹规划时,形成轨迹的样条函数是描述笛卡尔变量的随时间变化的函数。这些路径可直接根据我们指定的路径点进行规划,这些路径点是由{T}相对于{S}来描述的,无需事先进行逆运动学求解。
    值得注意的是,笛卡尔空间轨迹规划计算量很大,因为在运行时必须以实时更新路径的速度求出运动学逆解——即在笛卡尔空间生成路径后,最后一步要通过求解逆运动学来得到对应的关节变量。

    2.直线规划

    在这里插入图片描述

    在机械臂作业过程中,我们常希望末端执行器在空间中距离较远的两点间作直线运动,而对应的轨迹规划方法称为直线规划。
    首先考虑对位置的插补。当起始点与目标点的坐标已知时,我们可以确定由起始点指向目标点的向量,其模值等于两点在笛卡尔空间中的距离。根据精度要求以及规划效率的要求,确定从直线轨迹上取得n个轨迹点,由起始点指向第i个路径点的向量表示为
    在这里插入图片描述
    则可得到末端执行器位于第i个轨迹点时的坐标为
    在这里插入图片描述
    下一步,我们需要考虑对姿态的插补。我们首先将起始姿态到目标姿态的变化看作是由工具坐标系绕一个固定轴旋转得到的。设起始姿态对应旋转矩阵为R0,目标姿态对应旋转矩阵为Rf,则该固定轴可表示为
    在这里插入图片描述
    而机械臂末端执行器绕其所旋转角度为
    在这里插入图片描述
    在这里插入图片描述

    二、程序仿真

    使用MATLAB对直线规划进行仿真,路径点个数为50,且选取与前几篇文章中一致的起始点与终止点。

    第一步,定义六自由度机械臂的DH参数

    七自由度空间机械臂避障路径规划方法.pdf
    pdf 0星 超过10%的资源 425KB
    下载
    %定义关节角度限制
    lim1_min = -170 * radian1; lim1_max = 170 * radian1; %关节1(-170,170)
    lim2_min = -132 * radian1; lim2_max =   0 * radian1; %关节2(-132,0)
    lim3_min =    1 * radian1; lim3_max = 141 * radian1; %关节3(1,141)
    lim4_min = -165 * radian1; lim4_max = 165 * radian1; %关节4(-165,165)
    lim5_min = -105 * radian1; lim5_max = 105 * radian1; %关节5(-105,105)
    lim6_min = -155 * radian1; lim6_max = 155 * radian1; %关节6(-155,155)
    
    %定义关节旋转范围
    lim1 = lim1_max - lim1_min;
    lim2 = lim2_max - lim2_min;
    lim3 = lim3_max - lim3_min;
    lim4 = lim4_max - lim4_min;
    lim5 = lim5_max - lim5_min;
    lim6 = lim6_max - lim6_min;
    
    %D-H参数表
    theta1 = 0;    d1 = 169.77;     a1 = 64.2;    alpha1 = -pi/2;    offset1 = 0;
    theta2 = 0;    d2 = 0;          a2 = 305;     alpha2 = 0;        offset2 = 0;
    theta3 = 0;    d3 = 0;          a3 = 0;       alpha3 = pi/2;     offset3 = pi/2;
    theta4 = 0;    d4 = -222.63;    a4 = 0;       alpha4 = -pi/2;    offset4 = 0;
    theta5 = 0;    d5 = 0;          a5 = 0;       alpha5 = pi/2;     offset5 = 0;
    theta6 = 0;    d6 = -36.25;     a6 = 0;       alpha6 = 0;        offset6 = -pi;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    第二步,机械臂运动学建模

    L(1) = Link([theta1, d1, a1, alpha1], 'standard');
    L(2) = Link([theta2, d2, a2, alpha2], 'standard');
    L(3) = Link([theta3, d3, a3, alpha3], 'standard');
    L(4) = Link([theta4, d4, a4, alpha4], 'standard');
    L(5) = Link([theta5, d5, a5, alpha5], 'standard');
    L(6) = Link([theta6, d6, a6, alpha6], 'standard');
    
    %关节偏置
    L(3).offset=-pi/2;
    L(6).offset=pi;
    
    % 定义关节范围
    L(1).qlim=[lim1_min,lim1_max];
    L(2).qlim=[lim2_min,lim2_max];
    L(3).qlim=[lim3_min,lim3_max];
    L(4).qlim=[lim4_min,lim4_max];
    L(5).qlim=[lim5_min,lim5_max];
    L(6).qlim=[lim6_min,lim6_max];  
    
    robot2 = SerialLink(L,'name','AR3');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    第三步,定义轨迹的起始点、终止点及步数

    T1=transl(-100,-100,300);				%起始点齐次变换矩阵
    T2=transl(200,-200,400);				%终止点齐次变换矩阵
    init_ang=robot2.ikine(T1);				%运动学逆解
    targ_ang=robot2.ikine(T2);				%运动学逆解
    step = 50;      %步数
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第四步,直线规划

    Tc = ctraj(T1,T2,step);  	%直线规划,得到每一步的T阵
    q=robot2.ikine(Tc);			%运动学逆解
    figure(f)
    plot3(squeeze(Tc(1,4,:)),squeeze(Tc(2,4,:)),squeeze(Tc(3,4,:)));%输出末端轨迹
    title('直线轨迹');
    T=robot2.fkine(q);   %运动学正解
    robot2.plot(q);	 %动画演示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    效果如下所示

    在这里插入图片描述
    在这里插入图片描述

    三、编程实现

    核心思路就是找到由起始点指向目标点的向量,并在其上求取轨迹点的坐标,进而通过逆运动学求解得到对应的关节变量。
    下方为需要用到的两个简单的核心函数

    def CalcLinDist(X2,Y2,Z2): #计算目标点到当前点的线段长度
      global XcurPos
      global YcurPos
      global ZcurPos
      global LineDist
      X1 = XcurPos
      Y1 = YcurPos
      Z1 = ZcurPos
      LineDist = (((X2-X1)**2)+((Y2-Y1)**2)+((Z2-Z1)**2))**.5
      return (LineDist)
    
    def CalcLinVect(X2,Y2,Z2):#计算由当前点指向目标点的向量
      global XcurPos#当前的
      global YcurPos#当前的
      global ZcurPos#当前的
      global Xv
      global Yv
      global Zv
      X1 = XcurPos
      Y1 = YcurPos
      Z1 = ZcurPos
      Xv = X2-X1
      Yv = Y2-Y1
      Zv = Z2-Z1
      return (Xv,Yv,Zv)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    效果如该图所示
    在这里插入图片描述
    在这里插入图片描述

    🐧🐧需要仿真代码的同学可以在评论区留言🐧🐧

  • 相关阅读:
    Linux网络编程系列之UDP组播
    生产线平衡如何改善?详解:生产线平衡优化改善方法与措施!
    pinia的基本使用和核心实现原理
    C和C++区别联系
    【esp32】arduino-数码管
    spring mvc源码分析之请求分发
    Python中的三个基本知识点
    工业设计的特点和流程
    springcloud3 指定nacos的服务名称和配置文件的group,名称空间
    职场混沌:读书的好,别在变局到来才知道
  • 原文地址:https://blog.csdn.net/m0_53966219/article/details/126081251
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号