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

本文介绍了一种使用DH参数快速实现机械臂正运动学的方法,并提供了Python代码实例。主要内容包括:刚体坐标变换、DH参数理解及计算、转换矩阵T的运用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 机械臂正运动学-DH参数-Python快速实现 @[toc]

前言:

最近在玩一个非常弱智的机械臂,好多功能都没有,连个配套的仿真环境都没, 虚拟边界和碰撞检测的功能都非常难用。 没办法,我只能自己实现一个简陋的虚拟边界功能,这必须要在已知关节角的情况下,提前计算出每个关节的三维坐标。 这里的问题凝结为输入输出就是: 已知: 机械臂的关节长度,关节构型

2af4b9c6375148412f67059ba939de67.png

输入: 机械臂的关节角度; 输出: 机械臂的关节坐标。 全网好像没有搜到一个简单可用、基于DH参数的Python的正运动学代码(github有一个不能用)。 为了防止以后忘记,以及方便大家学习借鉴。先抛出来,供大家参考

整体思路流程:

搜集机械臂相关配置资料:关节长度、构型、官方设定的坐标系; 通过两个对应关系,找到机械臂的DH参数表; 找到了之后,代入转换矩阵T中; 连乘所有关节的T; 获取关节三维坐标。

学习资料

要想得到上面的输出,需要的基础知识比较多。 有: 1. 刚体的坐标变换; 2. DH参数; 3. 基本上就是上面两个了。

为了弄明白这个过程, 我请教了几位大佬,大佬说可以看看b站台大的机器人学,和《机器人学导论》-斯坦福的那本,自己去网上搜PDF版就好了 然后直接基本概念,大家可以去看看: 台大机器人学之运动学——林沛群(含课件+书籍)

核心概念:

我们将机械臂的每一个关节轴,都建立一个坐标系,那么从关节1到关节0的变化,其实就是做了一次刚体的坐标变换。 而关节7的末端点,则是串着做了好多次的坐标变换。

DH参数的理解。

先挂一个参考链接,这里面的介绍的更详细: https://blog.youkuaiyun.com/aic1999/article/details/82490615 上节说到本质是坐标变换,那么我们如何根据已知信息,确定好坐标变换的基本信息? 这里面就得用到一个神奇的DH参数(两位大佬名字的缩写) 来看看课本里的这张经典图。

9a2e35c9fc039167df66cff5bcc4e66d.png

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

DH参数的定义:

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

ec7ed689d11f9ed4bd5effed767d8576.png

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

建立坐标系

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

f7efb62fdf0183af3ba283986e75879c.png

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

64a3ea4d1e2f933c639016fade95b202.png

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

坐标系和参数对应关系来了,我们就能填好DH表了: 如何填写? 对着坐标轴的图和连杆参数定义,一个一个填。

124ec1356f7982c58162dabed163a6e6.png

我们以第一个轴为例,第一行有四个值:$alpha$~1-0~ , $a$~1-0~ , $d$~1-0~ $theta$~1-0~ 这里面的$alpha$~1-0~即$alpha$~0~是绕X~0~正方向, 从Z~0~旋转到Z~1~的角度。从图中可以看出来,没旋转,即为0. $a$~0~沿着X~0~,从Z~0~移动到Z~1~的距离,因为两个Z重合,不存在移动距离,即距离为0; d~1~的话,不一样,沿着Z~1~轴,从X~0~移动到X~1~的距离,可以看出来,移动了0.31米,虽然方向不一样,但是确实是得移动这么多,才能重合。 $theta$的话,就是关节转动的角度了,后面几个关节,可能初始角度得加一个180°才行。 这个DH参数值拿到了之后,就得想办法拿到转换矩阵了。 好在《机器人学导论》这本书里直接给了计算公式:

矩阵变换公式:

dff8fae4c3213ce1f7228edd88a17789.png

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

ebfe4374fc22fc3607638376b2cee73f.png

