10_机械臂运动学_机械臂C++逆解——2023

就是算!

遨博机械臂改进DH参数表:

b3f670aacd0b66d7e5f8da4915cc13dc.png

机械臂正运动学连杆变换通式:

其中si代表sin(θi),ci代表cos(θi)

sij代表sin(θi-θj),cij代表cos(θi-θj)

sijk代表sin(θi-θj+θk),cijk代表cos(θi-θj-+θk),用两角和差公式直接展开即可.

8727a31a2848b10a990556fd3e20aa00.jpeg

每一个连杆变换矩阵:

8fdbfc27b0988c3fe14926ffa7d36dac.jpeg

91241f1229c5c1dea1ad05ab32c189ad.jpeg

7a0e89dddbcfb6f43e91d0625fcd30e3.jpeg

06T中第四列的前三行数据就是机器人末端连杆在笛卡儿坐标系里的位置参数,前面3*3矩阵表示姿态。

则:f6c9bdd227920efe9bcf829b45961a71.jpeg

矩阵关系式构建按照《机器人学导论》中的流程:

0618a0bc004b5a0cd1205afd5e2bbb47.jpeg

18d6b95b1613d954aaa84b40685785e7.jpeg

8a93af7e04a356e053e4419588028d7e.jpeg

533e040700fbb2b7c8a1922f192af57f.jpeg

因为关节2和关节3通常是平行的,所以和的乘积用二角和差公式将得到一个简化的表达式。只要两个旋转关节轴平行就可以这样处理,则:

2a31754fce970b0541f457e5c4a0b5a5.jpeg

则:

608c06cc1e8b87d3951b960f1a299441.jpeg

b211ce47900f6c7ecea22b40cfd0ebfd.jpeg

       上式构成了aubo机械臂的运动学方程。它们说明如何计算机器人坐标系{6}相对于坐标系{0}的位姿。上述方程式是aubo机械臂全部运动学分析的基本方程。

计算前公式准备:

-As1 + Bc1 = C                                                                         (3)

解该类型方程通常用三角换元,即:

A =ρcosφ

B =ρsinφ

Φ = atan2(B,A )

则:

d8586bd5a557fab9da2d887ee1e11c4d.jpeg

注意,该式有两个解。

sinθ = A

cosθ = B

则:

θ = atan2(A, B)                                                                          (5)

上述准备工作完成后,下面就是解方程计算,体力活,没啥技巧。

求解θ1:

根据(1)第二行第四列与r24相等,则:

-s1px + c1py = c5d6 + d2

根据(2),c5=r23,

c5 = -s1ax + c1ay,消去c5,

-(px - axd6)s1 + (py - d6ay) = d2                                              (6)

A = px - axd6

B = py - d6ay

C = d2

再根据(3),直接使用(4),则θ1可解且有两种可能。

求解θ5:

根据(1)第二行第三列与r23相等,则:

-s1ax + c1ay = c5

则:

537c7b3dd616d52b86262477678325c4.jpeg

带入公式(5),则:

θ5也有两个解,此时有4组理论解了。

求解θ6:

根据(1)第二行第一列与r21相等,则:

-s1nx + c1ny = -s5c6

根据(1)第二行第二列与r31相等,则:

-s1ox + c1oy = s5s6

由于s1c1s5已知,根据公式(5)则θ6可求.

求θ6时,带入对应的θ1θ5,不会产生新解。

求解θ234:

根据(1)第一行第三列与r13相等,则:

-s1ax + c1ay = c234s5

根据(1)第三行第三列与r33相等,则:

az = -s234s5

根据公式(5),可得θ234整体值。

注意,该值为计算理论值,但并非电机所转动的角度,即并不是示教器所显示的当前关节角。

求解θ2:

根据(1)第一行第四列与r14相等,则:

c1px + s1py = c234s5d6 - s234d5 + c23a3 + c2a2                     (7)

根据(1)第三行第四列与r34相等,则:

pz - d1 = -s234s5d6 -c234d5 - s23a3 -s2a2                                (8)

A = c234s5d6 - s234d5 + c23a3 + c2a2

B = -s234s5d6 -c234d5

C = c1px + s1py

D = pz - d1

则,(7) (8)化简为:

C = A + c23a3 + c2a2

D = B - s23a3 - s2a2

则:

c23a3 = C - A -c2a2

s23a3 = B - D -s2a2

M = C - A

N = B - D

则:

s23 = (N - s2a2)/a3                                                                 (9)

c23 = (M-c2a2)/a3                                                                  (10) 

将上述等式化简整理,得

-(-2Na2)s2 + 2Ma2c2 = M*M + N*N + a2*a2 - a3*a3              (11)

再令:

E= -2Na2

F= 2Ma2

G = M*M + N*N + a2*a2 - a3*a3

则根据公式(4),解得θ2.会有两种可能.故理论上2*2*2八组解。

根据(9)(10)与公式(5),得θ23值

则,根据θ234

θ4 = θ234 - θ23

θ3 = θ23 - θ2

不产生额外解。

部分验证程序如下:

//    Target <<  -0.687943   0.724766  0.0380584     214.3
//               0.725342    0.688386  0.00196604   -138.937
//              -0.0247739    0.0289579  -0.999274    200.473
//                      0          0          0          1;double px= 214.3;double py= -138.937;double pz= 200.473;double ax =  0.0380584;double ay = 0.00196604;double az = -0.999274;double ox = 0.724766;double oy = 0.688386;double nx = -0.687943;double ny = 0.725342;//get θ1//1 T01^-1//-s1*px + c1*py = c5*d6 + d2//c5 = -s1*ax + c1*ay//-(d6*ax + px)s1 + (py - d6*ay) = d2//-As1 + Bc1 = C//θ  =  atan2(B,A) - atan2(C, ±sqrt(A*A + B*B - C*C))double th1=0.0;double d1 = 98.50;double d2 = 121.50;double d5 = 102.50;double d6 = 94.0;double a2= 408.0;double a3= 376.0;double A = px - d6*ax;double B = py - d6*ay;double tmp1 = A*A + B*B - d2*d2;double tmp = sqrt(tmp1);//get θ1th1 = std::atan2(B,A) - std::atan2(d2, -tmp);std::cout << "joint1 ori: >>> " << ((th1)*ARC_TO_DEG) << std::endl;std::cout << "joint1 >>> " << ((th1 + M_PI)*ARC_TO_DEG) << std::endl;//get θ5double th5=0.0;tmp = -sin(th1)*ax + cos(th1)*ay;th5 = std::atan2(-sqrt(1-tmp*tmp), tmp);std::cout << "joint5 >>> " << (th5)*ARC_TO_DEG << std::endl;//get θ6double th6=0.0;th6 = std::atan2((-sin(th1)*ox + cos(th1)*oy)/sin(th5),(sin(th1)*nx - cos(th1)*ny)/sin(th5));std::cout << "joint6 >>> " << (th6)*ARC_TO_DEG << std::endl;//get θ2-θ3+θ4 ===============double th234=0.0;tmp = (cos(th1)*ax+sin(th1)*ay)/sin(th5);tmp1 = -(az/sin(th5));th234 = std::atan2(tmp1, tmp);  //-?std::cout << "joint234 sum : >>> " << (th234)*ARC_TO_DEG << std::endl;A =  cos(th234)*sin(th5)*d6 - sin(th234)*d5;B = -sin(th234)*sin(th5)*d6 - cos(th234)*d5;    // shao d6double C = cos(th1)*px + sin(th1)*py;double D = pz -d1;double M = C - A;double N = B - D;double E = -2*N*a2;double F = 2*M*a2;double G = M*M + N*N +a2*a2 -a3*a3;double th2 = 0.0;th2 = std::atan2(F,E) - std::atan2(G, sqrt(E*E+F*F-G*G));std::cout << "joint2 ori: >>> " << ((th2)*ARC_TO_DEG) << std::endl;std::cout << "joint2 >>> " << ((th2+M_PI/2)*ARC_TO_DEG) << std::endl;//    th2 = std::atan2(F,E) - std::atan2(G, -sqrt(E*E+F*F-G*G));
//    std::cout << "another joint2 ori: >>> " << ((th2)*ARC_TO_DEG) << std::endl;
//    std::cout << "another joint2 >>> " << ((th2-M_PI/2)*ARC_TO_DEG) << std::endl;double th2_3 = 0.0;th2_3 = std::atan2((N-sin(th2)*a2)/a3, (M-cos(th2)*a2)/a3);double th3 = 0.0;double th4 = 0.0;th3 = -(th2_3 -th2);th4 = th234 - th2_3 ;std::cout << "joint3 ori: >>>: >>> " << ((th3)*ARC_TO_DEG) << std::endl;std::cout << "joint4 ori:>>> " << ((th4)*ARC_TO_DEG) << std::endl;std::cout << "joint3 >>>: >>> " << ((th3+2*M_PI)*ARC_TO_DEG) << std::endl;std::cout << "joint4 >>> " << ((th4+M_PI/2)*ARC_TO_DEG) << std::endl;

关注公众公众号,后台留言“C++逆解验证”获取完整程序!

0e5c4da321405a8fb662b3bf8558114e.png

往期机械臂系列精彩回顾:

机械臂运动学正解验证

Matlab机械臂运动学示教演示

机械臂运动学D-H参数学习笔记(2)

3_机械臂运动学之刚体的运动

4_机械臂运动学基础向量空间

5_机械臂运动学基础_矩阵

6_机械臂运动学_刚体转动的描述

9_机械臂运动学_正解C++推导验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/453575.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Linux 进程控制(二)] 写时拷贝 - 进程终止

文章目录 1、写时拷贝2、进程终止2.1 进程退出场景2.1.1 退出码2.1.2 错误码错误码 vs 退出码2.1.3 代码异常终止引入 2.2 进程常见退出方法2.2.1 exit函数2.2.2 _exit函数 本片我们主要来讲进程控制&#xff0c;讲之前我们先把写时拷贝理清&#xff0c;然后再开始讲进程控制。…

前端文艺复兴:Vue3真的需要Pinia吗?

前言 说起Pinia&#xff0c;熟悉 vue3 开发的程序员肯定不会陌生&#xff0c;甚至被vue官方推荐取代vuex&#xff0c;成为vue全家桶之一。 疑惑 还记得之前用 vuex 时&#xff0c;更改 state 还分同步和异步&#xff08;这里有尤雨溪的回答www.zhihu.com/question/48… &…

【TCP/IP】用户访问一个购物网站时TCP/IP五层参考模型中每一层的功能

当用户访问一个购物网站时&#xff0c;网络上的每一层都会涉及不同的协议&#xff0c;具体网络模型如下图所示。 以下是每个网络层及其相关的协议示例&#xff1a; 物理层&#xff1a;负责将比特流传输到物理媒介上&#xff0c;例如电缆或无线信号。所以在物理层&#xff0c;可…

创建TextMeshPro字体文件

相比于Unity的Text组件&#xff0c;TextMesh Pro提供了更强大的文本格式和布局控制&#xff0c;更高级的文本渲染技术&#xff0c;更灵活的文本样式和纹理支持&#xff0c;更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…

docker更换镜像源

添加的镜像源 {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com", "https://reg-mirror.qiniu.com/", "https://docker.mirrors.ustc.edu.cn"] }docker更换镜像源之后一定要重启守卫 systemctl daemon-reloaddock…

微服务的幂等性

微服务架构设计的中心思想是将服务进行拆分&#xff0c;但是在这个过程中&#xff0c;如果被依赖的服务发生奔溃&#xff0c;就会引起一系列问题。为了解决这个问题&#xff0c;就会引入重试的机制&#xff0c;重试又会引入幂等性的问题&#xff0c;下面我们就分析这个过程&…

【Linux】 信号的保存 | 捕捉

对于信号&#xff0c;主要涉及到信号的产生、保存和捕获&#xff0c;之前谈到了信号的产生&#xff0c;这里主要介绍信号产生后如何进行保存和捕捉处理的原理。 一、信号的保存 1.阻塞信号 相关概念 实际执行处理信号的动作称为信号递达Delivery信号从产生到递达的过程称为信号…

golang并发安全-sync.Once

什么是sync.Once sync.Once 是 Go 语言中的一种同步原语&#xff0c;用于确保某个操作或函数在并发环境下只被执行一次。它只有一个导出的方法&#xff0c;即 Do&#xff0c;该方法接收一个函数参数。在 Do 方法被调用后&#xff0c;该函数将被执行&#xff0c;而且只会执行一…

计算机网络-差错控制(奇偶校验码 CRC循环冗余码)

文章目录 差错从何而来从传感器层面提高信道比来减少线路本身的随机噪声的一个例子热噪声和冲击噪声 数据链路层的差错控制检错编码-奇偶校验码检错编码-CRC循环冗余码例子注意 差错从何而来 噪声通常指的是任何未预期的、随机的信号干扰&#xff0c;这些干扰可能源自多种物理…

C++项目 -- 高并发内存池(二)Thread Cache

C项目 – 高并发内存池&#xff08;二&#xff09;Thread Cache 文章目录 C项目 -- 高并发内存池&#xff08;二&#xff09;Thread Cache一、高并发内存池整体框架设计二、thread cache设计1.整体设计2.thread cache哈希桶映射规则3.TLS无锁访问4.thread cache代码 一、高并发…

Log360,引入全新安全与风险管理功能,助力企业积极抵御网络威胁

ManageEngine在其SIEM解决方案中推出了安全与风险管理新功能&#xff0c;企业现在能够更主动地减轻内部攻击和防范入侵。 SIEM 这项新功能为Log360引入了安全与风险管理仪表板&#xff0c;Log360是ManageEngine的统一安全信息与事件管理&#xff08;SIEM&#xff09;解决方案…

51单片机之LED灯模块篇

御风以翔 破浪以飏 &#x1f3a5;个人主页 &#x1f525;个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…