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

前言:

最近在玩一个非常弱智的机械臂,好多功能都没有,连个配套的仿真环境都没, 虚拟边界和碰撞检测的功能都非常难用。

没办法,我只能自己实现一个简陋的虚拟边界功能,这必须要在已知关节角的情况下,提前计算出每个关节的三维坐标。

这里的问题凝结为输入输出就是:

已知: 机械臂的关节长度,关节构型

输入: 机械臂的关节角度;

输出: 机械臂的关节坐标。

全网好像没有搜到一个简单可用、基于DH参数的Python的正运动学代码(github有一个不能用)。

为了防止以后忘记,以及方便大家学习借鉴。先抛出来,供大家参考

我为了实现这个功能 ,来来回回看了三天的资料和课程,但是感觉核心步骤也就几个公式和对应关系,所以我就把这几个核心的东西单拎出来了。

大家如果时间充分,可以详细的看看课程和教材,如果时间不够,就可以看我这个,如果我有哪些细节没有描述清楚的话,可以在评论区留言~

整体思路流程:

搜集机械臂相关配置资料:关节长度、构型、官方设定的坐标系;

通过两个对应关系,找到机械臂的DH参数表;

找到了之后,代入转换矩阵T中;

连乘所有关节的T;

获取关节三维坐标。

学习资料

要想得到上面的输出,需要的基础知识比较多。

有:

刚体的坐标变换;

DH参数;

基本上就是上面两个了。

为了弄明白这个过程, 我请教了几位大佬,大佬说可以看看b站台大的机器人学,和《机器人学导论》-斯坦福的那本,自己去网上搜PDF版就好了

然后直接基本概念,大家可以去看看:

台大机器人学之运动学——林沛群(含课件+书籍)

核心概念:

我们将机械臂的每一个关节轴,都建立一个坐标系,那么从关节1到关节0的变化,其实就是做了一次刚体的坐标变换。

而关节7的末端点,则是串着做了好多次的坐标变换。

DH参数的理解。

先挂一个参考链接,这里面的介绍的更详细:

https://blog.csdn.net/aic1999/article/details/82490615

上节说到本质是坐标变换,那么我们如何根据已知信息,确定好坐标变换的基本信息?

这里面就得用到一个神奇的DH参数(两位大佬名字的缩写)

来看看课本里的这张经典图。

我们需要知道,决定四个轴的相对位置关系,我们可以用四个变量来描述(虽然可能不唯一,但是够了)。

那么我们需要知道的第一个对应关系:

DH参数的定义:

沿着轴方向,逆时针为正。

这里面我们还差一个东西,如何定义坐标系?

建立坐标系

其实一般如果是靠谱的机器人,这个坐标系应该是给的。

把我这次用的机器人的拿过来,作为例子,有例子,大家理解起来就方便了。

可以看出来一个很有意思的事情, 01关节是放在一起看了,即12坐标系原点重合,这里是将1杆的长度看作0了。下面去计算DH参数的时候也需要注意的。而且我们计算的时候,是无法计算出1轴的坐标。

坐标系和参数对应关系来了,我们就能填好DH表了:

如何填写?

对着坐标轴的图和连杆参数定义,一个一个填。

我们以第一个轴为例,第一行有四个值:α\alphaα1-0 , aaa1-0 , ddd1-0 θ\thetaθ1-0

这里面的α\alphaα1-0即α\alphaα0是绕X0正方向, 从Z0旋转到Z1的角度。从图中可以看出来,没旋转,即为0.

aaa0沿着X0,从Z0移动到Z1的距离,因为两个Z重合,不存在移动距离,即距离为0;

d1的话,不一样,沿着Z1轴,从X0移动到X1的距离,可以看出来,移动了0.31米,虽然方向不一样,但是确实是得移动这么多,才能重合。

θ\thetaθ的话,就是关节转动的角度了,后面几个关节,可能初始角度得加一个180°才行。

这个DH参数值拿到了之后,就得想办法拿到转换矩阵了。

好在《机器人学导论》这本书里直接给了计算公式:

