如何在Python用Plot畫出一個簡單的機器人模型

如何在Python中使用 Plot 畫出一個簡單的模型

在下面的程序中,首先要知道機器人的DH參數,然后計算出每一個關節的位置,最后利用 plot 函數畫出關節之間的連桿就可以了,最后利用 animation 庫來實現一個動畫效果。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import numpy as np
from IPython import embed
import matplotlib.animation as animation
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk# 取消科學計數法,保留6位小數
np.set_printoptions(precision=6, suppress=True)class Robot(object):def __init__(self):self.alpha_list = []self.a_list = []self.d_list = []self.theta_list = []def SetDHParamList(self, alpha_list, a_list, d_list, theta_list):self.alpha_list = alpha_listself.a_list = a_listself.d_list = d_listself.theta_list = theta_listdef DH(self, index, theta):theta = theta + self.theta_list[index]T = np.zeros([4, 4])c_t = np.cos(theta * np.pi/180)s_t = np.sin(theta * np.pi/180)c_a = np.cos(self.alpha_list[index] * np.pi/180)s_a = np.sin(self.alpha_list[index] * np.pi/180)T[0] = [c_t, - s_t * c_a,     s_t * s_a,  self.a_list[index] * c_t]T[1] = [s_t,   c_t * c_a,   - c_t * s_a,  self.a_list[index] * s_t]T[2] = [  0,         s_a,           c_a,        self.d_list[index]]T[3] = [  0,           0,             0,                    1]# print(T)return np.mat(T)def GetRobotTool(self, q_list):T6 = np.identity(4, dtype= float)for i in range(6):T = self.DH(i, q_list[i])T6 = T6 * Treturn T6class ShowRobot(object):def __init__(self):self.ax = Noneself.robot = Noneself.q_list = [0, 0, 0, 0, 0, 0]fig_width, fig_height = plt.gcf().get_size_inches()# 根據畫布大小自動調整直線的粗細, 這里乘上系數3只是為了更好地顯示效果self.line_thicknes = max(fig_width / 50, fig_height / 50) * 60self.s200 = max(fig_width / 50, fig_height / 50) * 200self.fontsize = max(fig_width / 50, fig_height / 50) * 80self.alpha = 0.7 #透明度def ShowFrame(self, T, length = 1, width = 2):# 使用quiver繪制坐標軸# 參數說明:# origin[0], origin[1], origin[2] 是箭頭的起點# x_axis[0], x_axis[1], x_axis[2] 是箭頭的方向# length 是箭頭的長度# arrow_length_ratio 是箭頭頭部與箭桿的比例# linewidth 是箭桿的寬度self.ax.quiver(T[0, 3], T[1, 3], T[2, 3], T[0, 0], T[1, 0], T[2, 0], color='r', length=length, arrow_length_ratio=0.1, linewidth=width)self.ax.quiver(T[0, 3], T[1, 3], T[2, 3], T[0, 1], T[1, 1], T[2, 1], color='g', length=length, arrow_length_ratio=0.1, linewidth=width)self.ax.quiver(T[0, 3], T[1, 3], T[2, 3], T[0, 2], T[1, 2], T[2, 2], color='b', length=length, arrow_length_ratio=0.1, linewidth=width)def ShowLink(self, joint_index, T_start, T_end):mx2, my2, mz2 = np.array([T_start[0, 3],T_end[0, 3]]), np.array([T_start[1, 3], T_end[1, 3]]), np.array([T_start[2, 3], T_end[2, 3]])self.ax.plot(mx2, my2, mz2, solid_capstyle='round', color='blue', linewidth=self.line_thicknes, alpha=self.alpha)self.ax.text(T_start[0, 3], T_start[1, 3], T_start[2, 3], "J" + str(joint_index), color='r', fontsize=self.fontsize, zorder=1, ha='center')self.ax.scatter(T_start[0, 3], T_start[1, 3], T_start[2, 3], c='orange', marker='.', s=self.s200)# 更新函數,用于每一幀的更新def update(self, frame):self.ax.cla()  # 清除所有軸# 設置坐標軸標簽self.ax.set_xlabel('X')self.ax.set_ylabel('Y')self.ax.set_zlabel('Z')# # 設置圖形顯示范圍self.ax.set_xlim([-1000, 1000])self.ax.set_ylim([-1000, 1000])self.ax.set_zlim([-1000, 1000])T_start = np.identity(4, dtype= float)T_end = np.identity(4, dtype= float)self.ShowFrame(T_start, length=300)# 關節角度固定不變self.q_list = [0, 0, 0, 0, 0, 0]# 關節角度每一幀都在更新,呈現出一種動畫效果# self.q_list = [frame, frame - 90, 0, 0, 0, 0]for joint_index in range(6):T_start = T_endT = self.robot.DH(joint_index, self.q_list[joint_index])T_end = T_end * T# print(T_end)self.ShowLink(joint_index, T_start, T_end)self.ShowFrame(T_end, length=300)def APP():L1 = 388L2 = 50L3 = 330L4 = 50L5 = 332L6 = 96alpha_list = [90, 0, 90, -90, 90, 0]a_list     = [L2, L3, L4, 0, 0, 0]d_list     = [L1, 0, 0, L5, 0, L6]theta_list = [0, 90, 0, 0, 0, 0]robot = Robot()show_robot = ShowRobot()robot.SetDHParamList(alpha_list, a_list, d_list, theta_list)# 創建一個3D圖形fig = plt.figure()ax = fig.add_subplot(111, projection='3d')show_robot.ax = axshow_robot.robot = robotroot = tk.Tk()canvas = FigureCanvasTkAgg(fig, master = root)canvas.get_tk_widget().pack()ani = animation.FuncAnimation(fig, show_robot.update, interval = 50)canvas.draw()tk.mainloop()# 顯示動畫plt.show()if __name__ == "__main__":APP()

