机器人学导论P115求雅可比矩阵python实现

代码如下:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from numpy import sin
from numpy import cos
plt.rcParams["font.sans-serif"]=["SimHei"]            #设置字体
plt.rcParams["axes.unicode_minus"]=False              #该语句解决图像中的“-”负号的乱码问题
sns.set_style('whitegrid', {'font.sans-serif': ['simhei', 'Arial']})
sns.set(rc={"axes.facecolor":"#FFF9ED","figure.facecolor":"#FFF9ED", 'font.sans-serif': ['simhei', 'Arial']})   # 对整个文件配置生效,不单单对一个图形!# 将角度值数据转换为弧度制
def d_to_r(degree):"""将角度值数据转换为弧度制  公式:弧度= (角度×π)/180:param degree::return:"""radian = degree * np.pi / 180  # 将角度转换为弧度return radiandef abtain_J_orig(L1, L2, L3, theta_1, theta_2, theta_3):"""根据提供的参数求初始时(即第一次循环)的雅可比矩阵abtain_theta_der(4, 3, 2, 10, 20, 30):return:J, theta_old"""# 将输入的角度值的theta_1, theta_2, theta_3转化为弧度制theta_1 = d_to_r(theta_1)theta_2 = d_to_r(theta_2)theta_3 = d_to_r(theta_3)# 定义雅可比矩阵   shape:3x3J = np.array([[-L1*sin(theta_1)-L2*sin(theta_1+theta_2)-L3*sin(theta_1+theta_2+theta_3), -L2*sin(theta_1+theta_2)-L3*sin(theta_1+theta_2+theta_3), -L3*sin(theta_1+theta_2+theta_3)],[L1*cos(theta_1)+L2*cos(theta_1+theta_2)+L3*cos(theta_1+theta_2+theta_3), L2*cos(theta_1+theta_2)+L3*cos(theta_1+theta_2+theta_3), L3*cos(theta_1+theta_2+theta_3)],[1, 1, 1]])# 定义theta_oldtheta_old = np.array([theta_1, theta_2, theta_3]).Treturn J, theta_olddef abtain_J(L1, L2, L3, theta_array):"""根据提供的参数求第2次到第n次循环时的雅可比矩阵abtain_theta_der(4, 3, 2, 10, 20, 30):return:J, theta_old"""# 把theta_array拆包为theta_1, theta_2, theta_3theta_1 = theta_array[0]theta_2 = theta_array[1]theta_3 = theta_array[2]# 定义雅可比矩阵   shape:3x3J = np.array([[-L1*sin(theta_1)-L2*sin(theta_1+theta_2)-L3*sin(theta_1+theta_2+theta_3), -L2*sin(theta_1+theta_2)-L3*sin(theta_1+theta_2+theta_3), -L3*sin(theta_1+theta_2+theta_3)],[L1*cos(theta_1)+L2*cos(theta_1+theta_2)+L3*cos(theta_1+theta_2+theta_3), L2*cos(theta_1+theta_2)+L3*cos(theta_1+theta_2+theta_3), L3*cos(theta_1+theta_2+theta_3)],[1, 1, 1]])# 定义theta_oldtheta_old = np.array([theta_1, theta_2, theta_3]).Treturn J, theta_olddef abtain_theta_der(J):"""根据提供的参数求关节速率theta_derabtain_theta_der(4, 3, 2, 10, 20, 30):return:"""# 定义笛卡尔速度Cartesian velocityCar_vel = np.array([0.2, -0.3, -0.2]).T# 求雅可比矩阵的逆矩阵J_inv = np.linalg.inv(J)# 求关节速率  theta_derivative  即theta求导theta_der = np.dot(J_inv, Car_vel)   # 执行矩阵相乘# print("theta_der:", theta_der)# 返回关节速率theta_derreturn theta_derdef abtain_theta_new(theta_old, theta_der):"""计算求出theta_new:param theta_old::param theta_der::return:"""# 定义delta_t的值   "delta"(希腊字母 Δ)delta_t = 0.1# 计算新的thetatheta_new = theta_old + theta_der*delta_t# print("theta_new:",theta_new)return theta_newdef run():"""执行:return:"""# 定义循环次数loop_num = 50# 定义第一次循环时的参数L1 = 4L2 = 3L3 = 2theta1_orig = 10theta2_orig = 20theta3_orig = 30# 求第一次循环时的雅可比矩阵J,并返回theta_oldJ, theta_old = abtain_J_orig(L1, L2, L3, theta1_orig, theta2_orig, theta3_orig)print("初始时的J(雅可比矩阵):\n", J)# 定义所有关节角数组theta_all = theta_old.reshape((1,3))# 求第一次循环时的关节速率theta_dertheta_der = abtain_theta_der(J)# 定义所有关节速率数组theta_der_all = theta_der.reshape((1,3))# 求第一次循环时的theta_newtheta_new = abtain_theta_new(theta_old, theta_der)# 循环第2次到第n次for i in range(loop_num-1):  # 循环次数需减去初始时的一次计算J, theta_old = abtain_J(L1, L2, L3, theta_new)print(f"执行了{i+1}次循环后的J(雅可比矩阵):\n", J)theta_der = abtain_theta_der(J)# 把关节角数组拼接到所有关节角数组theta_all = np.concatenate((theta_all, theta_new.reshape((1, 3))))theta_new = abtain_theta_new(theta_old, theta_der)# 将关节速率数组拼接到所有关节速率数组theta_der_all = np.concatenate((theta_der_all, theta_der.reshape((1,3))))print(theta_der_all)return theta_der_all,theta_alldef plot():"""画图画图可用三个库实现:matplotlib、seaborn、plotly。用哪个就需要安装对应的库。:return:"""# 拆包run函数返回的两个数组theta_der_all, theta_all = run()# print("打印输入50个周期内的关节速率:\n", theta_der_all)# print(theta_der_all.shape)# 从theta_der_all数组中取出单独的每一列,即每个主动关节速率数据theta_der_1 = theta_der_all[:,0]theta_der_2 = theta_der_all[:,1]theta_der_3 = theta_der_all[:,2]# 从theta_all数组中取出单独的每一列,即每个主动关节角数据theta_1 = theta_all[:,0]theta_2 = theta_all[:,1]theta_3 = theta_all[:,2]# 时间数组time_array = np.arange(0,5,0.1)# 创建画布(容器层)figure, axes = plt.subplots(nrows=1, ncols=2,figsize=(8,4))# 创建折线图:theta_deraxes[0].plot(time_array, theta_der_1, label='theta_der_1', color='blue')axes[0].plot(time_array, theta_der_2, label='theta_der_2', color='green')axes[0].plot(time_array, theta_der_3, label='theta_der_3', color='red')# 设置图形标题和轴标签axes[0].set_title('3个主动关节速率与时间的关系')axes[0].set_xlabel("时间")axes[0].set_ylabel("关节速率")# 修改x刻度   刻度有三个要素:一是起始值,二是末尾值,三是步长x_ticks = np.arange(0,5.5,0.5)axes[0].set_xticks(x_ticks, fontsize=2)  # 面向对象设置刻度说明需要另外set_xticklabels()函数# 显示图例axes[0].legend()# 创建折线图:thetaaxes[1].plot(time_array, theta_1, label='theta_1', color='blue')axes[1].plot(time_array, theta_2, label='theta_2', color='green')axes[1].plot(time_array, theta_3, label='theta_3', color='red')# 设置图形标题和轴标签axes[1].set_title('3个主动关节角与时间的关系')axes[1].set_xlabel("时间")axes[1].set_ylabel("关节角")# 修改x刻度   刻度有三个要素:一是起始值,二是末尾值,三是步长x_ticks = np.arange(0,5.5,0.5)axes[1].set_xticks(x_ticks)  # 面向对象设置刻度说明需要另外set_xticklabels()函数# 显示图例axes[0].legend()axes[1].legend()# 保存图形plt.savefig('result.png')# 显示图形plt.show()# # 用seaborn绘图# # 创建画布(容器层)# figure, axes = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))## # 创建折线图: theta_der# sns.lineplot(x=time_array, y=theta_der_1, label='theta_der_1', ax=axes[0], color='blue')# sns.lineplot(x=time_array, y=theta_der_2, label='theta_der_2', ax=axes[0], color='green')# sns.lineplot(x=time_array, y=theta_der_3, label='theta_der_3', ax=axes[0], color='red')## # 设置图形标题和轴标签# axes[0].set_title('3个主动关节速率与时间的关系')# axes[0].set_xlabel("时间")# axes[0].set_ylabel("关节速率")## # 修改x刻度# x_ticks = np.arange(0, 5.5, 0.5)# axes[0].set_xticks(x_ticks)## # 显示图例# axes[0].legend()## # 创建折线图: theta# sns.lineplot(x=time_array, y=theta_1, label='theta_1', ax=axes[1], color='blue')# sns.lineplot(x=time_array, y=theta_2, label='theta_2', ax=axes[1], color='green')# sns.lineplot(x=time_array, y=theta_3, label='theta_3', ax=axes[1], color='red')## # 设置图形标题和轴标签# axes[1].set_title('3个主动关节角与时间的关系')# axes[1].set_xlabel("时间")# axes[1].set_ylabel("关节角")## # 修改x刻度# axes[1].set_xticks(x_ticks)## # 显示图例# axes[1].legend()## # 保存图形# plt.savefig('result.png')## # 显示图形# plt.show()# # 用px绘制图形# # 创建子图# fig = make_subplots(rows=1, cols=2, subplot_titles=("3个主动关节速率与时间的关系", "3个主动关节角与时间的关系"))  # subplot_titles这是单个子图的标题## # 添加第一个子图# trace1_1 = go.Scatter(x=time_array, y=theta_der_1, mode='lines', name="theta_der_1")# trace1_2 = go.Scatter(x=time_array, y=theta_der_2, mode='lines', name="theta_der_2")# trace1_3 = go.Scatter(x=time_array, y=theta_der_3, mode='lines', name="theta_der_3")# fig.add_trace(trace1_1, row=1, col=1)# fig.add_trace(trace1_2, row=1, col=1)# fig.add_trace(trace1_3, row=1, col=1)## # 添加第二个子图# trace2_1 = go.Scatter(x=time_array, y=theta_1, mode='lines', name="theta_1")# trace2_2 = go.Scatter(x=time_array, y=theta_2, mode='lines', name="theta_2")# trace2_3 = go.Scatter(x=time_array, y=theta_3, mode='lines', name="theta_3")# fig.add_trace(trace2_1, row=1, col=2)# fig.add_trace(trace2_2, row=1, col=2)# fig.add_trace(trace2_3, row=1, col=2)## # 更新图表布局# fig.update_layout(#     title="可视化",   # 这是整个图幅的标题#     title_x=0.5,  # 设置标题的水平位置为中央#     width=1000,  # 设置图幅宽度#     height=600,  # 设置图幅高度#     xaxis=dict(title="时间"),#     yaxis=dict(title="关节速率"),#     xaxis2=dict(title="时间"),#     yaxis2=dict(title="关节角"),# )## # 设置横坐标刻度值# fig.update_xaxes(tickvals=np.arange(0,5.5,0.5), row=1, col=1)# fig.update_xaxes(tickvals=np.arange(0,5.5,0.5), row=1, col=2)## # 展示图像# fig.show()if __name__ == '__main__':plot()