矩阵变换公式:

这玩意儿还得配套几个公式才行。

总之拿到了DH参数,就把表里的值代入到T中, 然后连乘,就能计算出末端位姿了。

最后直接上代码吧:

from mpl_toolkits.mplot3d import Axes3D

import matplotlib.pyplot as plt

from matplotlib import cm

import numpy as np

from math import radians, sin, cos

def set_axes_equal(ax):

# 这一段是copy别人的。用处不是很大。

'''Make axes of 3D plot have equal scale so that spheres appear as spheres,

cubes as cubes, etc.. This is one possible solution to Matplotlib's

ax.set_aspect('equal') and ax.axis('equal') not working for 3D.

Input

ax: a matplotlib axis, e.g., as output from plt.gca().

'''

x_limits = ax.get_xlim3d()

y_limits = ax.get_ylim3d()

z_limits = ax.get_zlim3d()

x_range = abs(x_limits[1] - x_limits[0])

x_middle = np.mean(x_limits)

y_range = abs(y_limits[1] - y_limits[0])

y_middle = np.mean(y_limits)

z_range = abs(z_limits[1] - z_limits[0])

z_middle = np.mean(z_limits)

# The plot bounding box is a sphere in the sense of the infinity

# norm, hence I call half the max range the plot radius.

plot_radius = 0.5*max([x_range, y_range, z_range])

ax.set_xlim3d([x_middle - plot_radius, x_middle + plot_radius])

ax.set_ylim3d([y_middle - plot_radius, y_middle + plot_radius])

ax.set_zlim3d([z_middle - plot_radius, z_middle + plot_radius])

def dh_matrix(alpha, a, d, theta):

# 传入四个DH参数,根据公式3-6,输出一个T矩阵。

alpha = alpha / 180 * np.pi

theta = theta / 180 * np.pi

matrix = np.identity(4)

matrix[0,0] = cos(theta)

matrix[0,1] = -sin(theta)

matrix[0,2] = 0

matrix[0,3] = a

matrix[1,0] = sin(theta)*cos(alpha)

matrix[1,1] = cos(theta)*cos(alpha)

matrix[1,2] = -sin(alpha)

matrix[1,3] = -sin(alpha)*d

matrix[2,0] = sin(theta)*sin(alpha)

matrix[2,1] = cos(theta)*sin(alpha)

matrix[2,2] = cos(alpha)

matrix[2,3] = cos(alpha)*d

matrix[3,0] = 0

matrix[3,1] = 0

matrix[3,2] = 0

matrix[3,3] = 1

return matrix、

joint_num = 7

# --- Robotic Arm construction ---

# DH参数表,分别用一个列表来表示每个关节的东西。

joints_alpha = [0, 90, 90, 90, 90, 90, 90]

joints_a = [0, 0, 0, 0, 0, 0, 0]

joints_d = [0.31, 0.0, 0.4, 0.0, 0.4, 0.0, 0.175]

joints_theta = [0, 180, 180, 180, 180, 180, 180]

# Joint Angle variables

# joints_angle = [-0.001, -21.0, -0.001, -21.0, 0.0, 0.0, -0.0]

# 选定几个特定的关节角,看看算出来的值,和真实值是否一致,方向是否反了。

joints_angle = [0, -23.43, 0, 50, 0, 0, 0]

# DH参数转转换矩阵T---------------------

joint_hm = []

for i in range(joint_num):

joint_hm.append(dh_matrix(joints_alpha[i], joints_a[i], joints_d[i], joints_theta[i]+joints_angle[i]))

# -----------连乘计算----------------------

for i in range(joint_num-1):

joint_hm[i+1] = np.dot(joint_hm[i], joint_hm[i+1])

# Prepare the coordinates for plotting

for i in range(joint_num):

print(np.round(joint_hm[i][:3, 3], 5))

# 获取坐标值

X = [hm[0, 3] for hm in joint_hm]

Y = [hm[1, 3] for hm in joint_hm]

Z = [hm[2, 3] for hm in joint_hm]

