机械臂运动包含两个问题,一是已知机械臂关节角,求对应的机械臂末端位置和姿态,称为机械臂正运动学;二是已知机械臂末端位置和姿态,求解对应机械臂关节角,称为机械臂逆运动学

本文通过学习机械臂正运动学的相关知识,使用Python进行三连杆机械臂运动姿态模拟。

求解机械臂正运动学,即已知机械臂各个关节的旋转角度,求解机械臂末端位置与姿态,

可以分为以下几步:

1.在杆件上建立frame(坐标系),用frame状态表示机械臂杆件状态;

2.根据坐标系关系及连杆参数,写出机械臂D-H table;

3.根据D-H table求解出各连杆的变换矩阵T;

4.最后由T矩阵可解出机械臂末端相对于基坐标系的坐标。

1.1  建立frame

Zi :转动或移动关节的方向;

Xi  :沿着ai的方向(ai不为0),

和Zi与Zi+1两者垂直(ai为0);

Yi :与Xi与Zi垂直,遵循右手定则

1.2 建立D-H参数表

  D-H表达法

三连杆各关节坐标系及D-H table 的建立

1.3 坐标变换矩阵T

   任意两个关节

连续坐标变换矩阵

1.4 机械臂末端相对基坐标的坐标

其中矩阵中X,Y,Z为机械臂末端位置在frame(n)的坐标,而W取1即可。

1.5 三连杆机械臂正运动学Python模拟

import numpy as np
from math import sin, cos, pi
import matplotlib.pyplot as plt
# Matplotlib是Python的一个绘图库,是Python常用的可视化工具之一
from pylab import mpl
from matplotlib.pyplot import MultipleLocatorclass ThreeLinkArm:"""三连杆机械臂模拟。所使用的变量与模拟实体对应关系如下所示:(joint1)——连杆1——(joint2)——连杆2——[joint3]--连杆3--[tool]注意:joint1是基座也是坐标原点(0,0)"""def __init__(self, _joint_angles=[0, 0, 0]):self.joint1 = np.array([0, 0])self.update_joints(_joint_angles)self.forward_kinematics()def update_joints(self, _joint_angles):  #定义角度更新的方法update_joints()self.joint_angles = _joint_anglesdef transform1(self, _theta1, a0):self._theta1 = _theta1self.a0 = a0T1 = np.mat([[cos(self._theta1), -sin(self._theta1), 0, 0],[sin(self._theta1), cos(self._theta1), 0, 0],[0, 0, 1, 0],[0, 0, 0, 1]])return T1def transform2(self, _theta2, a1):self._theta2 = _theta2self.L1 = a1  #杆1长度T2 = np.mat([[cos(self._theta2), -sin(self._theta2), 0, self.L1],[sin(self._theta2), cos(self._theta2), 0, 0],[0, 0, 1, 0],[0, 0, 0, 1]])return T2def transform3(self, _theta3, a2):self._theta3 = _theta3self.L2 = a2  杆2长度T3 = np.mat([[cos(self._theta3), -sin(self._theta3), 0, self.L2],[sin(self._theta3), cos(self._theta3), 0, 0],[0, 0, 1, 0],[0, 0, 0, 1]])return T3def forward_kinematics(self):            #定义正运动学方法forward_kinematics()"""根据各个关节角计算各个关节的位置.注意:所使用的变量与模拟实体对应关系如下所示:(joint1)——连杆1——(joint2)——连杆2——[joint3]--连杆3--[tool]"""#计算joint1的位置# q1,q2,q3分别是第1、第2和第3个关节转动的关节角q1 = self.joint_angles[0]Q1 = np.mat([[3],  #杆1长度为3[0],[0],[1]])T1 = self.transform1(q1, 0)joint2 = T1*Q1x2 = joint2[0, 0]y2 = joint2[1, 0]self.joint2 =np.array([x2, y2])#计算joint2的位置q2 = self.joint_angles[1]Q2 = np.mat([[2],  #杆2长度为2[0],[0],[1]])T2 = self.transform2(q2, 3)joint3 = T1*T2*Q2x3 = joint3[0, 0]y3 = joint3[1, 0]self.joint3 = np.array([x3, y3])#计算tool的位置q3 = self.joint_angles[2]Q3 = np.mat([[1],  杆3长度为1[0],[0],[1]])T3 = self.transform3(q3, 2)tool = T1*T2*T3*Q3x4 = tool[0, 0]y4 = tool[1, 0]self.tool = np.array([x4, y4])def plot(self):"""绘制当前状态下的机械臂"""mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题# 三个关节的坐标x = [self.joint1[0], self.joint2[0], self.joint3[0], self.tool[0]]y = [self.joint1[1], self.joint2[1], self.joint3[1], self.tool[1]]print(x, y)plt.plot(x, y, c='black', zorder=1)         # 绘制这样的一条线——连杆0————连杆1plt.scatter(x, y, c='red', zorder=2)        # 绘制三个黑圆点代表关节,zorder=2是为了让绘制的点盖在直线上面plt.title(u'两连杆机械臂正运动学')plt.xlabel(u'X坐标')plt.ylabel(u'Y坐标')x_major_locator = MultipleLocator(1)        # 把x轴的刻度间隔设置为1,并存在变量里y_major_locator = MultipleLocator(1)        # 把y轴的刻度间隔设置为1,并存在变量里ax = plt.gca()  # ax为两条坐标轴的实例ax.xaxis.set_major_locator(x_major_locator) # 把x轴的主刻度设置为0.5的倍数ax.yaxis.set_major_locator(y_major_locator) # 把y轴的主刻度设置为0.5的倍数plt.xlim(-5, 5) # 设置x轴的刻度范围plt.ylim(0, 6)  # 设置y轴的刻度范围plt.show()arm_robot = ThreeLinkArm([pi/2, pi/4, pi/3])
arm_robot.plot()

