python机器人编程——用pytorch实现六轴机械臂的正向和逆向数值解算,及python算法解析

news2024/11/19 0:34:20

目录

  • 一、前言
  • 二、实现原理
    • 2.1正向建模
    • 2.2张量化
    • 2.3绘制3D动画及操作UI
  • 三、结论
  • 四、python源码
  • PS.扩展阅读
    • ps1.六自由度机器人相关文章资源
    • ps2.四轴机器相关文章资源
    • ps3.移动小车相关文章资源

一、前言

前面对六轴(或多轴)机械臂进行了一些研究,特别是利用几何进行简化,实现逆解,来完成比较简单的搬用任务。然而,如果需要比较精确的操作任务,可能需要更加复杂的机械臂解算。其中比较复杂的是数值解算,这种解算往往涉及到比较复杂的机器人运动等原理知识,比较难以上手。但是,python的生态挺全面,已经有很多牛人实现了数值解法,但是去看他们的代码,还是觉得费劲。此外,随着深度神经网络的兴起,很多是用建立深度学习神经网络,去利用机械臂输入输出的大数据,训练机械臂的控制模型,这个上手也比较慢。现在,我们提供一个相对简单的方法,来实现N轴机械臂的数值逆解,我们使用了一个优秀的人工智能库pytorch,只要在建立正向模型的基础上,几行代码就可以实现机械臂的数值逆解,可以供初学者学习之用。

在这里插入图片描述
在这里插入图片描述

二、实现原理

2.1正向建模

数值解算本质就是解非线性方程组。前提是我们需要把这个方程组給先建立起来。这里需要用到一些DH建模的知识。此部分已经在博文《N轴机械臂的MDH正向建模,及python算法》做了非常细致的讲解,本文不再赘述。
在这里插入图片描述
通过运算,我们可以把下图的机械臂建立一个模型,
在这里插入图片描述
所谓正向模型即f(t1,t2,t3,t4,t5,t6),就是输入6个电机的旋转角度,可以得出末端的位姿,这里可以用位姿矩阵表示,也可以用四元素等其它表示。我们根据机械臂实际的尺寸,推导出的正向模型,非常复杂,如下:
在这里插入图片描述
这个明显是有一堆sin,cos组合的非线性矩阵。如果人去推导,估计得推导10年。

2.2张量化

金典得非线性方程组解法,可以用迭代法,牛顿,雅可比等。对于数学知识有限的初学者,我们没有那么多时间。我们使用了简单粗暴的玩法,那就是交给pytorch的反向传播,来让它帮我们寻找正确的6个角求解调整方向,并逐步逼近“真相”。

# 优化器
    optimizer = torch.optim.Adam([t1,t2,t3,t4,t5,t6], lr=lr)
    
    # 进行优化
    for epoch in range(interval):    
        optimizer.zero_grad()
        loss = loss_function(t1,t2,t3,t4,t5,t6)
        loss.backward()
        optimizer.step()
        if epoch%100==0:
            print(f'Epoch {epoch}, Loss {loss.item()}')
        if loss.item()<maxerror:
            print("minloss:",loss.item())
            break

如上所述,只要几行代码就可以进行解算了。
经过运行,解算出的结果还是可以的,如果小幅的运动,误差会非常小。

