精华内容
下载资源
问答
  • 自由度机器人手臂遥控装置硬件采用Arduino uno单片机主板加扩展板,参见附件图片资料。...遥控装置采用PS2无线手柄的个操作杆来控制四自由度机器人手臂。软件采用了mixly图形编程程序请参见附件。
  • 自由度机器人手臂遥控装置硬件采用Arduino uno单片机主板加扩展板,参见附件图片资料。...遥控装置采用PS2无线手柄的个操作杆来控制四自由度机器人手臂。软件采用了mixly图形编程程序请参见附件。
  • 自由度机器人手臂遥控装置硬件采用Arduino uno单片机主板加扩展板,参见附件图片资料。...遥控装置采用PS2无线手柄的个操作杆来控制四自由度机器人手臂。软件采用了mixly图形编程程序请参见附件。
  • 两自由度Scara机器人有两个旋转关节,机器人的控制主要就是电机和末端执行器的控制。在学习marlin固件控制机器人时,由于marlin代码过于繁杂且许多代码都是关于3D打印,与机器人相关的代码占比很少。所以我想自己写...

    1.描述

    两自由度Scara机器人有两个旋转关节,机器人的控制主要就是电机和末端执行器的控制。在学习marlin固件控制机器人时,由于marlin代码过于繁杂且许多代码都是关于3D打印,与机器人相关的代码占比很少。所以我想自己写一段代码,尝试实现scara的控制。在我写这篇博客时,修改Marlin实现scara控制已完成,功能很强大,后期也会写一写。这里我先讲讲我这个小白写的代码,比较粗浅,慢慢进步吧。
    电机控制不是简单地给个脉冲频率让它转动就行,其中需要包含加减速的控制以减少电机因急停、速度快速变化带来的电路冲击,使运动更加平稳。在搜索中我发现了AccelStepper库,大大简化了对电机的控制,很方便,在控制要求不高的场合完全可以使用这个库来实现。用我自己画的四自由度Scara机器人代替下,多了末端z方向自由度和旋转自由度,如下图。

    2.数学模型

    让机器人运动到目标位置需要给定坐标,我这里设定了工作台坐标系和基坐标系。工作台坐标系也称世界坐标系,是一个通用坐标系,机器人所有的运动都是相对于它来执行的。基坐标系是以主臂转动中心为原点建立的。给机器人发送的是世界坐标系中的坐标,程序通过这两个坐标系的位置关系,求出在基坐标系下的坐标,并由此坐标通过数学模型求出主臂与x轴正方向的夹角,及副臂和主臂的夹角。有了角度,下一步就是驱动电机到达目标角度即可。可以走直线,走圆弧,或者不用差补直接一步到位,这在轨迹规划中设置。
    下图是机器人坐标系(左) 和 工作坐标系(右)的关系(这里没有offset-y,如有需要可以加上)。箭头指向为正方向。注意:这里的x轴正方向是有改变的。

    在这里插入图片描述
    输入世界坐标,求出基坐标。

    机器人坐标系 世界坐标系
    (100,0) (0,0)
    (80 ,60) (20 ,60)
    (0 ,100) (100 ,100)
    (80 ,60) (20 ,60)
    (-80 ,60) (180 ,60)

    接着求出逆解,即电机转角,数学模型如下(这张是引用别人的图片),计算过程在代码中有注释,这里不再赘述。
    在这里插入图片描述
    这样我们就得到电机应该达到目标位置的转角,减去当前位置的转角就是我们即将要驱动电机转动的角度。角度乘以转过每个角度所需的脉冲数即得到开发板所需发出的脉冲数,接着调用AccelStepper库文件,轻松实现梯形加减速到达目标位置。
    AccelStepper库详细描述

    3.代码实现

    #include<AccelStepper.h>
    
    //本程序设计的是scara构型机器手臂,两自由度
    //实验耗材:开发板mega2560,扩展板RAMPS1.4,42步进电机两个,A4988驱动器两个,机械限位开关两个,24V开关电源。
    //不同电机、驱动器、开发板也可以实现,定义好引脚即可
    #define ST1 1 //driver模式,两线电机
    #define ST2 1
    //定义步进电机引脚
    #define X_STEP_PIN         54 //脉冲引脚
    #define X_DIR_PIN          55 //方向引脚
    #define X_ENABLE_PIN       38 //使能引脚
    #define Y_STEP_PIN         60
    #define Y_DIR_PIN          61
    #define Y_ENABLE_PIN       56
    #define KEY_X 3   //主臂限位开关引脚
    #define KEY_Y 14  //副臂限位开关引脚
    #define LED           13 //LED灯引脚,用来模拟机器人到达目标位置后末端执行器的动作,如气缸、手爪等动作
    
    //定义一些固定参数
    #define Linkage_1 50 //主臂长
    #define Linkage_2 50 //副臂长
    #define L1_2 2500  //主臂长平方
    #define L2_2 2500  //副臂长平方
    #define SCARA_RAD2DEG  57.29578 //弧度转角度
    #define steps_per_unit 8.888888   //电机转过1°角度所需的脉冲数,如果有减速,乘上减速比即可
    #define offset_x  -100    //世界坐标系原点 相对 基坐标系原点的 x偏移值,注意正负号(与你建立的世界坐标系位置有关)                     *工作台坐标系
    #define offset_y   0     //世界坐标系原点 相对 基坐标系原点的 y偏移值,注意正负号                             
    
    float arr[32]={0};      //存放串口接受的目标位置X Y坐标的数组
    char cmd;              //串口接收的字符
    int j=0;               //数组中的元素个数
    
    enum AXIS {X_AXIS=0,Y_AXIS=1};       //定义主臂为0,副臂为1
    float current_position[2]={0};       //当前位置坐标
    float cartesian[2]={0};              //世界坐标系下坐标(自定义的坐标),坐标型
    float SCARA_pos[2]={0};              //基坐标系下的位置,坐标型
    float SCARA_C2=0;                    //末端中心相对基坐标系的cos值
    float SCARA_S2=0;                    //末端中心相对基坐标系的sin值
    float scara[2]={0};                  //原点坐标系坐标下的主臂与x轴夹角,副臂和主臂夹角
    int calculate_position[2]={0};       //到达目标位置主臂和副臂所需的脉冲
    bool arrival =true;                  //电机到达目标位置标志符
    float target_position[2]={0};
    
    
    //定义两个步进电机对象,这个在AccelStepper库里有详细的介绍,不同电机参照即可
    AccelStepper stepper1(ST1,X_STEP_PIN,X_DIR_PIN);
    AccelStepper stepper2(ST2,Y_STEP_PIN,Y_DIR_PIN);
    
     void setup() {
      Serial.begin(250000);
    
       pinMode(X_ENABLE_PIN ,OUTPUT);
       pinMode(Y_ENABLE_PIN ,OUTPUT);
       pinMode(KEY_X,INPUT_PULLUP);      //限位开关上拉
       pinMode(KEY_Y,INPUT_PULLUP);      //限位开关上拉
       pinMode(LED ,OUTPUT);
    
    //启用以下代码可以实现开机自动归零,若不启用,则需要发'H'使其归零
    //  while(digitalRead(KEY_X)==HIGH)
    //  {
    //   digitalWrite(X_STEP_PIN,HIGH);
    //   delay(1);
    //   digitalWrite(X_STEP_PIN,LOW);
    //   delay(1);
    //  }
    //   while(digitalRead(KEY_Y)==HIGH)
    //   {
    //   digitalWrite(Y_STEP_PIN,HIGH);
    //   delay(1);
    //   digitalWrite(Y_STEP_PIN,LOW);
    //   delay(1);
    //   }
      
      stepper1.setMaxSpeed(20000.0);     // 1号电机最大速度 
      stepper1.setAcceleration(15000.0);  // 1号电机加速度
     
      stepper2.setMaxSpeed(20000.0);     // 2号电机最大速度
      stepper2.setAcceleration(15000.0);  // 2号电机加速度
    }
    
    //串口
    //发送给arduino的数据格式为 #a b   a b为世界坐标系下的x y坐标值 
    void getSerial()
    {
      if(Serial.available()&&j<32)
      {
        cmd=char(Serial.read());  
            if(cmd=='#') //提取坐标(世界坐标系)
            {
             for(int i=0;i<2;i++) //x y坐标是成对发送的
             {
              arr[j]=Serial.parseFloat();//快速提取#后面的两个float型数据
              j++; //数组中的元素个数+1 
             }
            } 
            else if(cmd=='H') //归位(归零),主臂先归位,触碰到限位开关后停止,副臂开始归位,触碰开关后停止
            {
                   while(digitalRead(KEY_X)==HIGH)
                {
                 digitalWrite(X_STEP_PIN,HIGH);
                 delay(1);
                 digitalWrite(X_STEP_PIN,LOW);
                 delay(1);
                }
                 while(digitalRead(KEY_Y)==HIGH)
                 {
                 digitalWrite(Y_STEP_PIN,HIGH);
                 delay(1);
                 digitalWrite(Y_STEP_PIN,LOW);
                 delay(1);
                 }  
                 stepper1.setCurrentPosition(stepper1.currentPosition());//将当前位置设置为绝对位置0(这里的绝对位置是归位后主臂和基坐标系x轴正方向的夹角)
                 stepper2.setCurrentPosition(stepper2.currentPosition());//如果不归位,上电后的初始坐标就是绝对位置0
              }
             else if(cmd=='P')   //获取当前坐标(工作台坐标系) 
            {
              Serial.print("x:");
              Serial.print(cartesian[X_AXIS]);
              Serial.print("y:");
              Serial.println(cartesian[Y_AXIS]);
              }
              else if(cmd=='S') //获取当前脉冲数    
            {
              Serial.print("x:");
              Serial.print(stepper1.currentPosition());
              Serial.print("y:");
              Serial.println(stepper2.currentPosition());
              }
      }
    }
    
    //**********************************************************逆运动学********************************************************
    //以下程序需要结合坐标系图
    void prepare_move()
    {
      
      cartesian[X_AXIS]=arr[X_AXIS];
      cartesian[Y_AXIS]=arr[Y_AXIS];
    
      //根据数学模型求逆解
      static float SCARA_C2, SCARA_S2, SCARA_K1, SCARA_K2, SCARA_theta, SCARA_psi; 
      SCARA_pos[X_AXIS] = -cartesian[X_AXIS]-offset_x;  //Translate SCARA to standard X Y
      SCARA_pos[Y_AXIS] = cartesian[Y_AXIS]-offset_y ;  // With scaling factor.
    
      //余弦定理 求副臂和主臂的夹角
      #if (Linkage_1 == Linkage_2)
        SCARA_C2 = ( ( sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) ) / (2 * (float)L1_2) ) - 1;
      #else
        SCARA_C2 =   ( sq(SCARA_pos[X_AXIS]) + sq(SCARA_pos[Y_AXIS]) - (float)L1_2 - (float)L2_2 ) / 45000; //这里的45000是(2*Linkage_1*Linkage_2)
      #endif
      
      SCARA_S2 = sqrt( 1 - sq(SCARA_C2) );
      SCARA_K1 = Linkage_1 + Linkage_2 * SCARA_C2;//OC的长
      SCARA_K2 = Linkage_2 * SCARA_S2;//OB的长
      SCARA_theta = ( atan2(SCARA_pos[X_AXIS],SCARA_pos[Y_AXIS])-atan2(SCARA_K1, SCARA_K2) ) * -1;
      //,图中角1-角2,即(90-角3)-(90-角OBC),即(角3-角OBC)*-1
      //主臂与x轴正方向的夹角
      SCARA_psi   =   atan2(SCARA_S2,SCARA_C2);       //副臂与主臂的夹角
      scara[X_AXIS] = SCARA_theta * SCARA_RAD2DEG;    //  弧度转角度 
      scara[Y_AXIS] = SCARA_psi * SCARA_RAD2DEG;  
         
      float stepper_x=scara[X_AXIS]*steps_per_unit;  //求达到该角度所需的脉冲数
      float stepper_y=scara[Y_AXIS]*steps_per_unit;
      calculate_position[X_AXIS]=round(stepper_x);   //脉冲数取整
      calculate_position[Y_AXIS]=round(stepper_y);
     
    }
    
    
    void loop() 
    {
      getSerial();  //获取串口数据
      if(j>0)   //当数组中有坐标时
      {
        prepare_move(); //准备运动
    
      if(arrival==true) //当上一次运动到达时,开启下一次运动
       {
        arrival==false;
        target_position[X_AXIS]=calculate_position[X_AXIS];
        target_position[Y_AXIS]=calculate_position[Y_AXIS];
        //执行运动     
        // stepper1.run()该函数不影响后续程序的执行,即电机还没运动到目标位置,下面的程序就已经执行了,所以开启下一次运动前要加判断。
        stepper1.moveTo(target_position[X_AXIS]);              
        stepper2.moveTo(target_position[Y_AXIS]);  
        stepper1.run();   // 1号电机运行
        stepper2.run();   // 2号电机运行
       }
      }
     if(stepper1.currentPosition() == target_position[X_AXIS] && stepper2.currentPosition() == target_position[Y_AXIS]&&(j>0) ) 
     {
        arrival=true;              //当到达目标位置后,LED灯亮,模拟气缸、手爪动作
        digitalWrite(LED,HIGH);
        delay(1000);
        digitalWrite(LED,LOW);
        for(int i=0;i<j-2;i++)
        {
          arr[i]=arr[i+2];//这里采用的是笨方法,后面的坐标覆盖前面的坐标
          }
        j-=2;    //数组中的未执行的坐标个数
     }
    }
    

    4.注意点以及扩展

    stepper1.run()这个函数是以你设置的加速度和最大速度到达目标位置,是一个梯形加减速的过程。
    代码比较粗糙,展示的主要是思路,还有许多细节的地方需要完善。上述代码仅是以一步到位的方式到达目标位置,没有经过差补。如果你想差补,可以在轨迹规划里加入代码,直线插补、关节差补、圆弧差补。我在这里谈一谈直线差补:计算出目标位置与当前位置的距离,x方向和y方向的差值。我设定这段路程分为200小段来走(差补次数可以设定定值也可以是计算出的变量),那么当前位置x+x差值*(第几次差补)/200=下一个目标位置。写一个for循环,走完这200步,把每一步的坐标值带入到逆解里得出角度然后驱动电机。差补的步数越多末端轨迹越像直线,但是差补过多会影响运行速度,且角度太小的话走的会不准确。建议根据路程长短设置差补步数(变量)。再加上一个电机和丝杠,可以实现三自由度,思路都是一样的。
    运用Marlin固件也可以控制scara,且更准确,速度上限更大(实测得出),运行也更稳定。大佬们写的程序确实很厉害,我只是一个小白。在后期会写marlin控制scara所需更改的配置。写这篇文章,只是觉得Arduino的库文件真的很方便。在项目-加载库-管理库里面搜索AccelStepper可以下载这个库文件。

    展开全文
  • 图一 大作业示意图问题1: 摄像头通过采集到的图像,已计算出机器人基座坐标系{0}相对于摄像头坐标系{C}的位姿、以工件A的几何中心为为原点的坐标系{A0}相对于{C}的位姿、以工件B的几何中心为原点的坐标系{B0}相对于...

    1f7bff1fd9ca14cc9ca44b8c26fb3e18.png

    d48a861a37bf6f066f727a934cc6d903.png
    图一 大作业示意图

    问题1:

    摄像头通过采集到的图像,已计算出机器人基座坐标系{0}相对于摄像头坐标系{C}的位姿、以工件A的几何中心为为原点的坐标系{A0}相对于{C}的位姿、以工件B的几何中心为原点的坐标系{B0}相对于{C}的位姿:

    fbfab1f90f7b22357272cb53ae026365.png

    计算钻头分别在PA和点PB工作时,机器人末端坐标系{6}相对于基座坐标系{0}的位姿。

    分析:

    我们需要求解的相当于钻头在和两点时的位姿矩阵。

    假设钻头在点PA

    c2128942853a8360b9d59fdc284d07ed.png

    这里我犯了一个错误,一定要注意。坐标位姿转换的顺序十分重要,具体顺序参考PPT数学基础最后一道。例题同理可求在的位姿。问题转换成了如何求解矩阵及,按照题目要求,我们选取合适的X轴和Y轴,并满足右手定则,结果如下图所示。

    .

    bb6a95959437438edaa3aabcee2ee2e1.png
    图二:坐标系{6}位姿

    难点:

    f4ccced3d1fbb0ec15a973d07c3d3440.png

    实在没办法,位姿态按照公式编写m文件。程序代码见附录。

    结果:

    74b6537b49f918f35bf291eb9104bab4.png

    问题2:

    点工作完成后,期望用两秒时间调整至点工作位姿,采样间隔50ms。编写m程序,分别使用笛卡尔空间轨迹规划(直线转移)和关节空间轨迹规划计算转 移过程,通过比较关节角度随时间变化曲线,分析两种方法的优缺点。

    分析:

    题干一开始明确使用的机器人为PUMA 560完成加工任务。我们便可以直接采用Robotics Toolbox完成轨迹规划的分析任务。

    通过问题一中求解得到的机器人末端的位姿,可以使用逆向运动学求解得到机器人的各关节位置,之后进行轨迹规划分析,程序代码见附录。

    a4d3846fe315d4737af744e38930e91b.png
    图三:关节空间轨迹规划

    a35a0f4495e0fec9696fb714a40d1191.png
    图四:关节空间轨迹规划

    结果分析:

    根据课上所学内容,关节空间轨迹规划是利用关节角度描述机器人的轨迹。根据仿真结果我们可以看出其优点是无需描述路径形状。计算简单,按照公式手算都可以。不容易出现机构奇异性问题,对照仿真结果确实没有出现奇异性问题。缺点是路径不直观,不利于避障设计。

    相对的笛卡尔空间轨迹规划是三维直角坐标系上描述轨迹的方法。优点是路径直观,便于复杂路径的设计。缺点是计算复杂,轨迹需要求解逆运动方程,公式确实不好算。以及容易出现结构奇异问题,仿真结果确实出现了奇异性问题。

    问题三:

    机器人采用力矩前馈控制,利用 simulink中sl_fforward 实例模块对此转移过程进行仿真,仿真总时长5s,位置和速度增益均采用默认值。

    1.设定轨迹规划过程,转移时间2s,采样间隔 50ms。为加快运行速度,可将反馈通道、前馈通道采样间隔均设为 50ms。(注意:轨迹规划和机器人模块中默认初始关节角均为0,需调整为本任务初始角)。

    2.得到关节角度、角度偏差随时间变化曲线,以及关节角速度、控制力矩随时间变化曲线。

    3.如取消前馈力矩,分析控制性能的恶化效果(可从角度偏差、所需力矩等方面考虑)

    1.Simulink相关设置:

    d225b4f5e921f7bd7d4bb5ed68d0fb4a.png
    图五:Simulink仿真图

    c61bcfa686aa96b43a1f71f52bff7891.png
    图六:相关模块参数设置

    2.仿真结果:

    e1818b3e36bacf1de99ce9aebfe6a467.png
    图七:前馈控制下关节角度变化

    9d555aa4ddf0947bde6355835500c1f0.png
    图八:前馈控制下角度偏差变化

    dc87f5a9e7f3877a1d00ea89a7bb3cf0.png
    图九:前馈控制下关节角速度变化

    00928774ff32691ab933c00aa221670f.png
    图十:前馈控制下控制力矩变化

    3.取消前馈力矩的控制性能:

    2bf4702203a062edbc05caf238a02ffe.png
    图十一:无前馈控制时关节角度变化

    e4214d233728cadc60aff79555bc5b9c.png
    图十二:无前馈控制时角度偏差变化

    d4d799b059e19730055cd58d79ada6e2.png
    图十三:无前馈控制时关节角速度变化

    b00fe2b980438e1ddf6c29efeaeebe80.png
    图十四:无前馈控制时控制力矩变化

    分析:

    这里遇到了问题,一开始做的答案有错误。在进行simulink相关设置的时候,需要设置机械臂的初始状态,我一开始没有明白这句话的意思。改正之后效果正确。同时为了减少锯齿,采用固定仿真步长进行仿真,效果良好。

    对比有无前馈控制的仿真结果,我们可以看出虽然无前馈控制也可以达到我们期望的效果。但我们也可以看出没有前馈通道时角度偏差波动变化较大,控制力矩变化也变大了,需要付出更多的代价,带有前馈通道的控制效果更好。

    附录:Matlab代码

    1. %%
    2. %author:XX
    3. %ID:1171430608
    4. %date:2020.5.5
    5. %
    6. clear,clc
    7. %%
    8. %Task1 计算钻头在PA与PB工作时,机器人末端坐标系6相对于基座坐标系0的位姿
    9. %TC_0代表从坐标系0转换到C的变换算子
    10. TC_0 = [1 0 0 -0.4;0 -1 0 0.4;0 0 -1 1;0 0 0 1];
    11. TC_A0 = [0 1 0 0.15;1 0 0 0.2;0 0 -1 0.95;0 0 0 1];
    12. TC_B0 = [0 1 0 0.3;1 0 0 -0.3;0 0 -1 0.9;0 0 0 1];
    13. %在A工作
    14. TA0_6=transl(0,0,0.15+0.05)*troty(180); %A系在正方体中心,所以平移时向量需要加上正方体的高度的一半
    15. AT0_6=(TC_0^-1)*TC_A0*TA0_6;
    16. %在B工作
    17. TB0_6=transl(0.2,0,0)*troty(-90);%关节6相对于坐标系B0的位置TB0_6
    18. BT0_6=(TC_0^-1)*TC_B0*TB0_6;
    19. %%
    20. %Task2 PA工作完成后期望用两秒调整至PB点,采样间隔50ms
    21. %分别用笛卡尔空间轨迹规划和关节空间轨迹规划计算转移过程
    22. %通过比较关节角度的变换曲线,分析两种方式的优缺点
    23. mdl_puma560;
    24. q0=p560.ikine6s(AT0_6); %在PA时通过逆向运动学求解关节变量
    25. q1=p560.ikine6s(BT0_6); %在PB时通过逆向运动学求解关节变量
    26. %采样时间
    27. t=0:0.05:2;
    28. %关节空间轨迹规划
    29. [q,qd,qdd]=jtraj(q0,q1,t);
    30. figure(1);
    31. plot(t,q);title('关节空间轨迹规划position 1-6');grid on;
    32. %笛卡尔空间轨迹规划
    33. Ts=ctraj(AT0_6,BT0_6,length(t));
    34. q2=p560.ikine6s(Ts);
    35. figure(2);
    36. plot(t,q2);title('笛卡尔空间轨迹position 1-6');grid on;
    展开全文
  • 最近在重新琢磨Gazebo仿真环境,尚处于囫囵吞枣阶段。...当前模型就是一个基础版四足机器人,每条腿有自由度,一个旋转关节一个移动关节(可以看成气缸或者液压缸)。先写urdf文件,把ros_co...

    5a17069109a34eba30b357464a1a1fe8.png

    最近在重新琢磨Gazebo仿真环境,尚处于囫囵吞枣阶段。因为正好在看30多年前波士顿动力(BostonDynamics)创始人Marc Raibert的书《Legged Robots That Balance》,就用Gazebo搭建了一个简单的四足仿真模型练手。

    当前模型就是一个基础版四足机器人,每条腿有两个自由度,一个旋转关节一个移动关节(可以看成气缸或者液压缸)。先写urdf文件,把ros_control插件写好导入Gazebo,用位置控制。图省事就写了最简单的对角步态,后续还会继续增加。

    如果要拿去玩,改进建议如下:

    1. 增加腿部关节,使腿部能够有z向的旋转自由度;
    2. 将移动关节改为旋转关节,这样就需要自己写简单的运动学解法;
    3. 机器人的刚度很低,似乎是移动关节模型的原因,调整PID参数或者修改结构也许有帮助。(gazebo可以用封闭的矢量图生成结构,或导入stl文件已创建更加复杂的架构,见Gazebo教程)

    毕竟本人是名学生+初学者,水平有限,因此个人认为这个模型适合Gazebo仿真的初学者弄明白仿真模型框架的结构。就模型有什么问题可以直接提问或私信。

    另外本人平时研究串并联或柔性机器人的运动控制算法,欢迎大家一起交流学习。

    对角步态仿真动画

    2964b7fedbbc6d70b05650fe822367d0.png
    https://www.zhihu.com/video/1095789368500940800

    urdf模型结构

    aa67242071a6f971f2dfb20e800488d5.png

    仿真node图

    a3d4febf2da38cf375a907bffdaabf06.png
    XM522706601/Quadruped_Robot_Demosgithub.com
    0862c86ae030c6ca61e687ddac61c7c8.png

    参考资料:

    1. 《Legged Robots That Balance》,Marc Raibert
    2. 《ROS机器人开发实践》,胡春旭
    3. ROS wiki, ROS Answers, Questions Gazebo
    展开全文
  • 针对假肢自动化测试不可重复性和可能对测试病人造成的不安全问题,本文设计了一种基于两自由度髋关节运动和MSP430单片机的机器人假肢控制系统。设计的机器人可在矢状面平面重复两个自由度臀部运动,将跑步机作为...
  • 之前打ICRA2018的Tidy Up My Room challenge的时候就已经接触了一些机器人学的内容,不过以偏应用的ROS,轨迹规划...部分内容是自己总结的,我看的机器人学教材:【1】《Introduction to Robotics: Mechanics an...

    5ce806bfe677d62090565a683fbade65.png

    之前打ICRA2018的Tidy Up My Room challenge的时候就已经接触了一些机器人学的内容,不过以偏应用的ROS,轨迹规划,控制居多,对于机械臂和力学确实了解的不多,这学期选了ME300,恶补了一些机械臂的知识,笔记部分内容直接copy自老师ppt,部分内容是自己总结的,我看的两本机器人学教材:

    【1】《Introduction to Robotics: Mechanics and Control (4th Edition)》 John J. Craig

    【2】《机器人学:建模、控制与视觉》熊有伦 华中科技大学出版社

    头图来自minori的机器人学游戏《トリノライン》,参考【百度百科】 【bangumi】


    一、机器人的总体和机械结构设计

    基本组成:机械部分、传感部分、控制部分

    机器人自由度:机器人所具有的独立坐标轴运动的数目。构件所具有的独立运动数目(或确定构件位置的独立参变量的数目)。

    开链机构:工作空间大,刚性小,如PUMA562机器人

    闭环机构:刚度大,工作空间受限,如Stewart机构 Grubler公式:

    其中 n-关节总数,l-连杆数,

    -第i个关节自由度数,F-自由度数

    其它基本参数:机器人精度、工作范围、最大工作速度、承载能力

    机器人的总体设计:确定基本参数、选择运动方式、手臂配置形式、位置检测、驱动和控制方式等。(结构设计时,对各部件的刚度、强度做验算。)

    驱动方式:液压(大负载),气动(节拍快),电动(动作复杂/轨迹严格)

    传动部件设计:关节-转动关节(Rotary Joint)/ 移动关节(Slide Joint)

    二、位姿描述和齐次变换

    位姿:位+姿,刚体相对参考点的位置和刚体的姿态,描述方法-齐次变换/矢量/旋量/四元素

    位置的描述-位置矢量,空间任意点P的位置

    姿态的描述-旋转矩阵,n参考坐标系{A} 、直角坐标系{B}与刚体固接,用{B}的三个主单位矢量xB/yB/zB相对于{A}的方向余弦组成的矩阵,表示刚体B相对于坐标系{A}的方位。

    旋转矩阵是3x3的方阵,但实际上只有3个独立元素,可以用旋转矩阵的两个性质建立:

    1.三个矢量是单位矢量:

    2.三个矢量相互垂直:

    刚体的位姿描述:位置+姿态

    a315bd01b50ca77ed336aaf4a5a776d2.png

    手爪坐标系:

    a:手指接近目标物体的方向为z轴,称为接近矢量。

    o:两手指连线方向为y轴,称为方位矢量。

    n:另外一个矢量反向由右手法则确定,称为法向矢量

    坐标变换:平移

    旋转:

    绕单轴旋转的基本旋转矩阵:

    齐次坐标:用四维向量表示三维空间一点的位置P,称为点的齐次坐标

    机器人学中的齐次坐标: ω=1

    齐次变换矩阵:

    R-旋转矩阵 P-位置向量 f-透视向量,一般取[0,0,0]

    齐次变换

    ,则
    ,相比
    变成了齐次

    齐次变换可以分解成旋转变换和平移变换:

    平移:

    旋转:

    齐次复合变换的规则:相对固定坐标系变换矩阵左乘,相对变化坐标系右乘

    齐次变换求逆,运用性质:

    欧拉法:设最初坐标系{B}与参考系{A}重合,首先使{B}绕zB转α角,继而绕yB转β角,最后绕zB转γ角,α-β-γ称为z-y-z欧拉角,这种描述刚体相对坐标系{A}方位的方法称为欧拉法。

    c64c3800d353918022eace85be295240.png

    RPY角/RPY变换:nRPY角是描述船舶在海中航行姿态常用的一种方法,船的行驶方向为z轴,绕z轴的旋转角α称为回转(Roll),绕y轴的旋转角β称为俯仰(Pitch),绕x轴的旋转角γ称为偏转(Yaw)。n设最初坐标系{B}与参考系{A}重合,首先使{B}绕xA转γ角,继而绕yA转β角,最后绕zA轴转α角,α、β、γ称为RPY角。

    373f9845bc64a4a41fef5d957168f637.png

    两类矢量:

    1. 自由矢量:由维数、大小和方向三要素唯一规定,例如速度、力矩。变换仅涉及旋转变换
    2. 线矢量:维数、大小、方向、作用线四要素唯一规定,例如力。变换旋量法 参考“Kinematics Geometry of mechanisms”

    三、操作臂运动学

    研究对象:手臂各连杆之间的位移关系、速度关系和加速度关系。

    研究目的:寻找相邻连杆之间的运动与任意连杆之间的运动之间的关系。

    研究方法:在每个连杆上固接一个坐标系,然后描述这些坐标系之间的关系(D-H齐次变换)

    关节:转动关节(Rotary joint)/移动关节(Prismatic joint)

    连杆i ( i=1,2,…n,n为机器人含有关节数目,即机器人自由度数)两端有关节i 和 i+1,在驱动装置带动下,连杆将绕或沿关节轴线,相对于前一临近连杆转动或移动。

    连杆的尺寸参数:长度

    :两关节轴线沿公垂线距离/扭角
    :两轴线夹角

    连杆的关系参数:偏置

    :沿关节i轴线方向,两个公垂线(轴线(i-1)及轴线i, 轴线i及轴线(i+1))之间的距离 / 关节角
    :垂直于关节轴线的平面内,关节轴线i-1和i的公垂线与关节轴线i和i+1的公垂线之间的夹角

    机器人每个连杆由四个参数ai、αi、di、θi来描述,称为机器人D-H坐标法。(因为提出者是Denavit和Hartenberg~)

    转动连杆的D-H变换:绕zi-1轴转θi角->沿zi-1轴移动di->沿xi轴移动ai->绕xi轴转αi

    移动连杆的D-H变换:

    机器人运动学方程:将机器人位姿从关节空间变换为直角坐标空间描述,求机器人末端操作装置的位姿->机器人运动学正解。

    机器人运动学逆解:给定机器人终端位姿,求各关节变量,也称为机器人逆运动学问题,包括存在性、唯一性及解法。一般方法:求机器人运动学逆解常采用臂腕分离的方法,机器人运动学方程包括臂运动及腕运动。机器人总位移为臂终端相对基座的位移加上终端操作装置中心相对臂终端的位移(均在基坐标系中)。机器人关节变量也分臂、腕两部分求解。


    四、操作臂的雅可比

    这部分真的挺难的,在用微分运动引入雅可比的时候对于不同坐标系微分运动的变换不太好理解,建议着重看怎么用矢量积法来构造雅可比矩阵就好,微分变换记结论。

    关节空间->操作空间:运动学正解 操作空间->关节空间:运动学逆解

    雅克比矩阵:研究操作空间速度与关节空间速度之间的线性映射关系

    机器人的关节速度向量

    qi为连杆i相对于
    i-1的角速度或线速度

    手爪在基坐标系中的广义速度向量:

    v为线速度,w为角速度,从关节空间速度q向操作空间速度V映射的线性关系称为雅可比矩阵,简称Jacobian,记为J:

    雅可比矩阵(Jacobian) J:定义为从关节空间速度向操作空间速度V映射的线性关系

    微分运动:微分移动+微分转动,

    R是旋转矩阵,S(P)为矢量P=[px,py,pz]T的反对称矩阵。

    任意两坐标系{A}和{B}之间广义速度的坐标变换:

    构造方法:矢量积/微分变换

    1.矢量积法:对于有n个关节的机器人,雅可比矩阵为6×n阶矩阵,前三行为位置雅可比矩阵,代表对手爪线速度v的传递比,后三行为方位矩阵,代表相应的关节速度对手爪角速度的传递比。可得分块雅可比矩阵:

    1ae36e945e041947a6973d9507511545.png

    对于移动关节

    转动关节

    其中

    2.微分变换法(记结论就好,过程有点麻烦):

    移动关节

    转动关节

    逆雅克比矩阵:若给定机器人终端手爪的广义速度向量V们可以解出关节速度

    逆雅可比矩阵求解:利用逆运动学问题的解,直接对其微分来求J-1,对于带球面腕的机器人可用臂腕分离来求J-1 。当J不是方阵时,不存在J-1,可用广义逆(伪逆)雅可比矩阵来确定关节速度向量。超定-最小方差/欠定-拉格朗日乘子法

    雅可比的秩不是满秩的关节矢量q称为奇异形位,即: rank(J(q))<min(6,n)。相应的操作空间中的点P(q)为工作空间的奇异点,此时机器人至少丧失一个自由度,常称机器人处于退化位置。

    力雅克比:末端广义力矢量:机器人与外界环境相互作用时,在接触处要产生力f和力矩n,统称为末端广义力矢量。

    静止状态下,广义力矢量F应与与各关节的驱动力(或力矩)相平衡,n个关节的驱动力(或力矩)组成的n维矢量:

    根据各关节作的虚功之和与末端执行器所作虚功应该相等原则有:

    机器人力雅可比:表示静止平衡状态下,末端广义力向关节力映射的线性关系。两坐标系{A}和{B}之间广义操作力的坐标变换关系:

    展开全文
  • 第八章 操作臂的机械设计【(一)8.1-8.9...(二)基于任务需求的设计1、自由度的数目(1)图8-1所示未操作臂以种不同的方法对磨削工具进行定位。实际上只需要5个自由度(2)在一些任务中,当由主动定位装置来放置...
  • 机器人自由度

    千次阅读 2020-05-04 21:44:10
    自由度的定义为:描述空间运动的刚体所需要的独立变量的个数(最大为6)。由于有时机械臂的轴的数量与自由度之间的关系较为模糊,故在下面稍做说明。 机构学是机械工程学的基础,它包括机构运动分析(analysis of ...
  • 结合六自由度并联机器人机构的特点,提出一种新的分散控制方法.首先依据机构特点指出了关节空间内惯性矩阵块对角占优特性,从而将耦合强烈的邻近支路加以整体考虑,即分散控制,个输入输出子系统;然后将性矩阵的逆...
  • 作者将会根据如下篇paper来大致介绍我们在这个项目中取得的一些成果,同时也会分享目前存在的问题和所面临的挑战,希望能够大家提供一些有益的借鉴。1. T. Klamt, D. Rodriguez, L. Baccelliere, et.al., F. ...
  • 六轴工业机器人一般有6个自由度,常见的六轴工业机器人包含旋转(S轴),下臂(L轴)、上臂(U轴)、手腕旋转(R轴)、手腕摆动(B轴)和手腕回转(T轴)。6个关节合成实现末端的6自由度动作。6轴工业机器人的全部控制由一台微型...
  • 6自由度串联机器人D-H建模方法

    万次阅读 2017-12-30 14:23:10
    个Z轴相交,则取个Z轴的叉积方向作为X轴方向。 (3)Zi轴和Xi轴交点为坐标系i的原点; (4)右手定则确定Yi轴,Yi =Zi”×” Xi2.D-H参数的确定(1)连杆长度ai-1:沿着Xi-1轴,从Zi-1轴到Zi轴的距离, (2...
  • 据了解,它拥有自由度和一个钟摆,用于在绳索上摆动之后再向空中发射。机器人能够在空中自行折叠,随后翻筋斗,最后轻盈降落在垫子上,呈现“平躺”姿势。▲ Stickman杂技机器人在做后空翻(Source:迪士尼研究院...
  • 前几天我感到很羞愧,也知道在这个论坛一定不能班门弄斧,本来我想把这次做的东西在年前就贴出来的,但是鼓励了一下自己,先做了一个六自由度机器人,我已经贴了出来。 这次是一个比较简单的串联三自由度机器人 ...
  • 老板想做个大号的四足,让我先做个小的练练手,套方案均基于树莓派。 一、方案确立 大致情况如下方链接所示。前面的动态图是基于ROS-kinectic系统,后面的图是树莓派原生系统。 二、使用步骤 1.引入库 代码如下...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 180
精华内容 72
关键字:

两自由度机器人