搜索
bottom↓
回复: 34
打印 上一主题 下一主题

3D打印机械臂,开源六轴联动核心代码【已经开源】

  [复制链接]

出0入63汤圆

跳转到指定楼层
1
发表于 2023-7-17 09:38:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
打印机械臂项目会持续进行,预计2周后会在本贴开源六轴联动最核心的代码:运动学逆解(C代码,可在大多数平台移值),尽情期待

运动学逆解,即给出位置姿态矩阵,计算出6轴机器人各个关节的角度。我认为这是六轴机器人最复杂也是计算量最大的部分之一,大部分人都是被这一步给难住了。

运动学正解就不开源了,因为这个难度小,并且大多数时候正解并不要求计算效率,有初中数学知识花点精力基本就可以自己推导出来

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入63汤圆

2
 楼主| 发表于 2023-7-17 09:44:08 | 只看该作者
用这个代码做机床五轴五联动很轻松哦,所谓机床真五轴和假五轴的区别,就是看机床是五轴3联动还是五轴五联动,国内大多数机床五轴五联动是要另外掏钱的

出0入0汤圆

3
发表于 2023-7-17 10:06:03 | 只看该作者
非常期待

出100入312汤圆

4
发表于 2023-7-17 10:16:10 | 只看该作者
不明觉厉,顶下大牛

出0入0汤圆

5
发表于 2023-7-17 10:36:44 | 只看该作者
期待大牛

出16370入6742汤圆

6
发表于 2023-7-17 10:48:51 来自手机 | 只看该作者
先奖励1年VIP++。已经充值给楼主位,原日期2023-10-24,新日期:2024-10-24

出0入4汤圆

7
发表于 2023-7-17 10:50:00 | 只看该作者
非常期待

出0入0汤圆

8
发表于 2023-7-17 10:52:15 | 只看该作者
大牛厉害。

出0入0汤圆

9
发表于 2023-7-17 11:03:59 | 只看该作者
楼主厉害了,不知道6轴逆解给出的是解析解,还是数值解。

出0入0汤圆

10
发表于 2023-7-17 11:25:03 | 只看该作者
非常期待,加油,大牛!

出0入63汤圆

11
 楼主| 发表于 2023-7-17 11:27:21 | 只看该作者
armok. 发表于 2023-7-17 10:48
先奖励1年VIP++。已经充值给楼主位,原日期2023-10-24,新日期:2024-10-24
(引用自6楼)

感谢坛主

出20入62汤圆

12
发表于 2023-7-17 11:52:24 | 只看该作者
楼主除了一开始对成本的预算估计有些草率。
最近放出来的信息都是大牛所为啊。~

出0入90汤圆

13
发表于 2023-7-17 12:07:14 | 只看该作者
不错不错,又有好东西可以学习了,活到老学到老啊

出0入0汤圆

14
发表于 2023-7-17 12:45:35 | 只看该作者
大牛厉害,非常期待。

出0入0汤圆

15
发表于 2023-7-17 13:09:47 | 只看该作者
不明觉厉。不知大牛有没有后续提供套件出售的计划。

出75入88汤圆

16
发表于 2023-7-17 16:09:06 | 只看该作者
支持并感谢你的开源!

出0入42汤圆

17
发表于 2023-7-17 16:52:06 | 只看该作者
不明觉厉,楼主的几个帖子质量很高

出0入63汤圆

18
 楼主| 发表于 2023-7-17 17:15:46 | 只看该作者
niaojingxin 发表于 2023-7-17 13:09
不明觉厉。不知大牛有没有后续提供套件出售的计划。
(引用自15楼)

这个项目周期太长了,现在还不好说

出0入0汤圆

19
发表于 2023-7-17 20:01:37 | 只看该作者
非常期待,膜拜一下

出0入10汤圆

20
发表于 2023-7-19 11:29:16 | 只看该作者
嵌入之梦2 发表于 2023-7-17 20:01
非常期待,膜拜一下
(引用自19楼)