minloss: 0.0009870927315205336
dx,dy,dz error: Matrix([[-0.0145334085096351], [-0.00555758762822034], [-0.0203845457565990]

在这里插入图片描述
如上图,第一个状态时正解的,第二个状态时逆解后计算出的末端6个状态,相差不是很大。
这里我们的lossfunciton是用了六个自由度的方差。
pytorch中我们要把未知数都转化成张量,并且可以梯度,才能优化求解。

t1 = torch.tensor([j1],requires_grad=True, dtype=torch.float32,device=device)
    t2 = torch.tensor([j2],requires_grad=True, dtype=torch.float32,device=device)
    t3= torch.tensor([j3],requires_grad=True, dtype=torch.float32,device=device)
    t4 = torch.tensor([j4],requires_grad=True, dtype=torch.float32,device=device)
    t5 = torch.tensor([j5],requires_grad=True, dtype=torch.float32,device=device)
    t6 = torch.tensor([j6],requires_grad=True, dtype=torch.float32,device=device)

    

2.3绘制3D动画及操作UI

为了直观感受机械臂的状态,和调试,我们还是增加了3D的手臂动态绘制功能,和滑动条状态显示功能:
在这里插入图片描述

三、结论

本篇利用了一个人工智能库工具pytorch的强大的梯度下降寻优机制,对复杂的N轴机械臂解算进行了求解,这种方法不需要太高深的数学知识,适合初学者学习使用。此种办法也有缺点,那就是计算较慢,这块需要后续优化,比如使用更先进的CPU和GPU,比如先估计一个比较靠谱的初值,比如简化一下模型等,我们后面再继续探讨。

四、python源码

配套资源已经上传:源码链接

[------------本篇完--------------------------]

PS.扩展阅读

————————————————————————————————————————

对于python机器人编程感兴趣的小伙伴,可以进入如下链接阅读相关咨询

ps1.六自由度机器人相关文章资源

(1) 对六自由度机械臂的运动控制及python实现(附源码)
在这里插入图片描述

(2) N轴机械臂的MDH正向建模,及python算法
在这里插入图片描述

ps2.四轴机器相关文章资源

(1) 文章:python机器人编程——用python实现一个写字机器人
在这里插入图片描述

在这里插入图片描述

(2)python机器人实战——0到1创建一个自动是色块机器人项目-CSDN直播

(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(4)实现了语音输入+大模型指令解析+机器视觉+机械臂流程打通
在这里插入图片描述
在这里插入图片描述

ps3.移动小车相关文章资源

(1)python做了一个极简的栅格地图行走机器人,到底能干啥?[第五弹]——解锁蒙特卡洛定位功能-CSDN博客
(2) 对应python资源:源码地址
在这里插入图片描述
在这里插入图片描述

(3)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(上篇)_agv编程-CSDN博客
(4)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)_agv路线规划原则python-CSDN博客
对应python及仿真环境资源:源码链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SCI一区级 | Matlab实现BO-Transformer-LSTM时间序列预测

SCI一区级 | Matlab实现BO-Transformer-LSTM时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-LSTM时间序列预测效果一览基本介绍![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/caef5d232c4b436ebb01d717819d5ff1.png)程序设计参考资料 效果一览 基本介绍…

C语言的数据结构:图的基本概念

前言 之前学过了其它的数据结构&#xff0c;如&#xff1a; 集合 \color{#5ecffd}集合 集合 —— 数据元素属于一个集合。 线型结构 \color{#5ecffd}线型结构 线型结构 —— 一个对一个&#xff0c;如线性表、栈、队列&#xff0c;每一个节点和其它节点之间的关系 一个对一个…

【Linux】生物信息学常用命令

参考资料来自生信技能树 先输入echo export PS1"[\033]2;\h:\u \w\007\033[33;1m]\u \033[35;1m\t\033[0m [\033[36;1m]\w[\033[0m]\n[\e[32;1m]$ [\e[0m]" >> ~/.bashrc 再输入source ~/.bashrc就能够让命令字体带上颜色&#xff0c;同时命令将会在下一行开…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法&#xff0c;解析spark参数&#xff0c;调用submit方法 3.在submit方法里调用doRunMain方法&#xff0c;最终调用r…

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索 1、视频广场1.1、搜索筛选1.2、状态记录1.3、播放1.4、视频信息1.5、回放入口 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、视频广场 1.1、搜索筛选 可以下拉筛选 在线、离线 &a…

小红书 达芬奇:生活问答 AI 机器人

小红书去年 9 月开始内测的生活问答 AI 机器人&#xff1a;达芬奇&#xff0c;现在可以在小红书 APP 上用了 得益于小红书平台的特性&#xff0c;该助手擅长吃、住、宠、喝、学等等各类生活知识&#xff0c;目前还在搞活动&#xff0c;写评测笔记最高得 666 元

《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

LinkedList底层原理

LinkedList特有方法 源码分析

Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践 1、缓存预热 1.1、描述 提前将热点数据加载到缓存&#xff0c;提前响应&#xff0c;降低后端数据源访问压力 1.2、实践 Autowiredprivate R…

Python基础002

Python数据类型 1、字符串&#xff08;str&#xff09; str3 """I miss you so much""" print("str3 ", str3,type(str3)) str3 I miss you so much <class str>2、整数&#xff08;int&#xff09; str1 55 print(&quo…

什么是定时器?

前言&#x1f440;~ 上一章我们介绍了阻塞队列以及生产者消息模式&#xff0c;今天我们来讲讲定时器 定时器 标准库中的定时器 schedule()方法 扫描线程 手动实现定时器 任务类 存储任务的数据结构 定时器类 如果各位对文章的内容感兴趣的话&#xff0c;请点点小赞&am…

【postgresql】数据库操作

创建数据库 使用 CREATE DATABASE SQL 语句来创建 语法&#xff1a; CREATE DATABASE dbname; 使用 createdb 命令来创建 语法&#xff1a; createdb [option...] [dbname [description]] 参数说明&#xff1a; dbname&#xff1a;要创建的数据库名。 description&…

手机电脑能实现无缝共享的记事软件是什么

在这个信息爆炸的时代&#xff0c;记事软件已成为我们日常生活中不可或缺的工具。然而&#xff0c;我曾深深困扰于手机与电脑之间记事内容无法无缝共享的问题。 记得有一次&#xff0c;我在手机上匆匆记下了一个重要的想法&#xff0c;打算稍后在电脑上展开。但当我坐在电脑前…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…

C语言的数据结构:图的操作

&#x1f6fa;图的遍历&#xff1a; 注意&#xff1a;在遍历的过程中&#xff0c;可能会出现 回路 ( 已经访问过的节点还要重新访问一次 ) \color{orange}回路(已经访问过的节点还要重新访问一次) 回路(已经访问过的节点还要重新访问一次). 当从A开始访问时&#xff0c;先访问…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

秒懂设计模式--学习笔记(4)【创建篇-工厂方法模式】

目录 3、工厂方法模式3.1 介绍3.2 工厂的多元化与专业化3.3 游戏角色建模(建模)3.4 简单工厂不简单(实例化、初始化)3.5 制定工业制造标准3.6劳动分工 3、工厂方法模式 3.1 介绍 程序设计中的工厂类往往是对对象构造、实例化、初始化过程的封装&#xff0c;而工厂方法&#x…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨

目录 Python 库及 MindSpore 相关模块和类的导入 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 Python 库及 MindSpore 相关模块和类的导入 Python 中的 numpy 库被成功导入&#xff0c;并简称为 np。numpy 在科学计算领域应用广泛&#x…

借教室(题解)

P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;二分前缀和 我们将和质检员那题差不多&#xff0c;只需要将候选人二分即可 #include<bits/stdc.h> using namespace std; #define int long long int n,m; int r[100000…