下面是實際顯示出來的3D機器人模型,其中也畫出了機器人的基坐標系和末端工具坐標系。
3D 機器人模型
·

在 Update 函數中,可以在每一幀中去更新關節角度,然后呈現出一種動畫的效果。

		# 關節角度固定不變self.q_list = [0, 0, 0, 0, 0, 0]# 關節角度每一幀都在更新,呈現出一種動畫效果# self.q_list = [frame, frame - 90, 0, 0, 0, 0]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71117.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71117.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark核心之01:架構部署、sparkshell、程序模板

spark內存計算框架 一、主題 spark核心概念spark集群架構spark集群安裝部署spark-shell的使用通過IDEA開發spark程序 二、要點 1. spark是什么 Apache Spark? is a unified analytics engine for large-scale data processing. spark是針對于大規模數據處理的統一分析引擎…

如何通過Python網絡爬蟲技術應對復雜的反爬機制?

要使用Python網絡爬蟲技術繞過復雜的反爬蟲機制,可以采取以下幾種策略: 設置User-Agent:通過設置不同的User-Agent,模擬正常用戶的瀏覽器訪問,避免被網站識別為爬蟲。可以使用fake_useragent庫來隨機生成User-Agent。…

[Windows] 批量為視頻或者音頻生成字幕 video subtitle master 1.5.2

Video Subtitle Master 1.5.2 介紹 Video Subtitle Master 1.5.2 是一款功能強大的客戶端工具,能夠批量為視頻或音頻生成字幕,還支持批量將字幕翻譯成其他語言。該工具具有跨平臺性,無論是 mac 系統還是 windows 系統都能使用。 參考原文&a…

神經網絡代碼入門解析

神經網絡代碼入門解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 數據生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩陣相乘再加bnoise torch.normal(0, 0.01, y.shape) # 為y添加噪聲…

DeepSeek 開源狂歡周(一)FlashMLA:高效推理加速新時代

上周末,DeepSeek在X平臺(Twitter)宣布將開啟連續一周的開源,整個開源社區為之沸騰,全球AI愛好者紛紛為關注。沒錯,這是一場由DeepSeek引領的開源盛宴,推翻了傳統推理加速的種種限制。這周一&…

EfficientViT模型詳解及代碼復現

核心架構 在EfficientViT模型的核心架構中,作者設計了一種創新的 sandwich布局 作為基礎構建塊,旨在提高內存效率和計算效率。這種布局巧妙地平衡了自注意力層和前饋神經網絡層的比例,具體結構如下: 基于深度卷積的Token Interaction :通過深度卷積操作對輸入特征進行初步…

大語言模型(LLM)如何賦能時間序列分析?

引言 近年來,大語言模型(LLM)在文本生成、推理和跨模態任務中展現了驚人能力。與此同時,時間序列分析作為工業、金融、物聯網等領域的核心技術,長期依賴傳統統計模型(如ARIMA)或深度學習模型&a…

Java 設計模式:軟件開發的精髓與藝