绘制图像如下:

在这里插入图片描述

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

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

相关文章

【考试100】安全员B证《建设工程安全生产技术》单选题

​ 题库来源:考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1.在悬空部位作业时,操作人员应( ) A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】:D…

【R基础】如何开始学习R-从下载R及Rstudio开始

文章目录 概要下载R流程下载Rstudio流程下载完成-打开 概要 提示:如何开始学习R-从下载R及Rstudio开始,此处我只是想下载指定版本R4.3.3 下载R流程 链接: R官网 文件下载到本地 下载文件展示 按照向导指示安装 下载Rstudio流程 链接: Rstudio官网…

低代码与人工智能的深度融合:行业应用的广泛前景

引言 在当今快速变化的数字化时代,企业面临着越来越多的挑战和机遇。低代码平台和人工智能技术的兴起,为企业提供了新的解决方案,加速了应用开发和智能化转型的步伐。 低代码平台的基本概念及发展背景 低代码平台是一种软件开发方法&#x…

解决MYSQL5.7版本only_full_group_by报错解决方法

问题 出现this is incompatible with sql_modeonly_full_group_by这个语句就说明启动了only_full_group_by规则了 介绍only_full_group_by规则: 这种情况可能是5.7版本的规则比较严格,当启用“only_full_group_by”模式时,MySQL会对执行GROU…