程序可实现“通过修改ThreeLinkArm()中的三个角度变量,绘图显示机械臂姿态变化”

运行结果

三连杆机械臂正运动学python模拟——运动学学习(一)相关推荐

  1. 机器人动力学建模实例(二):三连杆机械臂

    下图是三连杆机械臂,也就是常说的拟人臂. 采用拉格朗日方法并做适当简化后得到其动力学模型: H(q)q¨+C(q,q˙)q˙+G(q)+F(q˙)+τd=τ H(q) \ddot q + C(q, \ ...

  2. 7.2连杆机械臂+正运动学

  3. 中正平和的机器人学笔记——1. 机械臂正运动学(附MATLAB代码)

    中正平和的机器人学笔记--1.正运动学 0. 何为运动学?何为正运动学? 运动学主要研究的就是机械臂的运动特性(位置.速度.加速度等),但是不考虑使机械臂产生运动时施加的力和力矩(这部分是动力学).而 ...

  4. python 机械臂控制_机械臂正运动学-DH参数-Python快速实现

    机械臂正运动学-DH参数-Python快速实现 前言: 最近在玩一个非常弱智的机械臂,好多功能都没有,连个配套的仿真环境都没, 虚拟边界和碰撞检测的功能都非常难用. 没办法,我只能自己实现一个简陋的虚 ...

  5. 机械臂正运动学-DH参数-Python快速实现

    机械臂正运动学-DH参数-Python快速实现 文章目录 机械臂正运动学-DH参数-Python快速实现 前言: 更新:是我自己憨批了,说明书上有现成的计算方式,我没细看... 整体思路流程: 学习资 ...

  6. Python知道cos值求角度_机械臂正运动学-DH参数-Python快速实现

    # 机械臂正运动学-DH参数-Python快速实现 @[toc] 前言: 最近在玩一个非常弱智的机械臂,好多功能都没有,连个配套的仿真环境都没, 虚拟边界和碰撞检测的功能都非常难用. 没办法,我只能 ...

  7. 【机器人原理与实践(三)】六轴机械臂正逆解控制

    文章目录 3.1 空间转换矩阵的理解 3.1.1平移变换 3.1.2旋转变换 3.2 D-H参数法 3.3 建立机械臂模型 3.3.1 机械臂模型介绍 3.3.2 使用Matlab进行示教仿真 3.4 ...

  8. 修正逆解文章——六轴UR机械臂正逆运动学求解_MATLAB代码(标准DH参数表)

    如下参考链接1的作者大大实现了UR5机械臂的正运动学和逆运动学的Matlab代码.但逆解部分在不同版本的Matlab中运行有错误. 本篇文章是MatlabR2016a下完成的,并说明一下原代码错误的原 ...

  9. 实验一 机械臂正逆运动学

    实验一 机械臂正逆运动学 一.实验目的 1.巩固正逆运动学基础概念. 2.了解正逆运动学在机械臂控制中的实际用途. 二.实验内容 1.机械臂模型DH参数的计算. 2.机械臂正运动学的计算. 3.机械臂 ...

  10. UR5构型机械臂正逆运动学

    前言 整理之前的一个项目,当时看着一个博客硬生生计算了差不多一个星期.尝试用MatLab符号推导工具箱化简一部分工作.我使用的大象机器人一款开源入门级协作机器人产品myCobot,开发文档十分完善,但 ...

最新文章

  1. TensorRT深度学习训练和部署图示
  2. flash 绘图API:绘制基础的图形
  3. 阿里云容器服务多项重磅发布:高效智能、安全无界的新一代平台
  4. RuntimeError: Model class paypal.standard.ipn.models.PayPalIPN doesn't declare an explicit app_label
  5. linux的基础知识——会话
  6. mysql超大sql怎么还原_关于Mysql 大型SQL文件快速恢复方案
  7. Openstack平台搭建之第二天
  8. Oracle数据空间的管理
  9. 2020 年告别办公室!
  10. python是干什么的-python干嘛用
  11. linux -- 三剑客 |grep - sed -awk
  12. Git—如何Windows操作系统中安装Git
  13. JavaWeb(一)
  14. POI导出echarts统计报表到Excel
  15. png图片怎么缩小kb?压缩png图片怎么弄?
  16. 【淘宝商家应用接口】拼多多平台流量解析,如何充分利用平台分配的流量?
  17. 特征值分解:特征值,特征向量,特征向量矩阵
  18. piranha(注意iptables和selinux的问题)
  19. 雷锋网专访布丁CEO徐磊
  20. 盲盒App就是一元购吗?

热门文章

  1. js中鼠标事件mouseover、mouseenter和mouseleave、mouseout的区别
  2. AXI Memory-Mapped SRIO收发控制器
  3. Android——实现光点模糊渐变的自旋转圆环特效
  4. HBuilder如何运行到MuMu模拟器教程
  5. 有哪些实用的电脑软件值得推荐?2021电脑装机必备便签软件
  6. Excel自定义格式千分符
  7. 华硕飞行堡垒7在BIOS中开启AMD-V
  8. Flink典型应用场景
  9. 创智播客微服务_传智播客黑马程序员首次对外发布JavaEE中级程序员学习路线图...
  10. Ragnar Locker 卷土重来:美国52个关键信息基础设施被入侵