拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PythonRobotics N 关节机械臂点到点控制:基于雅可比逆的逆运动学交互仿真指南

PythonRobotics N 关节机械臂点到点控制基于雅可比逆的逆运动学交互仿真指南【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics本文以 PythonRobotics 仓库中的ArmNavigation/n_joint_arm_to_point_control示例为核心讲解如何用雅可比逆Jacobian inverse方法实现 N 关节机械臂的逆运动学求解与点到点控制。读完本文你将掌握该交互式仿真的运行方法、底层正/逆运动学数学原理、两状态控制状态机设计以及如何通过修改N_LINKS等参数定制自己的 N 关节机械臂仿真。概述一个可以点击目标的交互式机械臂仿真这是 PythonRobotics 中 Arm Navigation 模块下的一个典型示例对应文档 n_joint_arm_to_point_control_main.rst。与仓库中其他多为脚本运行 动画演示的样例不同该仿真是交互式的运行后会在 matplotlib 窗口中绘制一个多连杆机械臂你可以在绘图区域内单击鼠标左键为机械臂末端执行器end effector设定新的目标位置机械臂会通过逆运动学实时解算出各关节的目标角并平滑地向目标点运动默认仿真中连杆数量N 10但你完全可以在源码中修改这一数值详见下文参数与调优一节。该示例被编排在 7_arm_navigation 章节下与planar_two_link_ik平面二连杆逆运动学、obstacle_avoidance_arm_navigation带避障的机械臂导航共同构成完整的机械臂导航学习路径。快速开始环境准备与运行安装依赖仓库在 requirements/requirements.txt 中统一管理依赖本示例实际只依赖其中三件套numpy 2.3.5 scipy 1.18.1 matplotlib 3.11.0推荐按仓库官方指引安装全部依赖pip install -r requirements/requirements.txt若使用 conda也可以执行conda env create -f requirements/environment.yml。完整的环境配置步骤可参考 2_how_to_run_sample_codes_main.rst。运行仿真在仓库根目录下直接执行python ArmNavigation/n_joint_arm_to_point_control/n_joint_arm_to_point_control.py运行后弹出的窗口中会看到红色线段组成的 10 连杆机械臂关节处以黑色圆点ko标出绿色叉号gx表示当前目标点末端执行器与目标点之间有一条绿色虚线直观显示当前跟踪误差。此时在窗口任意位置左键点击即可给机械臂下达新目标。退出方式窗口内按键盘Esc键即可退出仿真见 NLinkArm.py 中的按键绑定。核心原理一正向运动学Forward Kinematics逆运动学求解的前提是能够快速计算给定关节角时末端在哪这正是正向运动学函数 forward_kinematics 做的事def forward_kinematics(link_lengths, joint_angles): x y 0 for i in range(1, N_LINKS 1): x link_lengths[i - 1] * np.cos(np.sum(joint_angles[:i])) y link_lengths[i - 1] * np.sin(np.sum(joint_angles[:i])) return np.array([x, y]).T其几何含义是第i根连杆的方向角等于前i个关节角的累加和即相对世界坐标系的绝对朝向末端位置等于所有连杆在该方向上的矢量叠加。这与 NLinkArm.update_points 中逐点递推关节位置的做法完全一致只是前者直接算出末端坐标。核心原理二雅可比逆Jacobian Inverse迭代求解逆运动学求解器是 inverse_kinematics它采用雅可比逆迭代法def inverse_kinematics(link_lengths, joint_angles, goal_pos): for iteration in range(N_ITERATIONS): current_pos forward_kinematics(link_lengths, joint_angles) errors, distance distance_to_goal(current_pos, goal_pos) if distance 0.1: print(Solution found in %d iterations. % iteration) return joint_angles, True J jacobian_inverse(link_lengths, joint_angles) joint_angles joint_angles np.matmul(J, errors) return joint_angles, False每一步迭代都执行三个操作计算当前误差用 distance_to_goal 求出末端到目标的 x/y 分量误差及欧氏距离np.hypot收敛判断当距离小于阈值0.1时认为已到达目标打印收敛所需的迭代次数并返回成功标志雅可比更新用 jacobian_inverse 构造 2×N 的雅可比矩阵并取伪逆np.linalg.pinv把末端位置误差映射回关节角空间def jacobian_inverse(link_lengths, joint_angles): J np.zeros((2, N_LINKS)) for i in range(N_LINKS): J[0, i] 0 J[1, i] 0 for j in range(i, N_LINKS): J[0, i] - link_lengths[j] * np.sin(np.sum(joint_angles[:j])) J[1, i] link_lengths[j] * np.cos(np.sum(joint_angles[:j])) return np.linalg.pinv(J)雅可比矩阵刻画了末端位置随各关节角的微小变化如何变动而伪逆则提供了最小范数的关节角修正量。由于这是线性化近似单步修正未必一步到位因此需要反复迭代N_ITERATIONS 10000是求解器允许的最大迭代次数若超出仍未收敛则返回(joint_angles, False)表示无解。从实现可以看出求解失败的常见原因包括目标点超出机械臂总臂长可达范围或目标位于工作空间边缘的奇异位形附近。核心原理三两状态控制状态机主循环 main 用简单的两状态状态机管理等待新目标与向目标运动两个阶段其设计动机是允许用户在机械臂尚未到达当前目标时就点击设置新目标。状态常量值行为WAIT_FOR_NEW_GOAL1检测到距离大于0.1且尚未求解时调用逆运动学求目标关节角求解失败则打印 Solution could not be found. 并保持等待MOVING_TO_GOAL2按比例控制律向目标关节角逼近当距离收敛或用户改动了目标时回到等待状态运动阶段的核心更新公式为joint_angles joint_angles Kp * ang_diff(joint_goal_angles, joint_angles) * dt即对每个关节按增益Kp 2、时间步长dt 0.1向求解出的目标关节角做比例逼近。其中 ang_diff 复用仓库通用工具 utils/angle.py 中的angle_mod把角度差归一化到[-π, π)区间避免关节角在跨越 ±π 边界时出现绕远路的不合理转动。主循环中的old_goal与arm.goal比较逻辑保证了用户中途改目标 → 状态立即回到等待 → 重新求解新目标从而实现流畅的交互体验。交互机制点击事件如何生效交互能力由 NLinkArm 类提供。构造时show_animationTrue它通过 matplotlib 的 canvas 事件接口注册鼠标回调self.fig.canvas.mpl_connect(button_press_event, self.click)click回调把鼠标点击的坐标直接赋给目标def click(self, event): self.goal np.array([event.xdata, event.ydata]).T self.plot()绘图范围由self.lim sum(link_lengths)决定即坐标轴始终覆盖机械臂最大可达的圆形工作空间。每次更新关节角后update_points会重算所有关节位置、末端执行器坐标并触发plot重绘——这就是点击即动的完整链路。参数与调优指南仿真参数集中在 n_joint_arm_to_point_control.py 顶部修改后重新运行即可生效参数默认值含义调优建议N_LINKS10连杆关节数量官方文档明确指出你可以修改它增大后机械臂更灵活但雅可比逆迭代更易出现数值问题Kp2.0关节角比例控制增益过小则运动缓慢过大则可能振荡dt0.1仿真时间步长与 Kp 配合决定运动平滑度N_ITERATIONS10000逆解最大迭代次数目标点接近工作空间边界时可能需要更多迭代收敛距离阈值0.1正/逆解均以此判断到达出现在inverse_kinematics与主循环的距离判断中连杆长度由link_lengths [1] * N_LINKS统一设为 1你也可以改成任意长度列表如[1, 1, 2, 1]NLinkArm会依据len(link_lengths)自动确定关节数。自动演示模式与单元测试除交互主程序外源码还提供了全自动演示模式animation它在 15×15 的方形区域内随机生成目标点get_random_goal范围[-7.5, 7.5]连续跟踪 5 个随机目标后自动结束。脚本__main__入口默认执行的就是animation()。对应的单元测试 test_n_joint_arm_to_point_control.py 的做法是关闭动画m.show_animation False后调用animation()并预先random.seed(12345)固定随机序列从而在 CI 环境下无窗口地验证正逆运动学求解与状态机逻辑不会崩溃或死循环。你可以仿照该测试在无显示器的服务器上验证自己的参数修改。小结从示例到可复用的机械臂控制骨架回顾整个示例PythonRobotics 的 N 关节机械臂点到点控制虽然只有两个核心文件却完整覆盖了机械臂运动控制的三个关键层次运动学层正向运动学解析末端位姿雅可比伪逆实现逆解迭代控制层比例控制律 角度归一化让关节平滑收敛交互层matplotlib 事件驱动的点击设目标两状态状态机支持目标中途切换。无论你是要学习逆运动学基础还是想以此为骨架扩展例如加入关节角度限制、速度约束、避障或拖拽式示教这份代码都是轻量而清晰的起点。直接修改N_LINKS、link_lengths与Kp并观察机械臂行为的变化就是最直观的实验方式。【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门