SpringBoot中MyBatisPlus的使用

MyBatis Plus 是 MyBatis 的增强工具,提供了许多强大的功能,简化了 MyBatis 的使用。下面是在 Spring Boot 中使用 MyBatis Plus 的步骤: 添加依赖:在 Maven 或 Gradle 的配置文件中添加 MyBatis Plus 的依赖。 配置数据源&#…

Day10:平面转换、渐变色

目标:使用位移、缩放、旋转、渐变效果丰富网页元素的呈现方式。 一、平面转换 1、简介 作用:为元素添加动态效果,一般与过渡配合使用。 概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)。 平面转换…

小米投屏怎么投?收好这3个投屏指南!(2024新)

近年来,小米凭借过硬的品质和合理的价格成为手机市场的一股强劲力量。随着其销量的上升,人们可以通过多种方式使用它来获得乐趣和便利。比如小米MIUI 11自带一个“光环”——Miracast,可以让用户在电脑上控制小米/红米/小米,获得更…

The book

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD is the book that forms the basis for this course. We recommend reading the book as you complete the course. There’s a few ways to read the book – you can buy it as a paper bo…

CameraProvider启动流程

从Android 8.0之后,Android 引入Treble机制,主要是为了解决目前Android 版本之间升级麻烦的问题,将OEM适配的部分vendor与google 对android 大框架升级的部分system部分做了分离,一旦适配了一个版本的vendor信息之后,之…