目錄 一、設計模式的起源二、設計模式的分類1. 創建型模式2. 結構型模式3. 行為型模式三、設計模式的實踐1. 單例模式2. 工廠模式3. 策略模式四、設計模式的優勢五、設計模式的局限性六、總結在軟件開發的浩瀚星空中,設計模式猶如一顆顆璀璨的星辰,照亮了開發者前行的道路。它…

【基于Raft的KV共識算法】-序:Raft概述

本文目錄 1.為什么會有Raft?CAP理論 2.Raft基本原理流程為什么要以日志作為中間載體? 3.實現思路任期領導選舉日志同步 1.為什么會有Raft? 簡單來說就是數據會隨著業務和時間的增長,單機不能存的下,這個時候需要以某種…

【愚公系列】《Python網絡爬蟲從入門到精通》040-Matplotlib 概述

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

EasyRTC嵌入式WebRTC技術與AI大模型結合:從ICE框架優化到AI推理

實時通信技術在現代社會中扮演著越來越重要的角色,從視頻會議到在線教育,再到遠程醫療,其應用場景不斷拓展。WebRTC作為一項開源項目,為瀏覽器和移動應用提供了便捷的實時通信能力。而EasyRTC作為基于WebRTC的嵌入式解決方案&…

javaEE初階————多線程初階(5)

本期是多線程初階的最后一篇文章了,下一篇就是多線程進階的文章了,大家加油! 一,模擬實現線程池 我們上期說過線程池類似一個數組,我們有任務就放到線程池中,讓線程池幫助我們完成任務,我們該如…

工業AR眼鏡的‘芯’動力:FPC讓制造更智能【新立電子】

隨著增強現實(AR)技術的快速發展,工業AR智能眼鏡也正逐步成為制造業領域的重要工具。它不僅為現場工作人員提供了視覺輔助,還極大地提升了遠程協助的效率、優化了倉儲管理。FPC在AI眼鏡中的應用,為工業AR智能眼鏡提供了…

FPGA開發,使用Deepseek V3還是R1(5):temperature設置

以下都是Deepseek生成的答案 FPGA開發,使用Deepseek V3還是R1(1):應用場景 FPGA開發,使用Deepseek V3還是R1(2):V3和R1的區別 FPGA開發,使用Deepseek V3還是R1&#x…

網站內容更新后百度排名下降怎么辦?有效策略有哪些?

轉自 網站內容更新后百度排名下降怎么辦?有效策略有哪些? 網站內容更新是促進網站優化的關鍵環節,但是頻繁修改網站內容會對網站的搜索引擎排名造成很大的影響。為了保持網站排名,我們需要采取一些措施來最小化對百度排名的影響。…

安裝 cpolar 內網穿透工具的步驟

安裝 cpolar 內網穿透工具的步驟 1. 下載 cpolar 軟件安裝包 步驟: 前往 cpolar 官方下載頁面。 根據您的操作系統(Windows、macOS、Linux 等),選擇對應的安裝包進行下載。 2. 注冊 cpolar 賬號 步驟: 訪問 cpolar…

Linux :進程狀態

目錄 1 引言 2 操作系統的資源分配 3進程狀態 3.1運行狀態 3.2 阻塞狀態 3.3掛起狀態 4.進程狀態詳解 4.1 運行狀態R 4.2 休眠狀態S 4.3深度睡眠狀態D 4.4僵尸狀態Z 5 孤兒進程 6 進程優先級 其他概念 1 引言 🌻在前面的文章中,我們已…

openwebUI訪問vllm加載deepseek微調過的本地大模型

文章目錄 前言一、openwebui安裝二、配置openwebui環境三、安裝vllm四、啟動vllm五、啟動openwebui 前言 首先安裝vllm,然后加載本地模型,會起一個端口好。 在安裝openwebui,去訪問這個端口號。下面具體步驟的演示。 一、openwebui安裝 rootautodl-co…

DeepSeek-V3:AI語言模型的高效訓練與推理之路

參考:【論文學習】DeepSeek-V3 全文翻譯 在人工智能領域,語言模型的發展日新月異。從早期的簡單模型到如今擁有數千億參數的巨無霸模型,技術的進步令人矚目。然而,隨著模型規模的不斷擴大,訓練成本和推理效率成為了擺在…

Spring單例模式 Spring 中的單例 餓漢式加載 懶漢式加載

目錄 核心特性 實現方式詳解 1. 餓漢式(Eager Initialization) 2. 懶漢式(Lazy Initialization) 3. 靜態內部類(Bill Pugh 實現) 4. 枚舉(Enum) 破壞單例的場景及防御 Sprin…