精华内容
下载资源
问答
  • _六自由度机械臂关节模块化技术研究 本文主要研究内容包括以下几个方面: 1 .模块化关节的动力系统设计选取,传动方案的选取; 2 .模块化关节电机、减速器及失电保护装置的选型; 3 .模块化关节机械结构设计及...
  • 机械臂柔性关节的自抗扰轨迹跟踪,黄飞杰,贾庆轩,针对柔性关节高精度轨迹跟踪问题,在考虑关节柔性、非线性Lugre摩擦、电机及负载扰动的基础上,建立柔性关节动力学方程。将原柔性�
  • 轻型机械臂模块关节机械设计方案

    千次阅读 2018-03-30 09:01:58
    电机:直流无刷电机,参数为供电电压,额定电流,极对数,额定扭矩,额定转速,电机尺寸;谐波减速器:谐波减速器是关节...制动器:为防止意外断电时机械臂由于重力继续运动,需要在关节设计时加入制动将转轴抱死,...
    电机:直流无刷电机,参数为供电电压,额定电流,极对数,额定扭矩,额定转速,电机尺寸;
    谐波减速器:谐波减速器是关节动力传动中的关键部件,关节刚轮的大小基本上决定了整个关节的径向尺寸,要求谐波减速器的尺寸要尽可能小,同时保证较高的旋转精度;
    增量式编码器:基于电机端的增量式编码器来控制电机的速度环实现相对简单,可靠性高。
    制动器:为防止意外断电时机械臂由于重力继续运动,需要在关节设计时加入制动将转轴抱死,为能够快速可靠的制动,制动器的制动力矩要大于电机的最大输出力矩。
    绝对编码器:绝对式编码器用于测量关节输出轴转过的角度,绝对式编码器包含单圈绝对式和多圈绝对式。
    轴承:轴承对转轴和输出轴进行支承,轴承的安装和旋转精度将会直接影响关节的传动效率和转动精度,关节传动轴通过一对深沟球轴承进行支承,关节输出轴采用精度更高的交叉滚子轴承支承,减小整个关节质量并提高传动精度。
      模块化关节由电机、减速器、传感器、制动器、控制器和电器接口组成。为缩小关节体积,减小质量,关节采用扭矩大体积小的电机,选用安装方便质量较轻的谐波减速器作为传动机构。
      速度传感器(增量编码器)安装在转动轴一端,位置传感器(绝对编码器)安装在输出轴上,控制关节的速度与位置。核心部件都已标出,关节传动路线简单高效,安装拆卸方便,基本上所有的零件均以壳体作为定位,在关节后端留出足够的空间用来安装控制器和制动器。
      关节与关节之间通过径向螺钉孔进行连接。所有需要加工的零件均采用 7075 硬质铝合金进行加工,根据安装需要确定各零件的表面粗糙度和形位误差以及配合公差。在两类关节设计的过程中为减少特定传感器定制的成本,通过调节零件的尺寸,减少增量式编码器和绝对式编码器的种类。
      关节动力来自于转轴,转轴套入电机转子,转轴一端通过 61806 轴承支承在壳体上,另一端通过 61809 轴承支承在定定子套筒上。转轴末端连接谐波减速器的波发生器,将动力传递至谐波减速器。钢轮和定子套筒固定在壳体上,定子套筒末端开口设计用于电机信号线的穿过。
      动力经过谐波减速器减速增矩后由柔轮进行输出,柔轮与输出轴刚性连接通过交叉滚子轴承支承在壳体上,作为整个关节的动力输出。转轴大端连接转接头安装增量式编码器磁环和制动器衔铁,用于实现电机速度测量和失电制动。为保证谐波减速器的安装精度,相邻零件间均采用止口定位。关节采用增量式编码器测量转动轴关节速度,采用绝对式编码器测量输出轴关节角度。


    展开全文
  • 机械臂关节模型与控制

    千次阅读 2019-04-18 11:48:48
    机械臂关节模型与控制电机模型传动比与有效惯量结构柔性估计共振频率单关节控制 本文为机器人学导论1一书的学习笔记,具体内容请详阅书籍内容 电机模型 一般来说,电机电枢电流与输出转矩的关系可表示为: τm=...


    本文为机器人学导论1一书的学习笔记,具体内容请详阅书籍内容

    电机模型

    一般来说,电机电枢电流与输出转矩的关系可表示为:
    τm=kmia\tau_{m}=k_{m} i_{a}
    当电机转动时,则成为一个发电机,在电枢上产生一个电压。反电势常数,即给定转速是产生的电压为:
    v=keθ˙mv=k_{e} \dot{\theta}_{m}
    换向器实际上是一个开关,使电流通过变化的线圈绕组产生转矩,并产生一定的转矩波动。但这种影响可忽略不计(模型建立困难,误差补偿也很困难)
    直流力矩电机的电枢电路

    图1 直流力矩电机的电枢电路

    图1为电枢电路。主要构成部分为电源电压vav_{a},电枢绕组感抗lal_{a},电枢绕组电阻rar_{a}及产生的反电势vv。电路可用如下一阶微分方程描述:
    lai˙a+raia=vakeθ˙ml_{a} \dot i_{a}+r_{a} i_{a}=v_{a}-k_{e} \dot{\theta}_{m}
    一般用电机驱动器控制电机的转矩(而不是速度)。驱动电路通过检测电枢电流不断调节电源电压以使通过电枢的电流为期望电流iai_{a}。在电流驱动系统中,由电机感抗lal_{a}和电源电压的上限vav_{a}控制电枢电流变化的速率。实际上相当于在工作电流和输出转矩之间存在一个低通滤波器。
    为简化起见,假设电机的感抗可以忽略。这个假设合理的前提是闭环控制系统的固有频率远低于由于感抗引起的电流驱动器中隐含的低通滤波器的截止频率。这表明电机转矩可以直接控制。

    传动比与有效惯量

    通过齿轮减速器与惯性负载相连的直流力矩电机的力学模型

    图2 通过齿轮减速器与惯性负载相连的直流力矩电机的力学模型

    图2所示为通过齿轮减速器与惯性负载相连的直流力矩电机转子的力学模型。传动比(η)可提高驱动负载的力矩,降低负载的转速,由下式表示:
    τ=ητm\tau=\eta \tau_{m}
    θ˙=(1/η)θ˙m\dot{\theta}=(1 / \eta) \dot{\theta}_{m}
    按照转子力矩写出系统的力矩平衡方程如下:
    τm=Imθ¨m+bmθ˙m+(1/η)(Iθ¨+bθ˙)\tau_{m}=I_{m} \ddot{\theta}_{m}+b_{m} \dot{\theta}_{m}+(1 / \eta)(I \ddot{\theta}+b \dot{\theta})
    ImI_{m}II分别为电机转子惯量和负载惯量。bmb_{m}bb分别为电机转子轴承和负载轴承的粘滞摩擦系数。
    将其根据负载变量写为:
    τ=(I+η2Im)θ¨+(b+η2bm)θ˙\tau=\left(I+\eta^{2} I_{m}\right) \ddot{\theta}+\left(b+\eta^{2} b_{m}\right) \dot{\theta}
    I+η2ImI+\eta^{2} I_{m}被称为减速器输出端(连杆侧)的有效惯量b+η2bb+\eta^{2} b称为有效阻尼
    可见,在大传动比(η远大于1)情况下,电机转子惯量是有效组合惯量中的主要部分。此时可设有效惯量为一个常数。实际上,机构关节的惯量II是随着机构位形和负载变化的。然而在大传动比机器人中,这种变化的比例小于直接驱动操作臂。为确保机器人连杆的运动永远不为欠阻尼,有效惯量应为取值范围内的最大值,即ImaxI_{max}

    结构柔性

    建模过程中的另一个主要假设是减速器、轴、轴承以及被驱动连杆是绝对刚体。实际上这些元件刚度都是有限的,其柔性将增加系统的阶次。忽略柔性影响的理由是这些系统刚度极度,未建模共振的固有频率非常高,与已建模的二阶主极点的影响相比可忽略不计。
    在建模时未考虑系统的结构柔性,必须注意不能激发起这些共振模态。方法为如果最低结构共振频率为ω res \omega_{\text { res }},则限定闭环固有频率为:
    ωn<12ωres\omega_{n}<\frac{1}{2} \omega_{\mathrm{res}}
    典型工业机器人的结构共振频率为5Hz到25Hz。

    估计共振频率

    在结构柔性能够识别的情况下,如果能够给出柔性结构件有效质量或有效惯量的描述,就可以进行振动的近似分析。简单质量—弹簧系统近似得出系统的固有频率为:
    ωn=k/m\omega_{n}=\sqrt{k / m}
    k为柔性结构件的刚度,m为振动系统的等效质量。
    为粗略估计梁和轴的最低共振频率,可采用集中质量模型。梁和轴的末端刚度公式是已知的。集中质量模型提供了估算共振频率所需的有效质量或有效惯量。
    用于估算横向共振和扭转共振的梁的集中质量模型

    图3 用于估算横向共振和扭转共振的梁的集中质量模型

    如图3所示,这个分析建议用一个位于梁末端的质量为0.23m0.23m的质点代替质量为m的梁,由轴末端的集中惯量0.33I0.33I代替分布惯量II

    单关节控制

    概括来说,对于单关节建模与控制做了一下三个主要假设:

    1. 电机的感抗lal_{a}可以忽略。
    2. 大传动比情况下,有效惯量视为一个常数,即Imax+η2ImI_{\mathrm{max}}+\eta^{2} I_{m}
    3. 结构柔性可以忽略。最低结构共振频率ωres\omega_{res}用于设定伺服增益的情况除外。

    应用这些假设,可用下面方法给出的分解运动对一个单关节操作臂进行控制。
    采用控制律分解方法的闭环轨迹跟踪控制系统

    图4 采用控制律分解方法的闭环轨迹跟踪控制系统

    图4 为采用控制律分解方法的闭环轨迹跟踪控制系统。把控制器分为基于模型的控制部分和伺服控制部分。系统的参数仅出现在基于模型的控制部分,而与伺服控制部分完全独立。通过基于模型的控制部分将系统简化为一个单位质量(即没有摩擦和刚度)。控制律的第二部分利用反馈来改变系统的特性。
    基于模型的控制部分表达式为:
    f=αf+βf=\alpha f^{\prime}+\beta
    式中α和β是函数或常数。将ff^{\prime}作为新的系统输入,通过选择α和β将系统简化为单位质量。根据上述直流力矩电机转子的力学模型τ=(I+η2Im)θ¨+(b+η2bm)θ˙\tau=\left(I+\eta^{2} I_{m}\right) \ddot{\theta}+\left(b+\eta^{2} b_{m}\right) \dot{\theta},可选定:
    α=Imax+η2Im\alpha=I_{\max }+\eta^{2} I_{m}
    β=(b+η2bm)θ˙\beta=\left(b+\eta^{2} b_{m}\right) \dot{\theta}
    此时τ=f=θ¨d+kve˙+kpe\tau^{\prime}=f^{\prime}=\ddot{\theta}_{d}+k_{v} \dot{e}+k_{p} e。系统的闭环动力学方程为:
    e¨+kve˙+kpe=τdist\ddot{e}+k_{v} \dot{e}+k_{p} e=\tau_{\mathrm{dist}}
    τdist\tau_{\mathrm{dist}}为连杆有效惯量对关节电机施加的恒定干扰。
    在这种方法中,控制增益的设定非常简单,而且与系统参数独立。设定系统处于临界阻尼状态的增益为:
    kp=ωn2=14ωres2k_{p}=\omega_{n}^{2}=\frac{1}{4} \omega_{\mathrm{res}}^{2}
    kv=2kp=ωresk_{v}=2 \sqrt{k_{p}}=\omega_{\mathrm{res}}
    为消除稳态误差,有时可附加一个积分项。对于这种控制律,系统变成了一个三阶系统。通常kik_{i}非常小,使得这个三阶系统没有积分项而“近似于”一个二阶系统。


    1. John J. Craig. Introduction to Robotics: Mechanics and Control[M]// Introduction to robotics :: Mechanics and control. 1955. ↩︎

    展开全文
  • 它考虑了直流电机的电气方程(电压定律)和机械方程(旋转第二定律)。 通过消除方程中的电流来组合方程。 然后以标准 ODE 形式重写它们。 我还附上了课程笔记。 仿真是在 Simulink 中使用任意 PID 控制器增益...
  • 这里机械臂上所用的步进电机是常用的42步进电机,每个电机控制一个关节,步进角度1.8度,全步模式下,200个脉冲走360度。这里我们在步进电机上面加了减速器,减速比是1:10,即转子真正走一圈是要2000个脉冲,每个...

    参考:

    图形学入门

    https://www.zhihu.com/question/20330720

    https://zhuanlan.zhihu.com/p/30553006

    https://www.cnblogs.com/soroman/archive/2006/07/27/509602.html

    https://blog.csdn.net/tlvc/article/details/4913397

    https://blog.csdn.net/u010141928/article/details/79514514

     

    往期回顾:

    第一篇:grbl控制3轴机械臂 原理 实现 (一) 之2D机械臂模拟及实现

    第二篇:grbl控制3轴机械臂 原理 实现 (二) 之3D机械臂模拟及实现

     

     

    步进电机

    这里机械臂上所用的步进电机是常用的42步进电机,每个电机控制一个关节,步进角度1.8度,全步模式下,200个脉冲走360度。这里我们在步进电机上面加了减速器,减速比是1:10,即转子真正走一圈是要2000个脉冲,每个脉冲是走0.18度。

    前面我们用运动学逆解求出了机械臂的三个角度,那么我们让机械臂对应的电机转动所求得的角度就能得到机械臂的最终姿态了。由于是转动固定角度,要最终姿态保持和预料的一样的话,那么机械臂的初始位置就很重要,要确保机械臂的初始位置已知与准确。比如,大臂的初始位置处于30度,最终姿态是要跑到60度的位置,即步进电机要增加30度,如果初始位置不是处于30度的位置,那么增加30度后最终位置就不会是60度。所以我们在机械臂上电初始化时,就要有个变量保存三个角度的值,以及一个初始位置的校准,确保实际机械臂的角度和变量中的角度值是对应与准确的。

    知道上面的知识后,那么要控制机械臂就简单了。说白了就是控制X,Y,Z这3个电机走相应的角度。这里与原版的笛卡尔坐标系控制电机就有点不一样了,在笛卡尔坐标系下,每个电机都对应一个轴,要走到对应的坐标点,分别给对应轴对应的值就行了。比如坐标系的目标点在(0,0,10),那么只要Z轴电机移动10就行了。

    而机械臂要走空间坐标系的话就不是这种对应关系,更具逆解的值,要对应的操作3个电机移动不同的角度。所以我们这里要做一些相应的转换。将距离、角度、步数(步进电机要走的步数,即脉冲数)对应起来。

    公式: 此轴总共要走的脉冲数 =  角度 * 多少脉冲每1度

    这里角度我们已经知道了,而多少脉冲每1度(根据电机驱动设置的细分值,和对应电机的步进角度,以及减速器决定)举例:如果电机的细分为全步,就是1细分,步进角度为1.8度,减速器为1:10。

    那么  一个脉冲所走度数 = 细分*步进角度*减速比     

    多少脉冲每1度  =  (360度 / (细分*步进角度*减速比)) / 360度 

    代入即得 \frac{(\frac{360 }{ 1*1.8*\frac{1}{10}})}{360}  得出值是5.5555555555....

    由此得出每个轴要走的脉冲数,控制电机走对应的脉冲就行了。

    关于所走的距离,可以通过运动学正解求出起始点与终点的位置来得到。

    如果我们要让机械臂走出直线,即在空间坐标系中任意两点以直线轨迹移动,这里就要涉及到插补了。

    插补

    由于我们用的是步进电机,运动的时候是一步一步的,并不是平滑的,这里假设在一个平面上面,一个x步进电机,一个y步进电机。那么放大它们所走的轨迹就会是阶梯状的。而它们也只能沿着网格运动。相当于有了一个最小的分辨率,这个分辨率就是一步。如下图所示,如果x,y电机同时走就能走出45度的斜线。

    这里所用的算法和图形学有点关系,我们的显示屏都是像素点,那么如何在这些像素网格上画出直线呢?

    图形学的画线算法如何运用到,步进电机上呢?我们可以把一像素看成是步进的一步,这样像素每移动一格,对应步进电机就移动一步。

    下面一一介绍

     

    直线插补

    数值微分DDA(Digital Differential Analyzer)算法

    直线方程:y = kx + b

    递增坐标x来求出y的值,假设知道了(x_i,y_i)

    y_i = k * x_i +b

    那么({x_{i+1}} , {y_{i+1}})为:

    {y_{i+1}} = k * x_{i+1} +b

    y_{i+1} = k * (x_i + 1) +b

    y_{i+1} = k * x_i + b + k

    联合上面的y_i = k * x_i +b

    y_{i+1} = y_i + k

    也就是说每次纵坐标都是在前一个纵坐标的基础上加上斜率k的值得到的,这样运算中少了乘法,运算速度就加快了。

    这里用processing编程演示一下

    void settings()
    {
      //设置显示屏幕窗口大小
      size(150,150);
    }
    
    //DDA画线算法
    void DDADrawLine(int x0,int y0,int x1,int y1)
    {
    //算出斜率k值
    float k = (y1-y0)*1.0/(x1-x0);
    //起始点为y0
    float y = y0;
    
    //循环范围x0-x1,每次递增k值
    for(int x = x0 ; x <= x1 ; ++ x) {
        //画下一个像素点,y值四舍五入
        setpixelsCT(x,(int)round(y));
        //y值递增k
        y += k;
      }
    }
    
    
    //由于processing的屏幕坐标是左上角为原点,x向右递增,y轴向下递增
    //为了适配数学上的坐标轴,做了y轴调转
    void setpixelsCT(int x,int y)
    {
      loadPixels();
      pixels[((height-1)-y)*xx+x] = color(0);
      updatePixels();
    }
    
    
    
    void draw()
    {
      //背景显示白色
      background(255);
    
      //鼠标映射,为了适配数学上的坐标轴,做了y轴调转
      DDADrawLine(0,0,mouseX,(int)map(mouseY,height-1,0,0,height-1));
      
      
      
    }

    程序演示:

     

     

    Bresenham算法

    在效率上,虽然DDA消除了浮点的乘法运算,但是存在浮点加法和取整运算。1965年Bresenham提出了更好的直线生成算法,成为了时至今日图形学领域使用最广泛的直线生成算法。该算法采用增量计算,借助一个误差量的符号确定下一个像素点的位置,该算法中不存在浮点数,只有整数运算,大大提高了运行效率。

    Bresenham的思想是将像素中心构造成虚拟网格线,下图中每个红点即是一个像素。计算所画线条与垂直网格线的交点,算出与之相隔最近的像素坐标。

             

    和DDA算法一样,每次x加1的时候纵方向就加了k,保存一个d值,如果d小于等于0.5,那么就画在下面的点,如果d大于0.5就画在上面的点。每次检查d是否在[0,1)范围内,如果不在此范围d减1。d值减一和y的像素坐标会上移一个单位,此时再次从这个新位置计算d值(如上面第二幅图)。

    按这思想,无优化代码如下

    void BresenhamDrawLine(int x0,int y0,int x1,int y1)
    {
    
      //根据直线方程算出k值
      float k = (y1-y0)*1.0/(x1-x0);
    
      //初始化y值坐标值
      int y = y0;
    
      //初始化d值  
      float d = 0;
    
    
      //循环绘制像素点 从x0到x1
      for(int x = x0 ; x <= x1 ; ++ x) 
      {
        //如果d值大于0.5像素,表明上面的像素离直线比较近,采用直线上面的点,否则采用下面的点
        if(d > 0.5)
        {
          //绘制一个像素点,采用直线上面的点,将y值加1
          setpixelsCT(x,y+1);
        }
        else
        {
          //绘制一个像素点
          setpixelsCT(x,y);
        }
        
        //如果d值大于1个像素,将标志归零重置,d减一,y值加一像素
        if(d >= 1.0)
        {
          d -= 1.0;
          y++;
        }
    
        //当x每移动一像素,累加k值到d
        d += k;
        
      }
      
    }
    
    

    接下来优化下,去掉除法和小数运算

     消除除法和小数,把d值偏移到0就只需要判断正负号,两边同时乘以2和dx(乘以2是为了去掉0.5小数,乘以dx是为了k值消除除法)

    我们已知直线斜率是 k = \frac{\Delta y}{\Delta x}

    而d的值是  是由d = d + k,由k值累加得到的,d值最终要与0.5来比较,得出是大于还是小于0.5,由此得出取直线上面的像素还是下面的像素。

    所以我们先去掉除法,这里直线的起点(x,y),和终点(x_i,y_i)都是整数。

    我们直接在k值上乘以一个\Delta x,消除k值的除数 得到  \Delta x * k = \Delta x * \frac{\Delta y}{\Delta x}  

    又由于要消掉0.5这个小数,所以要乘以2。

    那么k值现在为

    2 * \Delta x * k =2 * \Delta x * \frac{\Delta y}{\Delta x}

    k =2 * \Delta y

    与d值比较的0.5  和 1.0在乘以2 * \Delta x后得到   \Delta x  和  2 * \Delta x

    那么最终代码为:

    void LiteBresenhamDrawLine(int x0,int y0,int x1,int y1)
    {
    
      //根据直线方程算出k值
      int dx = abs(x0-x1);
      int dy = abs(y0-y1);
    
      //初始化y值坐标值
      int y = y0;
    
    
    
      //消除除法和小数,由于只需要判断正负号,两边同时乘以2和dx(乘以2是为了去掉0.5小数,乘以dx是为了k值消除除法)所以得出
      //k = dy/dx;
      //2*dx*k = 2*dx*dy/dx
      int k = 2*dy;
    
      //初始化d值,由于d值是k的累加,这里也要乘以2dx
      //d = 0
      //d = d - 0.5     
      //这样初始值就是-0.5,一旦d累加增k值大于0,等同于d>0.5,只是整体偏移了-0.5,这样就能看符号判断是否大于或小于0.5了
      //接下来去掉小数,乘以2dx,得到初始值,实际偏移了dx
      int d = -dx;
    
    
      //循环绘制像素点 从x0到x1
      for(int x = x0 ; x <= x1 ; ++ x) 
      {
        //如果d值大于0.5像素,表明上面的像素离直线比较近,采用直线上面的点,否则采用下面的点
        //由于都乘以了2dx,所以这里和它比较的0.5也要乘以2dx,成了2*dx*0.5=dx,实际偏移了dx所以为0
        if(d > 0)
        {
          //绘制一个像素点,采用直线上面的点,将y值加1
          setpixelsCT(x,y+1);
        }
        else
        {
          //绘制一个像素点
          setpixelsCT(x,y);
        }
        
        //如果d值大于1个像素,将标志归零重置,d减一,y值加一像素
        //由于都乘以了2dx,所以这里和它比较的1.0也要乘以2dx,成了2*dx*1.0=2dx,实际偏移了dx所以为dx
        if(d >= dx)
        {
          d -= 2*dx;
          y++;
        }
    
        //当x每移动一像素,累加k值到d
        d += k;
        
      }
      
    }

    以上示例代码都是基于k值范围在(0,1],要适用所有象限的话,只要在第一象限求出坐标后对应改变x,y值的符号后再绘制即可实现。

     

     

    圆弧插补

    grbl中的圆弧插补是采用直线逼近法,即采用弦高(ED)很小的弦线(直线AB)替代圆弧(圆弧AB)。

    OD=R-ED (R半径,ED弦高,已知值)

    AB = 2 * \sqrt{(R^2 - OD^2)}

    认为直线AB的长度等于圆弧AB的弧长,由弧长公式:弧长=弧长对应的圆心角*半径

    可以计算出圆心角(OA与OB的夹角),A点坐标为已知,所以可以计算出B点坐标,然后使用直线插补AB线段,使用AB线段代替AB弧。

     

     

    圆插补

    中点画圆法,考虑圆心在原点,半径为R的圆在第一象限内的八分之一圆弧,从点(0, R)到点(R/ , R/ )顺时针方向确定这段圆弧。假定某点Pi(xi, yi)已经是该圆弧上最接近实际圆弧的点,那么Pi的下一个点只可能是正右方的P1或右下方的P2两者之一

    构造判别函数:

    F(x, y)= x2 + y2 – R2

    当F(x, y)= 0,表示点在圆上,当F(x, y)> 0,表示点在圆外,当F(x, y)< 0,表示点在圆内。如果M是P1和P2的中点,则M的坐标是(xi + 1, yi – 0.5),当F(xi + 1, yi – 0.5)< 0时,M点在圆内,说明P1点离实际圆弧更近,应该取P1作为圆的下一个点。同理分析,当F(xi + 1, yi – 0.5)> 0时,P2离实际圆弧更近,应取P2作为下一个点。当F(xi + 1, yi – 0.5)= 0时,P1和P2都可以作为圆的下一个点,算法约定取P2作为下一个点。

    现在将M点坐标(xi + 1, yi – 0.5)带入判别函数F(x, y),得到判别式d:

    d = F(xi + 1, yi – 0.5)= (xi + 1)2 + (yi – 0.5)2 – R2

    若d < 0,则取P1为下一个点,此时P1的下一个点的判别式为:

    d’ = F(xi + 2, yi – 0.5)= (xi + 2)2 + (yi – 0.5)2 – R2

    展开后将d带入可得到判别式的递推关系:

    d’ = d + 2xi + 3

    若d > 0,则取P2为下一个点,此时P2的下一个点的判别式为:

    d’ = F(xi + 2, yi – 1.5)= (xi + 2)2 + (yi – 1.5)2 – R2

    展开后将d带入可得到判别式的递推关系:

    d’ = d + 2(xi - yi) + 5

    特别的,在第一个象限的第一个点(0, R)时,可以推倒出判别式d的初始值d0:

    d0 = F(1, R – 0.5) = 1 – (R – 0.5)2 – R2 = 1.25 - R

    根据上面的分析,可以写出中点画圆法的算法。考虑到圆心不在原点的情况,需要对计算出来的坐标进行了平移,下面就是通用的中点画圆法的processing源代码:

    int xx,yy;
    
    void settings()
    {
      xx=250;
      yy=250;
      size(xx,yy);
    }
    
    void MP_Circle(int xc , int yc , int r)
     {
    	int x, y;
    	double d;
    	x = 0;
    	 y = r;
    	d = 1.25 - r;
    	CirclePlot(xc , yc , x , y);
    	while(x < y)
    	{
    		if(d < 0)
    		{
    			d = d + 2 * x + 3;
    		}
    		else
    		{
    			d = d + 2 * ( x - y ) + 5;
    			y--;
    		}
    		x++;
    		CirclePlot(xc , yc , x , y);
    	}
    }
    
    //coordnate transform 
    void setpixelsCT(int x,int y)
    {
      loadPixels();
      pixels[((height-1)-y)*xx+x] = color(0);
      updatePixels();
    }
    
    //整个圆绘制
    void CirclePlot(int X,int Y,int P,int Q)
    {
      setpixelsCT(X + P, Y + Q);
      setpixelsCT(X - P, Y + Q);
      setpixelsCT(X + P, Y - Q);
      setpixelsCT(X - P, Y - Q);
      setpixelsCT(X + Q, Y + P);
      setpixelsCT(X - Q, Y + P);
      setpixelsCT(X + Q, Y - P);
      setpixelsCT(X - Q, Y - P);
    }
    
    
    void draw()
    {
      background(255);
      
      //画圆
      MP_Circle(125,125,50);
    }

     

    改进的中点画圆法-Bresenham算法

            中点画圆法中,计算判别式d使用了浮点运算,影响了圆的生成效率。如果能将判别式规约到整数运算,则可以简化计算,提高效率。于是人们针对中点画圆法进行了多种改进,其中一种方式是将d的初始值由1.25 – R改成1 – R,考虑到圆的半径R总是大于2,因此这个修改不会响d的初始值的符号,同时可以避免浮点运算。还有一种方法是将d的计算放大两倍,同时将初始值改成3 – 2R,这样避免了浮点运算,乘二运算也可以用移位快速代替,采用3 – 2R为初始值的改进算法,又称为Bresenham算法:

    int xx,yy;
    
    void settings()
    {
      xx=250;
      yy=250;
      size(xx,yy);
    }
    
    void Bresenham_Circle(int xc , int yc , int r)
    {
         int x, y, d;
    
         x = 0;
         y = r;
         
         d = 3 - 2 * r;
         
         CirclePlot(xc , yc , x , y);
         while(x < y)
         {
             if(d < 0)
             {
                 d = d + 4 * x + 6;
             }
            else
           {
               d = d + 4 * ( x - y ) + 10;
                y--;
             }
            x++;
            CirclePlot(xc , yc , x , y);
       }
    
    }
    
    //coordnate transform 
    void setpixelsCT(int x,int y)
    {
      loadPixels();
      pixels[((height-1)-y)*xx+x] = color(0);
      updatePixels();
    }
    
    //整个圆绘制
    void CirclePlot(int X,int Y,int P,int Q)
    {
      setpixelsCT(X + P, Y + Q);
      setpixelsCT(X - P, Y + Q);
      setpixelsCT(X + P, Y - Q);
      setpixelsCT(X - P, Y - Q);
      setpixelsCT(X + Q, Y + P);
      setpixelsCT(X - Q, Y + P);
      setpixelsCT(X + Q, Y - P);
      setpixelsCT(X - Q, Y - P);
    }
    
    
    void draw()
    {
      background(255);
      
      //画圆
      Bresenham_Circle(125,125,50);
    }

     绘制效果:

    通过以上的基础知识了解,终于可以进入正题了,下面讲讲GRBL源码如何修改得能控制机械臂

     

    第四篇:grbl控制3轴机械臂 原理 实现 (四) 之GRBL源码修改驱动三轴机械臂

     

     

    展开全文
  • 针对面贴式永磁同步电机驱动的柔性关节机械臂动力学模型具有非线性、不确定性和未知外部扰动等特点,提出一种自适应动态面控制方法来实现其关节轨迹跟踪控制. 控制律由动态面技术得到, 降低了反推控制器的复杂性. ...
  • 由于arbotix是针对舵机的,我们要想控制伺服电机,要将ROS里机械臂关节信息(角度、角速度、加速度、力等)发给下位机,首先就是要获取关节信息。  关于让机械臂动起来,这里参考了一些大神的博客,在这里表示...

        在完成用arbotix测试机械臂后,我们想控制真实的机械臂伺服电机。由于arbotix是针对舵机的,我们要想控制伺服电机,要将ROS里机械臂的关节信息(角度、角速度、加速度、力等)发给下位机,首先就是要获取关节信息。

        关于让机械臂动起来,这里参考了一些大神的博客,在这里表示感谢

    让模型动起来:     http://blog.csdn.net/yaked/article/details/51412781

    moveit驱动:       http://blog.csdn.net/xu1129005165/article/details/70037698

    如何在ROS下编写自己的节点来订阅话题(C++)  http://blog.csdn.net/u013453604/article/details/49102957

    一、查看joint_states话题内容

    在我的上一篇博客“做机械臂导航遇到的问题3:如何用arbotix接口控制机械臂”的基础上,

    1、我们用  $ rostopic list   查看话题列表


    2、查看joint_states话题的详细信息      $ rostopic echo /joint_states

    可以看到joint_states话题里包含我们需要的关节信息


    二、编写节点,订阅joint_states话题

    此部分参考http://wiki.ros.org/cn/ROS/Tutorials中的教程中3、

    1、建立一个包

    $ cd ~/catkin_ws/src

    $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

    2、编写订阅器节点(参考http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29)
    在 beginner_tutorials目录下创建 src/listener.cpp 文件,并粘贴如下代码:

    (我们对wiki中代码作了一些修改,添加了#include "sensor_msgs/JointState.h",定义了回调函数jointstatesCallback,监听/joint_states话题发布的消息,修改话题发布的消息类型:const sensor_msgs::JointStateConstPtr& msg,获取position、velocity中的数据,并显示出来

    #include "ros/ros.h"
    #include "std_msgs/String.h"
    #include "sensor_msgs/JointState.h"
    /**
     * This tutorial demonstrates simple receipt of messages over the ROS system.
     */
    
    void jointstatesCallback(const sensor_msgs::JointStateConstPtr& msg)
    {
      float pos[3],vel[3];
     // pos=msg.position;
      pos[0]=msg->position[0];
      pos[1]=msg->position[1];
      pos[2]=msg->position[2];
      vel[0]=msg->velocity[0];
      vel[1]=msg->velocity[1];
      vel[2]=msg->velocity[2];
      ROS_INFO("I heard: [%f] [%f] [%f] [%f] [%f] [%f]",pos[0],pos[1],pos[2],vel[0],vel[1],vel[2]);
     
    }
    
    int main(int argc, char **argv)
    {
     
      ros::init(argc, argv, "listener");
    
    
      ros::NodeHandle n;
    
    
      ros::Subscriber sub = n.subscribe("/joint_states", 1000, jointstatesCallback);
    
    
      ros::spin();
    
    
      return 0;
    }
    


    3、编写CMakeList.txt文件

    文件内容如下:

    cmake_minimum_required(VERSION 2.8.3)
    project(beginner_tutorials)
    
    ## Find catkin and any catkin packages
    find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
    
    ## Declare ROS messages and services
    #add_message_files(FILES Num.msg)
    #add_service_files(FILES AddTwoInts.srv)
    
    ## Generate added messages and services
    generate_messages(DEPENDENCIES std_msgs)
    
    ## Declare a catkin package
    catkin_package()
    
    ## Build talker and listener
    include_directories(include ${catkin_INCLUDE_DIRS} include )
    
    add_executable(talker src/talker.cpp)
    target_link_libraries(talker ${catkin_LIBRARIES})
    add_dependencies(talker beginner_tutorials_generate_messages_cpp)
    
    add_executable(listener src/listener.cpp src/uart.c)
    target_link_libraries(listener ${catkin_LIBRARIES})
    add_dependencies(listener beginner_tutorials_generate_messages_cpp)


    4、编译,在工作空间目录下 $ catkin_make


    编译成功后,运行节点rosrun beginner_tutorials listenner,可以发现已经接收到position和velocity的数据了


    展开全文
  • 让我们看一下基于反向运动学的控制逻辑图:在给出机械臂的end-effector的pose后,反运动学模块计算出各个关节所需要的角度,然后通过电机产生力矩(torque)去执行。在此期间,通过反馈(feedback)去消除一些控制误差。...
  • 机器臂的设计对机器人的操作性能具有决定性的影响,运用质量平衡原理,利用关节驱动电机自身的质量对自行研制的YJP-1型机器人的操作臂进行了优化设计,实验结果表明,该设计方法对减小机械臂动力系统的耦合惯量影响...
  • 1Minimally Actuated Robot Arm工业机械臂的工作空间很大,适合复杂的操作,但是串联的结构限制了它的末端负载和鲁棒性,如果其中一个关节电机出现问题那么整个机械臂都会受到影响。为了解决这一问
  • 机械臂的结构方案,并通过各连杆的质量,采用静力学估算各个关节的力矩, 从而选择与之匹配的电机。采用了一种基于 CAN 总线分布式的控制方案。将工 控机和关节控制器挂在 CAN 总线上。工控机主要功能是对关节...
  • 针对机械臂系统惯性参数及运动学参数不能准确测量进而影响轨迹跟踪性能的问题,提出一种任务空间自适应轨迹跟踪控制方法,通过定义关节角速度参考误差,并将任务空间的轨迹跟踪误差及运动学参数误差反馈给控制器,以改善...
  • 试着推导并实现四自由机械臂的运动方程,在此处使用拉格朗日法进行。系统机构图如下: 注:第一个关节是圆柱转盘,其他关节绕枢轴点转动。其中Tm为关节驱动力矩,由电机提供;b*theta_d为粘性阻尼扭矩。 1、系统...
  • _基于迭代学习算法的六自由度机械臂运动学求解分析 本文提出拥有记忆单元的迭代学习算法,该算法以目标位姿为驱动,通过神 经网络反向传播求目标位姿与当前位姿之差的平方和对当前关节角的导数,并 通过梯度...
  • 1、我看了iiwa以及几个国产的机械臂的参数,对其中的关节最大力矩不太理解,不知道这个关节最大力矩是电机的额定转矩乘以减速比再乘以效率的值,还是电机的峰值失速转矩乘以减速比再乘以效率的值&...
  • 关于机械臂的两个关节角度传感器(肩关节和肘关节)的连接和调试的方案在下面的链接中给出了详细的介绍。 对机械臂的肩关节与肘关节编码器连接与设置   ▌02 上下运动 1.执行器:步进电机 使用一个6PIN线...
  • 在 两轴机械臂+机械爪整体控制板设计与机械爪控制调试 的基础上对于机械臂关节进行了 双关节机械臂+机械爪运动控制 ,其中存在的主要问题还是肩关节运动不平稳的情况。 ▲ 机械臂肩部运动   01建立肩部模型 ...
  • 在基于STC8H1K28双轴机械臂驱动模块 给出了对肩关节、肘关节上的步进电机、角度传感器读取和控制模块的设计。本文下面就是利用该模块对机械臂进行运动控制。 ▲ 双轴机械臂的外观   01联线配线 1.步进电机和...
  • 毕设六自由度机械臂参考,做毕设的同学当个参考吧,我也是参考的这个在做毕设。也是搜了半天,找到这么个同步带的,此资源非CHX-3那个机械臂。 附上他的视频讲解,链接:...
  • 构建了由双目视觉摄像头、嵌入式中控、六自由度机械臂、视觉处理计算机和监控计算机等组成的乒乓球机器人系统,灵巧臂采用关节模块化设计方法,共有6个自由度,集成有关节位置、电机位置、关节力矩、驱动电流及温度...
  • 三自由度的机械臂由两个电机驱动:基关节由单个电机驱动;中关节和末关节由一个单输入双输出行星轮组完成动力分配。在机械臂捕获运动目标过程中,碰撞产生的部分冲击能量通过欠驱动行星轮组传递到末关节,转化为关节...
  • 介绍了巡检机器人的机械结构,对越障姿态进行了规划,并对自撑起和越障过程中的摆臂机构进行了动力学建模,得到了摆臂电机输出转矩与机身倾角和摆臂转角的关系,为摆臂电机选型提供了理论依据,进一步提高了巡检机器人的...
  • 考虑驱动串联机械臂的单个电机,其受力情况可以用一组矩阵形式的耦合微分方程表示。 其中,q,qd,qdd 分别为广义的关节位置、速度和加速度的向量,H是关节空间惯性矩阵,C是科氏力和向心力耦合矩阵,G是重力负荷,F...
  • 机械手是一种典型的机电一体化产品,...要求对机械手模型进行力学分析,估算各关节所需转矩和功率,完成电机和减速器的选型。其次从电机和减速器的连接和固定出发,设计关节结构,并对机构中的重要连接件进行强度校核。
  • 在实验室样品自动上样 双轴机械臂 调试之后,出现了的肩关节 运动力矩不足 的问题。为此将原来的驱动肩关节的 42HS48步进电机 更换成 57HSXXXXEIS步进电机 。力矩有原来的0.4N·M,增加到2.0N·M。 ▲ 57HSXXXXEIS...
  • 本文分析空间二次旋转曲面的产品数学模型,通过参数方程求解二次曲面各点在笛卡尔坐标系中的位姿矩阵,从而计算出机械手臂每个关节电机旋转角度.由MATLAB软件进行验证,观测此二次曲面的粗插补算法的准确度和精确...
  • 在肩部关节对于 57HSXXXXEIS一体化步进伺服驱动电机 增加了α=1:10\alpha = 1:10α=1:10的行星轮减速器(LRF60-L1-10-S2-P2)。 将于如来的角度传感器 BH35旋转编码器 更换成 ST-3806-15-RS 可以将原来 MOD-BUS 总线...
  • ➤01 机械臂设计 在基于STM32对于三轴机械臂控制器设计 中设计了控制电路板。本文记录对其在机械臂实际部件进行调试的过程。   ➤02 上下运动控制 1.控制接口 (1)运动控制电机 A.控制器和接口 使用PSM3进行...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

机械臂关节电机