【excel】设置可变下拉菜单(一级联动下拉菜单)

文章目录 【需求】制作动态下拉菜单,显示无重复的“班级”列表【思路】设置辅助列,使用UNIQUE()函数去重,并用FILTER()去掉结果中的“0”【步骤】step1 辅助列step2 设置下拉菜单 【总结】 【需求】制作动态下拉菜单,显示无重复的…

深度学习之AlexNet、VGG-19、VGG-16、LeNet-5、ResNet模型的训练

一.AlexNet 1.1.导入资源包 import cv2 import matplotlib.pyplot as plt import numpy as np import os import random注: cv2:这是 OpenCV 模块,用于处理图像和视频,包括摄像头捕捉、图像处理、特征检测等。 matpl…

Playwright 自动化操作

之前有见同事用过playwright进行浏览器模拟操作,但是没有仔细了解,今天去详细看了下,发现playwright着实比selenium牛逼多了 Playwright 相对于selenium优点 1、自动下载chromnium, 无需担心chrome升级对应版本问题; 2、支持录屏操…

干Java的有4年的工作经验;想转行做labview能行吗?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!bVIEW和Java都是软件工具&a…

推荐几款优秀的文档加密软件 | 企业文件加密解决方案

在数字化时代,信息安全问题日益突出,文档加密软件成为了保护数据安全的重要手段。但是,市面上的文档加密软件种类繁多,功能各异,如何选择一款好用的文档加密软件成为了许多用户关注的焦点。本文将为大家提供一份实用的…

【第十三节】C++控制台版本坦克大战小游戏

目录 一、游戏简介 1.1 游戏概述 1.2 知识点应用 1.3 实现功能 1.4 开发环境 二、项目设计 2.1 类的设计 2.2 各类功能 三、程序运行截图 3.1 游戏主菜单 3.2 游戏进行中 3.3 双人作战 3.4 编辑地图 一、游戏简介 1.1 游戏概述 本项目是一款基于C语言开发的控制台…

5. MySQL运算符和函数

文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…

Linux基本命令的使用(cp mv)

一、cp命令-1 1、CP命令作用&#xff1a;复制一个源文件到目标文件&#xff08;夹&#xff09; 2、 语法&#xff1a;cp [选项] 源文件 目标文件&#xff08;夹&#xff09; ① 复制到文件夹下&#xff0c;则文件名保持不变 ② 复制到文件中&#xff0c;则文件名变更 二、cp命…

【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“

目录 前言 回顾C语言的操作 Q1 Q2 Q3 C语言文件操作 w方式 a方式 重定向和"w""a"方式 前言 前面进程虚拟地址空间让我们对进程的理解更加深入。在基础IO我们会详细介绍文件和文件系统。本专题的核心内容是文件。 深刻理解文件&#xff08;站在…

两数之和 II - 输入有序数组,三数之和

题目一&#xff1a; 代码如下&#xff1a; vector<int> twoSum(vector<int>& numbers, int target) {int left 0;int right numbers.size() - 1;vector<int> ret;while (left < right){int tmp numbers[left] numbers[right];if (tmp target){r…

vue3学习使用笔记

1.学习参考资料 vue3菜鸟教程&#xff1a;https://www.runoob.com/vue3/vue3-tutorial.html 官方网站&#xff1a;https://cn.vuejs.org/ 中文文档: https://cn.vuejs.org/guide/introduction.html Webpack 入门教程&#xff1a;https://www.runoob.com/w3cnote/webpack-tutor…