精华内容
下载资源
问答
  • 机器人运动学

    2015-05-25 11:40:30
    机器人运动学求解,利用maple进行机器人的正运动学进行建模求解
  • 机器人运动学机器人运动学机器人运动学机器人运动学
  • 机器人运动学分析

    2020-05-16 08:27:18
    机器人运动学的分析是研究机器人控制的基础,能够保证机器人的控制化程度。以库卡机器人为例,建立D-H坐标系,对它进行运动学正反解,用MATLAB辅助计算。
  • Opengl机器人运动学

    2018-03-03 10:47:23
    最近开始接触了opengl,学了机器人的运动学,求正解与反解,3d图片导入,以及DH建模,机器人运动仿真系统。...下面是我学习成果和一些在网上找到的参考资料,对于刚开始接触机器人运动学的小伙伴们是非常有帮助的。
  • 工业机器人运动学

    2016-05-07 13:36:35
    工业机器人运动学
  • VS50机器人运动学分析

    2020-06-28 22:52:46
    根据机器人D-H矩阵理论,通过VS50机器人工件中心坐标系向机座坐标系的齐次坐标变换,建立了该机器人运动学正问题的数学模型。求解该方程并测量该模型在运动仿真前后其工件中心的位置,使VS50机器人的数学模型和运动仿真...
  • 首先,你感兴趣的是机器人运动学与动力学,我个人通常将这两块定义为:机器人空间位置、姿态等状态,随连续或非连续时间的一个变化过程。通常,我们可以通过代数方程、微分方程、差分方程来对这样的系统进行建模。在...

    来答干货,UCLA系统与控制方向硕士在读,发过一些小文章,对之前的学习路线做个总结。

    首先,你感兴趣的是机器人运动学与动力学,我个人通常将这两块定义为:机器人空间位置、姿态等状态,随连续或非连续时间的一个变化过程。通常,我们可以通过代数方程、微分方程、差分方程来对这样的系统进行建模。

    在控制理论中,我们总是要对大量的线性与非线性、自治与非自治的“方程”进行研究。现代控制理论的一些重要研究方法,比如状态空间法、数值方法等,其数学基础也是微分方程的解的存在性与唯一性定理、矢量场、Euler法与龙格-库塔法等。所以在讨论机器人运动控制、力控制等问题时,我们基本离不开数学方程。

    此外,由于研究的深入、系统复杂性的增加、扰动不确定性的增强。我们所面对的系统往往有更多的state,甚至更多input/output,所以我们也需要运用一种更加简洁的表示方法,对上一段所说的dynamics equation进行描述,矩阵运算也就应运而生了。最基础的要求显然是线性代数,这不光对于机器人动力学、控制很重要,对于力学和控制的其他分支同样如此。比如非线性、结构振动、气动弹性力学啊,线性代数都是最基础也是最重要的。和一元二元微积分一样,如果能对矩阵行列式、特征值、秩、Gram-Schemidt定理、SVD分解、Jacobi矩阵等概念烂熟于心,会对学术研究很有帮助。

    另外,matlab或者maple/mathematica非常重要!因为我发现国内很多院校的线性代数课上根本不会cover用到matlab的内容,比如SVD分解、QR分解完全可以通过一行matlab代码完成,非要让学生用手算,很多学生觉得麻烦索性就列个式子就直接抄答案了,或者就专注于算结果而不关注于他们的物理意义和应用了,但这样会错过一些非常有趣的东西(下面是举例说明,嫌长建议跳过)

    拿SVD分解来说吧(对8起,我真不知道unitary矩阵怎么翻译...)

    式子中的V矩阵和U矩阵是存在某种映射关系的。我们在控制学中常说的增益(gain),就与V,U两个矩阵相关,如果我们将A和V中的某一列向量做矩阵乘法,并进行标准化(normalization)之后,发现得到的就是U中对应的列向量,我们将V称为增益输入(gain input),U称为增益输出(gain output)。

    我相信如果不用matlab的话,很少有学生愿意手撸SVD分解之后,还去再额外做两个矩阵乘法和标准化。如果再扩展一点,从增益这块还能引申到矩阵“模”(induced norm,我还是不会翻译..)的几何意义与推导。图中蓝色的圆是单位向量在二维实平面内的集合,黑色虚线和红色虚线分别是low input gain/high input gain,对应的黑色红色实线是low gain output\high gain output。绿色椭圆是矩阵A*向量v(注意区分之前的大写V)的结果。但蓝色圆上点到(0, 0)的距离,同时也意味着向量v的p-norm为1,绿色上一点到(0, 0)距离,等于Av的p-norm。红色实线的长度其实是Av的p-norm最大时的情况,这就定义了一种矩阵induced norm。同时,这个induced norm的值是SVD分解中Sigma矩阵的(1,1)元素,即矩阵A*A的最大的特征值的算术平方根。

    SVD分解与增益、与matrix induced norm

    是不是很神奇,一下子把SVD分解、增益、induced norm,特征值的概念都cover进来了,用matlab写短短几行代码就能去验证这样的结论是很有意思的,但如果用手算的话,我相信只有20%的学生和老师会走到这里吧。

    同样的,对于机器人运动学来说,如果给定一个机械臂各个关节或者自由度的参数,你来算执行端,比如抓取机构,焊枪头(torch?)的工作空间(reachable space),这也就是所谓的forward kinematics,假如你能徒手算对所有的矩阵运算坐标转换,但在画工作空间的时候仍然要费一番功夫对吗?找特征点、极值点之类的。但如果你用matlab,矩阵运算做完,工作空间自然就得到了,画一下而已。求解这样一个2DOP机械臂的工作空间上图中工作空间的解

    说的有点多了,意思就是matlab是研究机器人运动学、动力学必不可少的工具,如果你不会,那你一定会错过很多有意思的东西。

    方程建模之后,我们也要对方程进行求解与分析,在此我们需要一些实分析与复分析的基础。对于系统稳定性啊,频域分析啊,这些知识都会有所帮助。但是这块我个人认为不需要专门的数学书去学,在经典控制理论以及线性、非线性控制系统分析与设计,反馈系统等教材中都会有所涉及。

    上面说的内容其实是最重要的,但是针对不同的问题也有不同的一些数学方法。比如,我们有时候对于随机过程、估计与控制,需要概率论的相关知识。或者有时需要对连续的状态量、输入输出、时间进行离散化,从而进行数值运算方便计算机进行模拟,需要数值分析的知识,对于拉格朗日插值,数值积分等内容要有了解。

    举例来说,我们可以使用最优控制问题对机器人的路径规划进行建模。通过设置合适的cost fuction和约束对问题进行研究,或者通过一些方法,将optimal control的问题转化为较易求解的nonlinar programming。我们因此要对于最优与规划的思想有所了解。

    随着系统科学、控制科学、动力学的发展,越来越多的工具需要被掌握。高数线代微分方程matlab基本已经沦为了最基本的研究门槛。对于目前机器学习深度学习方法的性能优异性,我们对统计学习方法也要做一些了解了。其他的像变分法、分析力学、有限元等理论与计算方法,也可以在补习数学基础的同时,逐渐去吸收。

    最后又要祭出这一张图了,controls and dynamics博大精深

    展开全文
  • 机器人运动学_第七讲

    2021-03-22 16:29:47
    机器人运动学_第七讲.pdf 介绍了关于机器人运动学_第七讲的详细说明,提供机器人知识的技术资料的下载。
  • 第九章+机器人运动学

    2021-03-22 16:22:11
    第九章+机器人运动学.pdf 介绍了关于第九章+机器人运动学的详细说明,提供机器人知识的技术资料的下载。
  • 机器人运动学_第九讲

    2021-03-22 16:12:56
    机器人运动学_第九讲.pdf 介绍了关于机器人运动学_第九讲的详细说明,提供机器人知识的技术资料的下载。
  • 七自由度机器人运动学分析 七自由度机器人运动学分析 七自由度机器人运动学分析
  • 机器人运动学坐标变换
  • 机器人运动学参数辨识算法中最小二乘算法的矩阵推导的
  • 该专著围绕面向多关节机器人的在线机器人运动学标定技术展开,介绍在线机器人标定概论;机器人标定发展历程;运动学标定技术分类;重点介绍了在线机器人运动学标定技术,包括:运动学建模,基于多传感器的在线测量...
  • 机器人运动学课程2

    2018-10-08 14:28:32
    台湾科大教授的机器人运动学课程2,有在研究机器人方面的同学老师,应该可以用到,这是在大陆都找不到的哟!
  • 机器人技术视频讲座(64讲)-机器人技术12-机器人运动学zip,机器人技术视频讲座(64讲)-机器人技术12-机器人运动学
  • scara机器人运动学正逆解

    千次阅读 多人点赞 2020-03-14 14:59:02
    文章目录一、scara机器人运动学正解二、scara机器人运动学逆解1、正装scara机器人运动学逆解2、吊装scara机器人运动学逆解三、MATLAB代码 一、scara机器人运动学正解   末端BBB的xxx坐标为向量OA\bf{OA}OA与向量...

    一、scara机器人运动学正解

    scara机器人运动学正解
      末端BBxx坐标为向量OA\bf{OA}与向量AB\bf{AB}xx轴上投影之和,末端BByy坐标亦然:
    {x=L1cosθ1+L2cos(θ1+θ2)y=L1sinθ1+L2sin(θ1+θ2)(1) \left \{ \begin{array}{c} x=L_1cos\theta_1+L_2cos(\theta_1+\theta_2) \\ \tag 1 y=L_1sin\theta_1+L_2sin(\theta_1+\theta_2) \end{array}\right.
      第三轴为丝杆上下平移运动,设丝杆螺距ss,末端BBzz坐标:
    z=θ3s2π(2) z=\frac{\theta_3s}{2\pi} \tag 2
      末端BB的姿态角cc
    c=θ1+θ2+θ4(3) c=\theta_1+ \theta_2+ \theta_4 \tag 3
      综上,scara机器人的运动学正解为:
    {x=L1cosθ1+L2cos(θ1+θ2)y=L1sinθ1+L2sin(θ1+θ2)z=θ3s2πc=θ1+θ2+θ4(4) \begin{cases} x=L_1cos\theta_1+L_2cos(\theta_1+\theta_2) \\ y=L_1sin\theta_1+L_2sin(\theta_1+\theta_2) \\ z=\frac{\theta_3s}{2\pi} \\ c=\theta_1+ \theta_2+ \theta_4 \tag 4 \end{cases}

    二、scara机器人运动学逆解

    1、正装scara机器人运动学逆解

    scara机器人运动学逆解
      连接OBOB,过BBBCBC垂直于OAOACC,在ΔOAB\Delta OAB中,由余弦定理:
    cos(πθ2)=L12+L22(x2+y2)2L1L2(5)cos(\pi-\theta_2)=\frac{L_1^2+L_2^2-(x^2+y^2)}{2L_1L_2}\tag 5
      记c2=cosθ2c_2=cos\theta_2,式(5)可写成:
    c2=x2+y2L12L222L1L2(6)c_2=\frac{x^2+y^2-L_1^2-L_2^2}{2L_1L_2}\tag 6
      记s2=sinθ2s_2=sin\theta_2,则s2s_2有两个解:
    s2=±1c22(7)s_2=\pm\sqrt{1-c_2^2}\tag 7
      取正数解,机器人处于右手系(right handcoor);取负数解,机器人处于左手系(left handcoor);特殊地,若s2=0s_2=0,机器人处于奇异位置(singular position),此时θ2=kπ(kZ)\theta_2=k\pi(k\in{Z}),一般 θ2{2π,π,0,π,2π}\theta_2\in{\{-2\pi,-\pi,0,\pi,2\pi}\}
      至此,可求得θ2\theta_2
    θ2=atan2(s2,c2)(8)\theta_2=atan2(s_2,c_2)\tag 8
      如上图,易得:
    α=atan2(y,x)(9)\alpha=atan2(y,x)\tag 9
      在ΔOBC\Delta OBC中,记r=OBr=\|OB\|
    sinβ=BCOB=L2s2r(10)sin\beta=\frac{\|BC\|}{\|OB\|}=\frac{L_2s_2}{r}\tag {10}
    cosβ=OCOB=OA+ACOB=L1+L2c2r(11)cos\beta=\frac{\|OC\|}{\|OB\|}=\frac{\|OA\|+\|AC\|}{\|OB\|}=\frac{L_1+L_2c_2}{r}\tag {11}
      由于r>0r>0,由式(10)(10)和式(11)(11)得:
    β=atan2(L2s2,L1+L2c2)(12)\beta=atan2(L_2s_2,L_1+L_2c_2)\tag {12}
      至此,可求得θ1\theta_1
    θ1=αβ=atan2(y,x)atan2(L2s2,L1+L2c2)(13)\theta_1=\alpha-\beta=atan2(y,x)-atan2(L_2s_2,L_1+L_2c_2)\tag {13}
      由式(4)(4)容易求得θ3\theta_3θ4\theta_4
      综上,正装scara机器人的运动学逆解为:
    {θ1=atan2(y,x)atan2(L2s2,L1+L2c2)θ2=atan2(s2,c2)θ3=2πzsθ4=cθ1θ2(14) \begin{cases} \theta_1=atan2(y,x)-atan2(L_2s_2,L_1+L_2c_2) \\ \theta_2=atan2(s_2,c_2) \\ \theta_3=\frac{2\pi z}{s} \\ \theta_4=c-\theta_1-\theta_2 \tag {14} \end{cases}
      在求解θ2\theta_2时,完全可以根据式(6)(6)用反余弦函数acosacos求得,但这里采用了双变量反正切函数atan2atan2,至于原因,可以参见这篇博文:为什么机器人运动学逆解最好采用双变量反正切函数atan2而不用反正/余弦函数?
      由于atan2atan2的值域为[π,π][-\pi,\pi],可得关节角度θ1\theta_12π-2\pi2π2\pi之间(区间左端点2π-2\pi和区间右端点2π2\pi不一定能达到),θ2[π,π]\theta_2\in[-\pi,\pi]θ3\theta_3范围与丝杆螺距sszz轴的行程有关,θ4\theta_4一般范围在[2π,2π][-2\pi,2\pi]。对于正装scara机器人,为避免机构干涉,一般θ1[3π4,3π4]\theta_1\in[-\frac{3\pi}{4},\frac{3\pi}{4}]θ2[2π3,2π3]\theta_2\in[-\frac{2\pi}{3},\frac{2\pi}{3}]。 式(14)(14)的运动学逆解无法做到使机器人在工作空间360°无死角运动,需要将其推广,使得θ1[2π,2π]\theta_1\in[-2\pi,2\pi]θ2[2π,2π]\theta_2\in[-2\pi,2\pi],即吊装scara机器人关节1和关节2的角度范围。

    2、吊装scara机器人运动学逆解

      通过式(14)(14)计算得到θ1\theta_1θ2\theta_2后,增加关节1与关节2角度标志位flagJ1与flagJ2,利用以下的规则,可以将θ1\theta_1θ2\theta_2范围限定在[2π,2π][-2\pi,2\pi],实现吊装scara机器人360°无死角运动。
      将θ1\theta_1范围变换到[π,π][-\pi,\pi]:
      若θ1<π\theta_1<-\pi,则θ1=θ1+2π\theta_1=\theta_1+2\pi
      若θ1>π\theta_1>\pi,则θ1=θ12π\theta_1=\theta_1-2\pi

      对于θ1\theta_1,当flagJ1=1flagJ1=1时:
      若θ10\theta_1\geq0,则θ1=θ12π\theta_1=\theta_1-2\pi
      若θ1<0\theta_1<0,则θ1=θ1+2π\theta_1=\theta_1+2\pi

      对于θ2\theta_2,当flagJ2=1flagJ2=1时:
      若θ20\theta_2\geq0,则θ2=θ22π\theta_2=\theta_2-2\pi
      若θ2<0\theta_2<0θ2=θ2+2π\theta_2=\theta_2+2\pi

      θ4=cθ1θ2\theta_4=c-\theta_1-\theta_2

    3、几个值得思考的问题

    (1)、手系handcoor的确定

      当θ2(0,π)(2π,π)\theta_2\in(0,\pi) \bigcup(-2\pi,-\pi)时,机器人处于右手系,此时handcoor=1handcoor=1
      当θ2(π,0)(π,2π)\theta_2\in(-\pi,0) \bigcup(\pi,2\pi)时,机器人处于左手系,此时handcoor=0handcoor=0
      特别的,当θ2{2π,π,0,π,2π}\theta_2\in{\{-2\pi,-\pi,0,\pi,2\pi}\},机器人处于奇异位置。
      当机器人示教了一个点位,θ2\theta_2便确定了,因此机器人当前示教点的手系便确定。

    (2)、标志位flagJ1与flagJ2的确定

      当θ1[π,π]\theta_1\in[-\pi,\pi]时,flagJ1=0flagJ1=0;否则,flagJ1=1flagJ1=1
      当θ2[π,π]\theta_2\in[-\pi,\pi]时,flagJ2=0flagJ2=0;否则,flagJ2=1flagJ2=1
      当手系handcoor确定后,便可以根据手系选逆解。当标志位flagJ1与flagJ2确定后,便可以确定关节角度值是否需要±2π\pm 2\pi

    (3)、选取最短关节路径逆解

      在做笛卡尔空间插补(如直线、圆弧、样条插补等)时,如果θ1[2π,2π]\theta_1\in[-2\pi,2\pi]θ2[2π,2π]\theta_2\in[-2\pi,2\pi],求逆解过程可能会有±2π\pm 2\pi的跳变。这时需要通过对比上一次关节位置,选取最短关节路径的解,以达到插补过程关节位置平滑变化,此时不再需要标志位flagJ1与flagJ2。

    三、正逆解正确性验证

    1、单点验证

      (1)在[2π,2π][-2\pi, 2\pi]中随机生成4个关节角度(模拟示教过程)
      (2)计算标志位flagJ1和flagJ2,手系handcoor
      (3)计算正运动学
      (4)计算逆运动学
      (5)逆运动学结果与随机生成的关节角度作差,验证运动学正逆解的正确性

    2、直线验证

      (1)在[2π,2π][-2\pi,2\pi]中随机生成4个关节角度,计算手系handcoor(模拟示教过程)
      (2)运动学正解计算直线起点坐标(x,y,z,c)
      (3)在工作空间里随机获取直线的终点x,y坐标,z在[-50mm,50mm]里随机生成,
       c在[-30°, 30°]里随机生成,手系与起点的相同(模拟示教过程)
      (4)速度规划(采用归一化五次多项式规划,详见博文:归一化5次多项式速度规划)
      (5)直线插补
      (6)计算每个插补点的逆运动学
      (7)计算每个插补点的正运动学
      (8)画出直线插补结果,合成位置、速度、加速度,关节位置曲线,验证正逆解的正确性

    四、MATLAB代码

    %{
    Function: find_handcoor
    Description: 计算scara机器人当前手系
    Input: 关节2角度theta2(rad)
    Output: 机器人手系
    Author: Marc Pony(marc_pony@163.com)
    %}
    function handcoor = find_handcoor( theta2 )
    if (theta2 > 0.0 && theta2 < pi) || (theta2 > -2.0 * pi && theta2 < -pi)
        handcoor = 1;
    else
        handcoor = 0;
    end
    end
    
    %{
    Function: find_flagJ1
    Description: 计算scara机器人当前J1关节标志位
    Input: 关节1角度theta1(rad)
    Output: 机器人J1关节标志位flagJ1
    Author: Marc Pony(marc_pony@163.com)
    %}
    function flagJ1 = find_flagJ1( theta1 )
    if (theta1 >= -pi && theta1 <= pi)
        flagJ1 = 0;
    else
        flagJ1 = 1;
    end
    end
    
    %{
    Function: find_flagJ2
    Description: 计算scara机器人当前J2关节标志位
    Input: 关节1角度theta2(rad)
    Output: 机器人J2关节标志位flagJ2
    Author: Marc Pony(marc_pony@163.com)
    %}
    function flagJ2 = find_flagJ2( theta2 )
    if (theta2 >= -pi && theta2 <= pi)
        flagJ2 = 0;
    else
        flagJ2 = 1;
    end
    end
    
    %{
    Function: scara_forward_kinematics
    Description: scara机器人运动学正解
    Input: 大臂长L1(mm),小臂长L2(mm),丝杆螺距screw(mm),机器人关节位置jointPos(rad)
    Output: 机器人末端位置cartesianPos(mm或rad)
    Author: Marc Pony(marc_pony@163.com)
    %}
    function cartesianPos = scara_forward_kinematics(L1, L2, screw, jointPos)
    theta1 = jointPos(1);
    theta2 = jointPos(2);
    theta3 = jointPos(3);
    theta4 = jointPos(4);
    x = L1 * cos(theta1) + L2 * cos(theta1 + theta2);
    y = L1 * sin(theta1) + L2 * sin(theta1 + theta2);
    z = theta3 * screw / (2 * pi);
    c = theta1 + theta2 + theta4;
    cartesianPos = [x; y; z; c];
    end
    
    %{
    Function: scara_inverse_kinematics
    Description: scara机器人运动学逆解
    Input: 大臂长L1(mm),小臂长L2(mm),丝杆螺距screw(mm),机器人末端坐标cartesianPos(mm或rad)
           手系handcoor,标志位flagJ1与flagJ2
    Output: 机器人关节位置jointPos(rad)
    Author: Marc Pony(marc_pony@163.com)
    %}
    function jointPos = scara_inverse_kinematics(L1, L2, screw, cartesianPos, handcoor, flagJ1, flagJ2)
    x = cartesianPos(1);
    y = cartesianPos(2);
    z = cartesianPos(3);
    c = cartesianPos(4);
    jointPos = zeros(4, 1);
    
    calculateError = 1.0e-8;
    c2 = (x^2 + y^2 - L1^2 -L2^2) / (2.0 * L1 * L2);%若(x,y)在工作空间里,则c2必在[-1,1]里,但由于计算精度,c2的绝对值可能稍微大于1
    temp = 1.0 - c2^2;
    
    if temp < 0.0
        if temp > -calculateError
            temp = 0.0;
        else
            error('区域不可到达');
        end
    end
    if handcoor == 0    %left handcoor
        jointPos(2) = atan2(-sqrt(temp), c2);
    else                %right handcoor
        jointPos(2) = atan2(sqrt(temp), c2);
    end
    s2 = sin(jointPos(2));
    jointPos(1) = atan2(y, x) - atan2(L2 * s2, L1 + L2 * c2);
    jointPos(3) = 2.0 * pi * z / screw;
    
    if jointPos(1) <= -pi
        jointPos(1) = jointPos(1) + 2.0*pi;
    end
    if jointPos(1) >= pi
        jointPos(1) = jointPos(1) - 2.0*pi;
    end
    
    if flagJ1 == 1
        if jointPos(1) >= 0.0
            jointPos(1) = jointPos(1) - 2.0*pi;
        else
            jointPos(1) = jointPos(1) + 2.0*pi;
        end
    end
    
    if flagJ2 == 1
        if jointPos(2) >= 0.0
            jointPos(2) = jointPos(2) - 2.0*pi;
        else
            jointPos(2) = jointPos(2) + 2.0*pi;
        end
    end
    jointPos(4) = c - jointPos(1) - jointPos(2);
    end
    
    %{
    Function: scara_shortest_path_inverse_kinematics
    Description: scara机器人运动学逆解
    Input: 大臂长L1(mm),小臂长L2(mm),丝杆螺距screw(mm),机器人末端坐标cartesianPos(mm或rad)
           手系handcoor,上一次的关节位置lastJointPos(rad)
    Output: 机器人关节位置jointPos(rad)
    Author: Marc Pony(marc_pony@163.com)
    %}
    function jointPos = scara_shortest_path_inverse_kinematics(len1, len2, screw, cartesianPos, handcoor, lastJointPos)
    x = cartesianPos(1);
    y = cartesianPos(2);
    z = cartesianPos(3);
    c = cartesianPos(4);
    jointPos = zeros(4, 1);
    
    calculateError = 1.0e-8;
    c2 = (x^2 + y^2 - len1^2 -len2^2) / (2.0 * len1 * len2);%若(x,y)在工作空间里,则c2必在[-1,1]里,但由于计算精度,c2的绝对值可能稍微大于1
    temp = 1.0 - c2^2;
    
    if temp < 0.0
        if temp > -calculateError
            temp = 0.0;
        else
            error('区域不可到达');
        end
    end
    if handcoor == 0    %left handcoor
        jointPos(2) = atan2(-sqrt(temp), c2);
    else                %right handcoor
        jointPos(2) = atan2(sqrt(temp), c2);
    end
    s2 = sin(jointPos(2));
    jointPos(1) = atan2(y, x) - atan2(len2 * s2, len1 + len2 * c2);
    jointPos(3) = 2.0 * pi * z / screw;
    
    temp = zeros(3, 1);
    for i = 1 : 2
        temp(1) = abs((jointPos(i) + 2.0*pi) - lastJointPos(i));
        temp(2) = abs((jointPos(i) - 2.0*pi) - lastJointPos(i));
        temp(3) = abs(jointPos(i) - lastJointPos(i));
        if temp(1) < temp(2) && temp(1) < temp(3)
            jointPos(i) = jointPos(i) + 2.0*pi;
        elseif temp(2) < temp(1) && temp(2) < temp(3)
            jointPos(i) = jointPos(i) - 2.0*pi;
        else
            %do nothing
        end
    end
    jointPos(4) = c - jointPos(1) - jointPos(2);
    end
    
    clc;
    clear;
    close all;
    
    %% 输入参数
    len1 = 200.0; %mm
    len2 = 200.0; %mm
    screw = 20.0; %mm
    linearSpeed = 100; %mm/s
    linearAcc = 800;   %mm/s^2
    orientationSpeed = 200; %°/s
    orientationAcc = 600;   %°/s^2
    dt = 0.05; %s
    
    %% 单点验证:
    %(1)在[-2*pi, 2*pi]中随机生成4个关节角度(模拟示教过程)
    %(2)计算标志位flagJ1和flagJ2,手系handcoor
    %(3)计算正运动学
    %(4)计算逆运动学
    %(5)逆运动学结果与随机生成的关节角度作差,验证运动学正逆解的正确性
    testCount = 1000000;
    res = zeros(testCount, 4);
    k = 1;
    while k < testCount
        theta1 = -2.0*pi + 4.0*pi*rand;
        theta2 = -2.0*pi + 4.0*pi*rand;
        theta3 = -2.0*pi + 4.0*pi*rand;
        theta4 = -2.0*pi + 4.0*pi*rand;
        flagJ1 = find_flagJ1( theta1 );
        flagJ2 = find_flagJ2( theta2 );
        handcoor = find_handcoor( theta2 );
        jointPos = [theta1, theta2, theta3, theta4];
        cartesianPos = scara_forward_kinematics(len1, len2, screw, jointPos);
        
        jointPos2 = scara_inverse_kinematics(len1, len2, screw, cartesianPos, handcoor, flagJ1, flagJ2);
        res(k, :) = [theta1, theta2, theta3, theta4] - jointPos2';
        k = k + 1;
    end
    flag = all(abs(res - 0.0) < 1.0e-8) % flag = [1 1]则表示正逆解正确
    
    while 1
        %% 直线验证:
        %(1)在[-2*pi, 2*pi]中随机生成4个关节角度,计算手系handcoor(模拟示教过程)
        %(2)运动学正解计算直线起点坐标(x,y,z,c)
        %(3)在工作空间里随机获取直线的终点x,y坐标,z在[-50mm,50mm]里随机生成,
        %   c在[-30°, 30°]里随机生成,手系与起点的相同(模拟示教过程)
        %(4)速度规划
        %(5)直线插补
        %(6)计算每个插补点的逆运动学
        %(7)计算每个插补点的正运动学
        %(8)画出直线插补结果,合成位置、速度、加速度,关节位置曲线,验证正逆解的正确性
        theta1 = -2.0*pi + 4.0*pi*rand;
        theta2 = -2.0*pi + 4.0*pi*rand;
        theta3 = -2.0*pi + 4.0*pi*rand;
        theta4 = -2.0*pi + 4.0*pi*rand;
        handcoor = find_handcoor( theta2 );
        jointPos = [theta1, theta2, theta3, theta4];
        cartesianPos = scara_forward_kinematics(len1, len2, screw, jointPos);
        lastJointPos = jointPos;
        x1 = cartesianPos(1);
        y1 = cartesianPos(2);
        z1 = cartesianPos(3);
        c1 = cartesianPos(4)*180.0/pi;
        
        figure(1)
        set(gcf, 'color','w');
        a = 0 : 0.01 : 2*pi;
        plot((len1 + len2)*cos(a), (len1 + len2)*sin(a), 'r--')
        hold on
        plot(x1, y1, 'ko')
        xlabel('x/mm');
        ylabel('y/mm');
        axis equal tight
        [x2, y2] = ginput(1);
        z2 = -50 + 50*rand;
        c2 = -30 + 60*rand;
        
        L = sqrt((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2);
        C = abs(c2 - c1);
        T = max([1.875 * L / linearSpeed, 1.875 * C / orientationSpeed, ...
            sqrt(5.7735 * L / linearAcc), sqrt(5.7735 * C / orientationAcc)]);
        
        t = (0 : dt : T)';
        u = t / T;
        if abs(t(end) - T) > 1.0e-8
            t = [t; T];
            u = [u; 1];
        end
        u = t / T;
        s = 10*u.^3 - 15*u.^4 + 6*u.^5;
        ds = 30*u.^2 -60*u.^3 + 30*u.^4;
        dds = 60*u - 180*u.^2 + 120*u.^3;
        
        len = L * s;
        vel = (L / T) * ds;
        acc = (L / T^2) * dds;
        pos = zeros(length(t), 4);
        jointPos = zeros(length(t), 4);
        cartesianPos = zeros(length(t), 4);
        rate = [x2 - x1, y2 - y1, z2 - z1, c2 - c1] / L;
        for i = 1 : length(t)
            pos(i, :) = [x1, y1, z1, c1] + len(i) * rate;
            pos(i, 4) = pos(i, 4)*pi/180.0;
            jointPos(i, :) = scara_shortest_path_inverse_kinematics(len1, len2, screw, pos(i, :), handcoor, lastJointPos);
            cartesianPos(i, :) = scara_forward_kinematics(len1, len2, screw, jointPos(i, :));
            lastJointPos = jointPos(i, :);
        end
        plot3(cartesianPos(:, 1), cartesianPos(:, 2), cartesianPos(:, 3), 'ro');
        plot3([x1 x2], [y1 y2], [z1 z2], '+','markerfacecolor','k','markersize', 14)
        
        figure(2)
        set(gcf, 'color','w');
        subplot(3,1,1)
        plot(t, len)
        hold on
        plot([0 t(end)], [L L], 'r--')
        xlabel('t/s');
        ylabel('len/mm');
        subplot(3,1,2)
        plot(t, vel)
        hold on
        plot([0 t(end)], [linearSpeed linearSpeed], 'r--')
        xlabel('t/s');
        ylabel('vel/ mm/s');
        subplot(3,1,3)
        plot(t, acc)
        hold on
        plot([0 t(end)], [linearAcc linearAcc], 'r--')
        plot([0 t(end)], [-linearAcc -linearAcc], 'r--')
        xlabel('t/s');
        ylabel('acc/ mm/s^2');
        
        figure(3)
        set(gcf, 'color','w');
        subplot(3,1,1)
        plot(t, len*rate(4))
        hold on
        plot([0 t(end)], [c2-c1 c2-c1], 'r--')
        xlabel('t/s');
        ylabel('c/°');
        subplot(3,1,2)
        plot(t, vel*rate(4))
        hold on
        plot([0 t(end)], [orientationSpeed orientationSpeed], 'r--')
        plot([0 t(end)], [-orientationSpeed -orientationSpeed], 'r--')
        xlabel('t/s');
        ylabel('dc/ °/s');
        subplot(3,1,3)
        plot(t, acc*rate(4))
        hold on
        plot([0 t(end)], [orientationAcc orientationAcc], 'r--')
        plot([0 t(end)], [-orientationAcc -orientationAcc], 'r--')
        xlabel('t/s');
        ylabel('ddc/ °/s^2');
        
        figure(4)
        set(gcf, 'color','w');
        subplot(2,2,1)
        plot(t, jointPos(:,1)*180.0/pi)
        xlabel('t/s');
        ylabel('J1/°');
        subplot(2,2,2)
        plot(t, jointPos(:,2)*180.0/pi)
        xlabel('t/s');
        ylabel('J2/°');
        subplot(2,2,3)
        plot(t, jointPos(:,3)*180.0/pi)
        xlabel('t/s');
        ylabel('J3/°');
        subplot(2,2,4)
        plot(t, jointPos(:,4)*180.0/pi)
        xlabel('t/s');
        ylabel('J4/°');
        
        pause()
        close all
    end
    

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

    展开全文
  • 仿人机器人运动学和动力学分析
  • 六自由度机器人运动学正反解求解过程,十分详细,机器人运动学
  • 机器人运动学及动力学pdf版 ,王庭树著。
  • 被动冗余度空间机器人运动学综合pdf,被动冗余度空间机器人运动学综合
  • 这是台湾科大教授的机器人运动学课程1,有在研究机器人方面需要用到的机器人结构以及机器人运动方程解析的同学,可以用到,此番资料,大陆网络找不到哟!
  • PUMA560机器人运动学分析 1.PUMA560机器人的参数设计2.PUMA560机器人运动学分析1. PUMA560机器人的参数设计1.1 坐标系的建立PUMA560 机器人及其坐标系的建立示意图1.2 PUMA560机器人连杆参数连杆ii-1ai-1midim变量...
  • 绳索牵引助行机器人运动学,王克义,张立勋,考虑下肢步态康复训练需要,提出一种绳索牵引助行机器人,并对其进行运动学研究.基于人体下肢骨骼结构及康复训练目标,完成了助�
  • 机器人运动学习: 从模仿学习到强化学习

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,000
精华内容 1,200
关键字:

机器人运动学