期待期待

出0入0汤圆

21
发表于 2023-7-19 20:40:21 来自手机 | 只看该作者
非常期待,膜拜一下

出0入420汤圆

22
发表于 2023-7-19 21:07:20 | 只看该作者
非常期待,膜拜一下

出10入0汤圆

23
发表于 2023-7-19 22:13:31 | 只看该作者

大牛厉害,非常期待。

出0入63汤圆

24
 楼主| 发表于 2023-7-24 00:25:15 | 只看该作者
本帖最后由 n_cell 于 2023-7-24 01:13 编辑
  1. #include "math.h"

  2. #define M_PI           3.14159265358979323846f
  3. #define M_PI_2  1.57079632679489661923f

  4. float DH_LTAngle1 = -90;    // link Twist
  5. float DH_LTAngle2 = 0;
  6. float DH_LTAngle3 = 90;
  7. float DH_LTAngle4 = -90;
  8. float DH_LTAngle5 = 90;
  9. float DH_LTAngle6 = 0;

  10. float DH_LLength1 = 30.0;   // Link Length
  11. float DH_LLength2 = 314.5;
  12. float DH_LLength3 = 0;
  13. float DH_LLength4 = 0;
  14. float DH_LLength5 = 0;
  15. float DH_LLength6 = 0;

  16. float DH_LOffset1 = 308.5;  // Link Offset
  17. float DH_LOffset2 = 0;
  18. float DH_LOffset3 = 0;
  19. float DH_LOffset4 = -268.5;
  20. float DH_LOffset5 = 0;
  21. float DH_LOffset6 = -100.3;

  22. float DH_JAngle1 = 0;      // Joint Angle
  23. float DH_JAngle2 = 0;
  24. float DH_JAngle3 = -90;
  25. float DH_JAngle4 = 0;
  26. float DH_JAngle5 = 0;
  27. float DH_JAngle6 = 180;

  28. float J1Angle = 0;
  29. float J2Angle = 0;
  30. float J3Angle = 0;
  31. float J4Angle = 0;
  32. float J5Angle = 0;
  33. float J6Angle = 0;


  34. float deg2Rad(float deg)
  35. {
  36.     return (deg * M_PI) / 180.0f;
  37. }

  38. void inverseKine(float x, float y, float z, float rx, float ry, float rz)
  39. {
  40.     float poseX = x;
  41.     float poseY = y;
  42.     float poseZ = z;
  43.     float poseRx = rx;
  44.     float poseRy = ry;
  45.     float poseRz = rz;

  46.     float A0 = deg2Rad(DH_LTAngle1);
  47.     float A1 = deg2Rad(DH_LTAngle2);
  48.     float A2 = deg2Rad(DH_LTAngle3);
  49.     float A3 = deg2Rad(DH_LTAngle6);
  50.     float A4 = DH_LOffset1;
  51.     float A5 = DH_LOffset2;
  52.     float A6 = DH_LOffset4;
  53.     float A7 = DH_LOffset6;
  54.     float A8 = DH_LLength1;
  55.     float A9 = DH_LLength2;
  56.     float AA = DH_LLength3;


  57.     float XB0 =-(cosf(poseRz)*cosf(poseRx)-cosf(poseRy))*sinf(poseRz)*sinf(poseRx);
  58.     float YB0 =cosf(poseRx)*sinf(poseRz)+cosf(poseRz)*cosf(poseRy)*sinf(poseRx);
  59.     float ZB0 =sinf(poseRy)*sinf(poseRx);
  60.     float PX =poseX;
  61.     float XB1 =cosf(poseRy)*cosf(poseRx)*sinf(poseRz)+cosf(poseRz)*sinf(poseRx);
  62.     float YB1 =cosf(poseRz)*cosf(poseRy)*cosf(poseRx)-sinf(poseRz)*sinf(poseRx);
  63.     float ZB1 =cosf(poseRx)*sinf(poseRy);
  64.     float PY =poseY;
  65.     float XB2 =sinf(poseRz)*sinf(poseRy);
  66.     float YB2 =cosf(poseRz)*sinf(poseRy);
  67.     float ZB2 =-cosf(poseRy);
  68.     float PZ =poseZ;

  69.     float YC1 =- cosf(A3);
  70.     float ZC1 =sinf(A3);
  71.     float YC2 =sinf(A3);
  72.     float ZC2 =cosf(A3);
  73.     float C3 = -A7;

  74.     float XD1 =-XB0;
  75.     float YD1 =(YB0*YC1)+(ZB0*YC2);
  76.     float ZD1 =(YB0*ZC1)+(ZB0*ZC2);
  77.     float D1 =(ZB0*C3)+PX;
  78.     float XD2 =-XB1;
  79.     float YD2 =(YB1*YC1)+(ZB1*YC2);
  80.     float ZD2 =(YB1*ZC1)+(ZB1*ZC2);
  81.     float D2 =(ZB1*C3)+PY;
  82.     float XD3 =-XB2;
  83.     float YD3 =(YB2*YC1)+(ZB2*YC2);
  84.     float ZD3 =(YB2*ZC1)+(ZB2*ZC2);
  85.     float D3 =(ZB2*C3)+PZ;

  86.     float E1 = atan2f((D2), (D1));
  87.     float E2 = E1;

  88.     float F1 = sqrtf(powf(fabs(D2), 2)+powf(fabs(D1), 2));
  89.     float F2 = D3-A4;
  90.     float F3 = F1-A8;
  91.     float F4 = sqrtf(powf(F2, 2) + powf(F3, 2));
  92.     float F5 = sqrtf(powf(A6, 2) + powf(AA, 2));
  93.     float F6 = atan2f(F2, F3);
  94.     float F7 = acosf((powf(A9, 2)+powf(F4, 2)-powf(fabs(F5), 2)) / (2*A9*F4));

  95.     float G1 = 0;
  96.     if(!isinf(fabs(A6)/AA))
  97.     {
  98.         G1 = atan(fabs(A6)/AA);
  99.     }
  100.     else
  101.     {
  102.         G1 = M_PI_2;
  103.     }

  104.     float G2 = M_PI-acosf((powf(fabs(F5), 2)+powf(A9, 2)-powf(F4, 2))/(2*fabs(F5)*A9))+(M_PI_2-G1);
  105.     float G3 = -(F6+F7);
  106.     float G4 = G2;

  107.     float H1 = -F3;
  108.     float H2 = sqrtf(powf(F2, 2)+powf(H1, 2));
  109.     float H3 = acosf((powf(A9, 2)+powf(H2, 2)-powf(fabs(F5), 2))/(2*A9*H2));
  110.     float H4 = atan2f(H1, F2);
  111.     float H5 = M_PI-acosf((powf(fabs(F5), 2)+powf(A9, 2)-powf(H2, 2))/(2*fabs(F5)*A9))+(M_PI_2-G1);
  112.     float H6 = M_PI_2-(H3+H4);
  113.     float H7 = -M_PI+H6;
  114.     float H8 = H5;

  115.     float L1 = E2;
  116.     float L2 = 0, L3 = 0;
  117.                
  118.     if (F3<0)
  119.     {
  120.       L2 = H7;
  121.       L3 = H8;
  122.     }
  123.     else
  124.     {
  125.       L2 = G3;
  126.       L3 = G4;
  127.     }

  128.     float M1 =cosf(L2);
  129.     float M2 =-sinf(L2)*cosf(A1);
  130.     float M3 =sinf(L2)*sinf(A1);
  131.     float M4 =A9*cosf(L2);
  132.     float M5 =sinf(L2);
  133.     float M6 =cosf(L2)*cosf(A1);
  134.     float M7 =-cosf(L2)*sinf(A1);
  135.     float M8 =A9*sinf(L2);
  136.     float M9 = 0;
  137.     float MA =sinf(A1);
  138.     float MB =cosf(A1);
  139.     float MC =A5;
  140.     float MD = 0;
  141.     float ME = 0;
  142.     float MF = 0;
  143.     float M10 = 1;

  144.     float N0 =cosf((L3)-M_PI_2);
  145.     float N1 =-sinf((L3)-M_PI_2)*cosf(A2);
  146.     float N2 =sinf((L3)-M_PI_2)*sinf(A2);
  147.     float N3 =sinf((L3)-M_PI_2);
  148.     float N4 =cosf((L3)-M_PI_2)*cosf(A2);
  149.     float N5 =-cosf((L3)-M_PI_2)*sinf(A2);
  150.     float N6 =0;
  151.     float N7 =sinf(A2);
  152.     float N8 =cosf(A2);
  153.     float N9 =0;
  154.     float NA =0;
  155.     float NB =0;

  156.     float O1 =cosf(L1);
  157.     float O2 =-sinf(L1)*cosf(A0);
  158.     float O3 =sinf(L1)*sinf(A0);
  159.     float O4 =A8*cosf(L1);
  160.     float O5 =sinf(L1);
  161.     float O6 =cosf(L1)*cosf(A0);
  162.     float O7 =-cosf(L1)*sinf(A0);
  163.     float O8 =A8*sinf(L1);
  164.     float O9 =0;
  165.     float OA =sinf(A0);
  166.     float OB =cosf(A0);
  167.     float OC =A4;

  168.     float P1 =(O1*M1)+(O2*M5)+(O3*M9)+(O4*MD);
  169.     float P2 =(O1*M2)+(O2*M6)+(O3*MA)+(O4*ME);
  170.     float P3 =(O1*M3)+(O2*M7)+(O3*MB)+(O4*MF);
  171.     float P4 =(O1*M4)+(O2*M8)+(O3*MC)+(O4*M10);
  172.     float P5 =(O5*M1)+(O6*M5)+(O7*M9)+(O8*MD);
  173.     float P6 =(O5*M2)+(O6*M6)+(O7*MA)+(O8*ME);
  174.     float P7 =(O5*M3)+(O6*M7)+(O7*MB)+(O8*MF);
  175.     float P8 =(O5*M4)+(O6*M8)+(O7*MC)+(O8*M10);
  176.     float P9 =(O9*M1)+(OA*M5)+(OB*M9)+(OC*MD);
  177.     float PA =(O9*M2)+(OA*M6)+(OB*MA)+(OC*ME);
  178.     float PB =(O9*M3)+(OA*M7)+(OB*MB)+(OC*MF);
  179.     float PC =(O9*M4)+(OA*M8)+(OB*MC)+(OC*M10);

  180.     float Q1 =(P1*N0)+(P2*N3)+(P3*N6)+(P4*N9);
  181.     float Q2 =(P5*N0)+(P6*N3)+(P7*N6)+(P8*N9);
  182.     float Q3 =(P9*N0)+(PA*N3)+(PB*N6)+(PC*N9);
  183.     float Q4 =(P1*N1)+(P2*N4)+(P3*N7)+(P4*NA);
  184.     float Q5 =(P5*N1)+(P6*N4)+(P7*N7)+(P8*NA);
  185.     float Q6 =(P9*N1)+(PA*N4)+(PB*N7)+(PC*NA);
  186.     float Q7 =(P1*N2)+(P2*N5)+(P3*N8)+(P4*NB);
  187.     float Q8 =(P5*N2)+(P6*N5)+(P7*N8)+(P8*NB);
  188.     float Q9 =(P9*N2)+(PA*N5)+(PB*N8)+(PC*NB);

  189.     float R1 =(Q1*ZD1)+(Q2*ZD2)+(Q3*ZD3);
  190.     float R2 =(Q4*ZD1)+(Q5*ZD2)+(Q6*ZD3);
  191.     float R3 =(Q7*XD1)+(Q8*XD2)+(Q9*XD3);
  192.     float R4 =(Q7*YD1)+(Q8*YD2)+(Q9*YD3);
  193.     float R5 =(Q7*ZD1)+(Q8*ZD2)+(Q9*ZD3);

  194.     float R7 = atan2f(R2,R1);
  195.     float R8 = atan2f(+sqrtf(1-powf(R5, 2)),R5);
  196.     float R9 = 0;
  197.     if (R4 < 0)
  198.     {
  199.       R9 = atan2f(-R4,R3)-M_PI;
  200.     }
  201.     else
  202.     {
  203.       R9 = atan2f(-R4,R3)+M_PI;
  204.     }
  205.                
  206.     float S7 = atan2f(-R2,-R1);
  207.     float S8 = atan2f(-sqrtf(1-powf(R5, 2)),R5);
  208.     float S9 = 0;
  209.     if (R4 < 0)
  210.       S9 = atan2f(R4,-R3)+M_PI;
  211.     else
  212.       S9 = atan2f(R4,-R3)-M_PI;
  213.     float L5 = 0;
  214.     if (1) // front config
  215.       L5 = R8;
  216.     else
  217.       L5 = S8;

  218.     float L4 = 0;
  219.     if(L5>0)
  220.     {
  221.       L4 = R7;
  222.     }
  223.     else
  224.     {
  225.       L4 = S7;
  226.     }

  227.     float L6 = 0;
  228.     if(L5<0)
  229.       L6 = S9;
  230.     else
  231.       L6 = R9;

  232.     J1Angle = L1;
  233.     J2Angle = -M_PI_2-L2;
  234.     J3Angle = M_PI_2-L3;
  235.     J4Angle = L4;
  236.     J5Angle = L5;
  237.     J6Angle = -L6;
  238. }