3315d627723c2c066ccf912df020fd16.png

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

最后直接上代码吧:

from 
<think>好的,我现在需要帮助用户解决关于使用Python实现两连杆机械逆运动学的问题。首先,我要理清用户的需。用户明确提到了寻找示例代码,所以我的回答应该包含具体的代码示例,并且要符合他们提供的引用资料中的信息。 首先,我得回忆一下逆运动学的基本概念。根据引用[1],逆运动学是已知末端执行器的位置和姿态,解关节角度。对于两连杆机械来说,这应该涉及到几何方法,可能使用三角函数解。因为用户提到的是两连杆,结构可能比较简单,所以几何法应该适用,如引用[3]中提到的几何法更适合计算资源有限的情况,比如树莓派,这可能也是用户的需之一。 接下来,我需要考虑如何用Python实现。根据引用[2],双连杆的正运动学使用了DH参数,但用户需要的是逆运动学。所以可能需要先设定DH参数,然后根据这些参数推导逆解。不过两连杆可能可以简化为平面问题,不需要复杂的DH参数处理,但为了准确性,可能需要参考已有的方法。 用户提供的引用[2]提到了DH参数:关节转角θi,连杆扭角αi,连杆距离di,连杆长度ai。对于两连杆来说,可能这些参数中有些是零,比如如果两个连杆都在同一平面内,那么αi可能是0或π/2。例如,平面内的两连杆机械可能每个关节的旋转轴都是垂直于平面的,所以αi可能为0。不过需要具体分析。 假设用户的两连杆是平面旋转关节,那么正运动学可以表示为: x = l1*cosθ1 + l2*cos(θ1+θ2) y = l1*sinθ1 + l2*sin(θ1+θ2) 其中l1和l2是两个连杆的长度,θ1和θ2是两个关节的角度。 逆运动学需要从(x,y)出θ1和θ2。这可以通过几何方法解决。例如,使用余弦定理计算θ2,然后通过三角函数计算θ1。可能的步骤包括: 1. 计算目标点距离原点的距离r = sqrt(x² + y²) 2. 检查是否在工作空间内(r ≤ l1 + l2 且 r ≥ |l1 - l2|) 3. 使用余弦定理计算θ2,可能存在两个解(肘部向上和向下) 4. 计算θ1,考虑θ2的不同情况 然后,我需要将这个数学过程转化为Python代码。同时,用户需要示例代码,所以代码应该清晰,并且有注释说明。 另外,引用[3]提到几何法在Python中的实现优势,比如计算速度快,适合资源有限的环境。所以代码应该尽量高效,避免复杂的迭代或优化方法,而是使用解析解。 可能的代码结构包括: - 一个函数,输入目标坐标(x,y),输出可能的关节角度组合 - 处理多解的情况,返回所有可能的解 - 使用math库中的三角函数和平方根函数 还需要考虑异常处理,比如当目标点超出工作空间时如何处理,返回错误或提示。 然后,我需要验证代码的正确性。例如,当给定一个目标点,计算出的角度代入正运动学后是否能得到原坐标。测试案例可能会有帮助,但用户可能需要自行测试。 此外,用户可能希望代码能直接应用于实际项目,所以可能需要考虑单位(弧度或度数),但通常数学函数使用弧度,所以代码中应统一使用弧度。 最后,根据用户的要,生成相关问题。这些问题应该与逆运动学相关,例如应用场景、多解处理、扩展到更多连杆等。 总结步骤: 1. 数学推导两连杆逆运动学的解析解 2. 编写Python代码实现该解析解 3. 添加注释和异常处理 4. 提供示例用法 5. 生成相关问题 现在,我需要确保数学推导正确。对于两连杆,逆解通常有两种可能的配置(如果存在的话)。根据余弦定理,可以计算θ2: cosθ2 = (x² + y² - l1² - l2²) / (2*l1*l2) θ2 = ±arccos(cosθ2) 然后,θ1可以通过计算相对于原点的角度,再减去由θ2带来的偏移。具体来说: θ1 = arctan2(y, x) - arctan2(l2*sinθ2, l1 + l2*cosθ2) 或者另一种方法,使用几何分解。这可能需要进一步验证。 在代码中,使用math.atan2来处理反正切,确保角度在正确的象限。 接下来,编写代码。例如: import math def inverse_kinematics(x, y, l1, l2): r = math.sqrt(x**2 + y**2) if r > l1 + l2 or r < abs(l1 - l2): return [] # 无解 # 计算θ2 cos_theta2 = (x**2 + y**2 - l1**2 - l2**2) / (2 * l1 * l2) theta2 = math.acos(cos_theta2) solutions = [] # 两种可能的θ2(正负) for sign in [1, -1]: t2 = sign * theta2 # 计算θ1 alpha = math.atan2(y, x) beta = math.atan2(l2 * math.sin(t2), l1 + l2 * math.cos(t2)) t1 = alpha - beta solutions.append((t1, t2)) return solutions 这样,函数返回可能的θ1和θ2的组合。需要注意,当cos_theta2的超出[-1,1]时,应处理为无解,但前面的r的判断应该已经排除了这种情况。 测试示例:假设l1=1,l2=1,目标点(1,0)应该在伸展位置,此时θ1=0,θ2=0。另一个可能的位置是θ1=0,θ2=0(只有一种解)。另一个测试点比如(0,2)应该超出范围,返回空列表。 然后,用户可能需要将弧度转换为角度,或者处理其他细节,但代码框架应该正确。 最后,生成相关问题,如多解处理、工作空间分析、扩展到三连杆等。</think>以下是一个基于几何法的两连杆机械逆运动学Python实现示例: ```python import math def inverse_kinematics(x, y, l1=1.0, l2=1.0): """ 两连杆机械逆运动学解 输入:末端坐标(x,y),连杆长度l1,l2 输出:关节角度列表[(θ1,θ2)],角度单位为弧度 """ # 计算目标点距离 r = math.sqrt(x**2 + y**2) # 判断可达性 if r > l1 + l2 or r < abs(l1 - l2): return [] # 计算θ2(余弦定理) cos_theta2 = (x**2 + y**2 - l1**2 - l2**2) / (2 * l1 * l2) theta2 = math.acos(cos_theta2) solutions = [] # 两种可能的解(肘部向上/向下) for sign in [1, -1]: theta2_val = sign * theta2 # 计算θ1(几何分解) alpha = math.atan2(y, x) beta_numerator = l2 * math.sin(theta2_val) beta_denominator = l1 + l2 * math.cos(theta2_val) beta = math.atan2(beta_numerator, beta_denominator) theta1_val = alpha - beta solutions.append((theta1_val, theta2_val)) return solutions # 示例使用 if __name__ == "__main__": target = (1.0, 0.0) # 末端目标位置 solutions = inverse_kinematics(*target) for i, (theta1, theta2) in enumerate(solutions): print(f"解{i+1}:") print(f"θ1 = {math.degrees(theta1):.2f}°") print(f"θ2 = {math.degrees(theta2):.2f}°\n") ``` ### 实现原理 1. **可达性判断**:通过比较目标点距离与连杆长度之和,确定是否在可达工作空间内[^1] 2. **余弦定理解θ2**:$$ \cos\theta_2 = \frac{x^2 + y^2 - l_1^2 - l_2^2}{2l_1l_2} $$[^2] 3. **几何分解θ1**:通过三角函数分解末端位置关系: $$ \theta_1 = \arctan2(y,x) - \arctan2(l_2\sin\theta_2, l_1 + l_2\cos\theta_2) $$[^3] ### 典型输出 ``` 解1: θ1 = 0.00° θ2 = 0.00° 解2: θ1 = 0.00° θ2 = 0.00° ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值