Skip to main content

基于匹诺曹的机器人模型的 Python 逆运动学。

项目描述

粉色的

建造 覆盖范围 文档 PyPI 版本 地位

基于匹的关节机器人模型的运动学中的Python

安装

pip install pin-pink

在 Raspberry Pi 上,您需要从 source安装。

用法

Pink 中的逆运动学由加权任务定义。任务通过要最小化的目标函数(例如 $\Vert {}^{world}p_{foot}^{target})来表征要实现的目标,例如“将脚框架放在这个位置” - {}^{world}p_{foot} \Vert^2$。机器人需要完成多项任务,其中一些任务可能会发生冲突。冲突是通过将所有目标投射到同一个单元来解决的,比如[cost],并权衡所有这些标准化的目标。

任务成本

这是一个双足机器人示例,它控制其基础、左接触和右接触框架的位置和方向。为正则化添加了第四个“姿势”任务,为每个关节提供所需的角度:

from pink.tasks import BodyTask, PostureTask

tasks = {
    "base": BodyTask(
        "base",
        position_cost=1.0,              # [cost] / [m]
        orientation_cost=1.0,           # [cost] / [rad]
    ),
    "left_contact": BodyTask(
        "left_contact",
        position_cost=[0.1, 0.0, 0.1],  # [cost] / [m]
        orientation_cost=0.0,           # [cost] / [rad]
    ),
    "right_contact": BodyTask(
        "right_contact",
        position_cost=[0.1, 0.0, 0.1],  # [cost] / [m]
        orientation_cost=0.0,           # [cost] / [rad]
    ),
    "posture": PostureTask(
        cost=1e-3,                      # [cost] / [rad]
    ),
}

方向(类似位置)成本,可以是标量或 3D 向量,指定在整体归一化目标中每个角度误差弧度的“成本”。使用 3D 矢量时,组件沿身体框架的每个轴进行各向异性加权。

任务目标

除了成本之外,大多数任务还采用称为目标的第二组参数,例如身体任务的目标变换或姿势任务的目标配置向量。目标由set_target函数设置:

    tasks["posture"].set_target(
        [1.0, 0.0, 0.0, 0.0] +           # floating base quaternion
        [0.0, 0.0, 0.0] +                # floating base position
        [0.0, 0.2, 0.0, 0.0, -0.2, 0.0]  # joint angles
    )

例如,可以从机器人的中性配置初始化身体任务:

import pink
import upkie_description

robot = pink.models.build_from_urdf(upkie_description.urdf_path)
configuration = pink.apply_configuration(robot, robot.q0)
for body, task in tasks.items():
    if type(task) is BodyTask:
        task.set_target(configuration.get_transform_body_to_world(body))

一旦定义了任务的成本和(如果适用)目标,它就可以用于求解逆运动学。

微分逆运动学

Pink 求解微分逆运动学,这意味着它会输出一个速度,引导机器人模型朝向解决方案配置(而不是求解该配置本身)。如果我们继续整合该速度,并且同时任务目标不改变,我们将收敛到该配置:

dt = 6e-3  # [s]
for t in np.arange(0.0, 42.0, dt):
    velocity = solve_ik(configuration, tasks.values(), dt)  # includes joint limits
    q = configuration.integrate(velocity, dt)
    configuration = pink.apply_configuration(robot, q)
    time.sleep(dt)

如果任务目标不断更新,则不会有稳定的解决方案可以收敛,但模型最多会继续跟踪每个目标。请注意,这solve_ik考虑了从 URDF 读取的关节位置和速度限制。

例子

上述所有步骤在以下示例中进行了说明: