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

2024-01-29 11:28

本文主要是介绍9_机械臂运动学_正解C++推导验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.前置知识

1.1  D-H矩阵表达式(改进型)

相邻连杆间坐标系变换通式:

R = Rot  T = Trans

i-1iT = Rx(αi-1)Tx(ai-1)Rz(θi)Tz(di)                         (9-1)

i-1iT = Screwx(ai-1, αi-1 )Screwz(di, θi)

ScrewQ(r, φ)代表沿Q轴平移r,再绕Q轴旋转角度φ的组合变换。由矩阵连乘计算表达式(9-1)得i-1iT的一般表达式为:

1ac693adfe01dba38ff7ab0dd23e1436.jpeg

1.2 连续的连杆变换

如果已经定义了连杆坐标系和相应的连杆参数,就可以直接建立运动学方程。分别计算出各个连杆变换矩阵就能得出各个连杆参数的值。把这些连杆变换矩阵连乘就能得到一个坐标系{N}相对于坐标系{0}的变换矩阵:

0NT = 01T12T23T...N-1NT

变换矩阵0NT是关于n个关节变量的函数。如果能得到机器人各个关节位置传感器的值,机器人末端连杆在笛卡尔坐标系里的位置和姿态就能通过0NT计算出来。

1.3 使用C++ Eigen库验证遨博机械臂

/* D-H参数表 */    
double a[6] = {0.0, 0.0, 408.0, 376.0, 0.0, 0.0};
double al[6] = {0.0, -M_PI/2, M_PI, M_PI, -M_PI/2, M_PI/2};
double d[6] = {98.50, 121.50, 0.0, 0.0, 102.50, 94.0};
//各关节角度,单位弧度double th[6] = {0.0, 0.0, 0.0, 0.0,0.0, 0.0,};cos(th[i]),            -sin(th[i]),               0.0,          a[i],
sin(th[i])*cos(al[i]),  cos(th[i])*cos(al[i]),  -sin(al[i]),  -sin(al[i])*d[i],
sin(th[i])*sin(al[i]),  cos(th[i])*sin(al[i]),   cos(al[i]),   cos(al[i])*d[i],
0.0,  0.0,   0.0,   1.0;
for(int i=0; i<6; i++){
Eigen::Matrix4d tmp;
tmp <<  cos(th[i]),         -sin(th[i]),             0.0,           a[i],sin(th[i])*cos(al[i]),  cos(th[i])*cos(al[i]),  -sin(al[i]),  -sin(al[i])*d[i],sin(th[i])*sin(al[i]),  cos(th[i])*sin(al[i]),   cos(al[i]),  cos(al[i])*d[i],0.0,  0.0,   0.0, 1.0;T = tmp;if(0 == i) T06 = tmp;elseT06 = LastT*T;LastT = T06;}

程序结果:

c88af76ed5bb14cceeedd32f27451e6d.jpeg

显然和遨博机械臂对不上,不过这个数值和之前matlab仿真的结果是一致的。所以需要加上offset调整一下。

 double offset[6] = {M_PI, -M_PI/2, 0.0, -M_PI/2, 0.0, 0.0};

double th[6] = {offset[0], offset[1], 0.0, offset[3], 0.0, 0.0};    

7732536d6ddcfcecc1c168f336bf60be.jpeg

验证角度为30度,并打印姿态:

double th[6] = {M_PI/6+offset[0], M_PI/6+offset[1], M_PI/6, M_PI/6+offset[3], M_PI/6, M_PI/6};

2d81cf2db1e1c34a6b7ce5ea0ceba250.jpeg

9d6f0430c00daa819229b11a4659dbd3.jpeg

 结果是正确的。

 预计年前还有3篇笔记用来记录机械臂运动学6~8之间的学习记录。大概分别是刚体的转动、刚体空间转动的其他表示、齐次变换与D-H矩阵。   

      需要完整C++验证程序可在公众号后台留言:机械臂C++正解验证。 

c39de9fa988f649333b6c6aa6016ad72.png

机械臂其他相关笔记:

机械臂运动学正解验证

Matlab机械臂运动学示教演示

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

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

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

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

这篇关于9_机械臂运动学_正解C++推导验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656749

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支