# Plot

ax = plt.axes(projection='3d')

# ax.set_aspect('equal')

ax.plot3D(X, Y, Z)

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_zlabel('z')

set_axes_equal(ax)

plt.show()

python 机械臂控制_机械臂正运动学-DH参数-Python快速实现相关推荐

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

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

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

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

  3. ros kinetic-moveit驱动ur3机械臂------控制真实机械臂并且能动

    ros kinetic-moveit驱动ur3机械臂------控制真实机械臂并且能动 本文工作环境配置: ubuntu16.04.6 ros-kinetic ur3 已验证本教程代码在Ubuntu1 ...

  4. python 机械臂控制_从零开始的ROS四轴机械臂控制-gazebo仿真控制

    这是一个四轴器械臂练手项目,定为arm0.1版本,使用MG90s舵机来搭建一个四轴机械臂.arm0.1版本的目标是对带颜色的方块进行识别并在Gazebo中模拟出来. 以下是这个ROS四轴机械臂控制的目 ...

  5. 有关机械手臂控制中的两个重要输入参数

    1.在机械手臂中有两个重要参数.一个是编码器的值,另外一个是马达的电流值.根据这两个可以获得机械手臂的运动学,动力学的一些数据. 第一重要特征参数 是DH参数,另外一个就是每个轴的质心参数.

  6. python 进程生命周期_计算客户生命周期价值的python解决方案

    python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...

  7. python网站框架下载_最受欢迎的7款Python开源框架总结,忍不住收藏了~

    封图用Python之父Guido van Rossum镇楼,妥妥滴~ 今天是周一,也就是漫漫5天工作日的第一天,所以小编决定省略鸡汤,直接上干货,为大家打满鸡血.精选7个在GitHub等开源网站中最欢 ...

  8. python科目真题_不止金融行业, 全民都在学Python

    在大家的印象里,想进入金融行业或者数据岗位,首先需要精通Excel. 然而野村证券副首席数字官马修·汉普森在上周五的伦敦Quant Conference上发表讲话: "现在走进交易大厅,用E ...

  9. python 找到装饰器_[译] 12步轻松搞定python装饰器

    呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数 ...

最新文章

  1. sqlmap 常用操作
  2. python下载m3u8地址_python 下载m3u8视频的示例代码
  3. mysql事务隔离级别与锁_mysql事务隔离级别与锁
  4. leetcode455. 分发饼干
  5. 一个正则表达式酿成的惨案
  6. json 反射java 实体_java反射实现javabean转json
  7. python if 比较小数浮点数
  8. 优酷土豆并购是如虎添翼
  9. 如何从官网下载oracle客户端,Oracle11g客户端client的下载与安装
  10. 从零开始的腾讯电脑管家下载安装配置教程
  11. ps证件照换底色(红/蓝/其他颜色都可)
  12. 《听闻远方有你》简谱-刘均演唱
  13. 你真的了解Franka吗?一文带你揭秘Franka常见问题,你想知道的都在这里!
  14. 接口与继承系列教材 (十)- Java 内部类详解
  15. Control Egress TCP Traffic
  16. 第三届火焰杯软件测试初赛题目
  17. 2021年9月PMP考试新鲜出炉,如何查询成绩?
  18. Allegro如何添加泪滴操作指导
  19. 疾病研究:LEMS和先天性肌无力患者指南
  20. NLP实操手册: 基于Transformer的深度学习架构的应用指南(综述)

热门文章

  1. 破解excel工作表保护
  2. Win10怎么使用Windows Defender扫描文件夹中的恶意软件?
  3. 立体匹配——A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and Scene Flow Es
  4. 算法:字符串全部子序列、子串、全排列
  5. Ls-Dyna 软件简介 (1)
  6. 微信团队分享:微信支付代码重构带来的移动端软件架构上的思考
  7. 侦测单IP是否为路由器,级联PC的原理
  8. php 数独求解,php求解数独
  9. IBM云对象存储 - Linux主机通过rclone和COS API上传大文件
  10. 两种WIFI破解的方法