复制代码

出0入63汤圆

25
 楼主| 发表于 2023-7-24 00:27:32 | 只看该作者
本帖最后由 n_cell 于 2023-7-24 00:46 编辑

本算法基于DH参数模型,配置好关节参数即可正常使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入63汤圆

26
 楼主| 发表于 2023-7-24 00:45:32 | 只看该作者
类似下图的库卡机器人,只需要按下图所示修改对应的关节参数即可

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入63汤圆

27
 楼主| 发表于 2023-7-24 10:57:24 | 只看该作者
说明一下:inverseKine(float x, float y, float z, float rx, float ry, float rz)

其中x y z 为机械臂末端坐标,单位mm,rx ry rz为末端姿态绕各轴的旋转角度,单为rad

各关节角度JxAngle返回值单位为rad

出0入0汤圆

28
发表于 2023-8-8 10:02:40 | 只看该作者
今日打卡,我有个3D打印的五轴,都吃灰四五年了,/笑哭

出0入0汤圆

29
发表于 2023-8-8 21:12:41 | 只看该作者
非常支持,有空会测试一下楼主的代码

出0入90汤圆

30
发表于 2023-8-8 22:14:49 | 只看该作者
老兄,你这个开源是闷不做声的啊,刷新到了才发现已经开源了

出0入63汤圆

31
 楼主| 发表于 2023-8-9 02:08:36 | 只看该作者
honami520 发表于 2023-8-8 22:14
老兄,你这个开源是闷不做声的啊,刷新到了才发现已经开源了
(引用自30楼)

标题无法编辑了

出0入0汤圆

32
发表于 2023-8-9 08:56:05 | 只看该作者
支持lz开源精神

出0入0汤圆

33
发表于 2023-8-9 08:58:08 | 只看该作者
佩服楼主的开源精神   跟着学习学习

出0入0汤圆

34
发表于 2023-9-4 23:04:30 来自手机 | 只看该作者
跟着学习学习

出330入1925汤圆

35
发表于 2023-9-4 23:30:00 | 只看该作者
nice      
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-16 13:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表