系列文章目录

目录

系列文章目录

前言

一、安装

1.1 使用PIP安装

1.2 从源代码安装

1.2.1 系统依赖项

1.2.2 克隆与构建

1.2.3 使用内置的Python绑定

二、加载机器人

2.1 加载您的机器人

2.1.1 使用URDF文件

2.1.2 标志符

2.1.3 使用直接URDF内容

2.2 自碰撞

2.2.1 配置自碰撞对

2.2.1.1 禁用所有碰撞

2.2.1.2 指定碰撞对

2.2.2 使用自身碰撞

2.2.2.1 检查自身碰撞

2.2.2.2 检查最近距离

2.2.3 另请参阅

2.3 关节构型

2.3.1 机器人状态

2.3.2 获取所有关节名称

2.3.3 积分

2.3.4 关节限制

2.3.5 添加构型噪声

2.3.6 转子惯量与齿轮比

2.4 坐标系

2.4.1 给定坐标系到世界坐标系转换

2.4.2 在世界坐标系中移动机器人

2.4.3 坐标系间变换

三、坐标系工具

3.1 坐标系偏航角

3.2 在地面上压平

3.3 围绕轴旋转

3.4 最优变换

3.2 插值

3.2.1 坐标系插值

3.2.2 三次样条曲线

3.3.3 3D 立方样条曲线

四、可视化

4.1 可视化

4.1.1 命令行可视化

4.1.2 机器人可视化

4.1.3 自定义坐标系

4.1.4 点

4.1.5 线条

4.1.6 箭头


前言

        PlaCo 是一款基于二次规划求解器的全身逆运动学与动力学实现方案。

        采用 C++ 编写,提供 Python 绑定以实现便捷原型开发,同时可作为独立库用于嵌入式应用。


一、安装

1.1 使用PIP安装

        PlaCo可在PyPI上获取,并可通过pip安装:

pip install placo

        如果您的架构有现成的二进制轮子可用,则会直接下载该轮子。否则,将基于cmeel进行即时构建。

1.2 从源代码安装

        PlaCo主要采用C++编写,并依赖Boost Python将C++代码暴露给Python。若需自行获取源代码,您需先获取依赖项,然后编译库文件。

1.2.1 系统依赖项

        您可以使用以下方式安装系统依赖项:

bash scripts/requirements.sh

        来自存储库。

注意

        上述脚本将为 robotpkg 设置 apt 软件源,并在您的 .bashrc 文件中添加额外构型。之后您可能需要重新加载 bash 终端。

在旧系统上安装

        上述场景已在 Ubuntu 22.04 上测试通过。若需在旧版本系统上构建,可能需要调整以下内容:

  • 修改上述 apt 命令中的 Python 版本(例如将 py310 替换为 py38 以适配 Python 3.8)
  • 安装至少 3.4.0 版本的 Eigen

1.2.2 克隆与构建

        现在您可以克隆 PlaCo:

git clone https://www.github.com/rhoban/placo.git

        并使用CMake进行构建:

cd placo
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j 8

1.2.3 使用内置的Python绑定

        现在您可以将build/lib/python3-X/site-packages目录添加到PYTHONPATH环境变量中,即可使用PlaCo。

二、加载机器人

2.1 加载您的机器人

        要加载机器人,您需要使用RobotWrapper类。该类封装了机器人模型和状态,并提供了所有便捷方法供您与机器人模型交互。

2.1.1 使用URDF文件

        要加载您的机器人,只需按以下方式指定URDF文件:

import placo
robot = placo.RobotWrapper("model/robot.urdf")

注意

        若仅指定目录,则将加载 robot.urdf 文件。

2.1.2 标志符

        RobotWrapper 的第二个参数是用于指定修饰符的标志符。可用的标志符如下:

标识符

描述

placo.Flags.collision_as_visual

加载碰撞几何体作为视觉几何体。

placo.Flags.ignore_collisions

忽略所有碰撞(移除所有碰撞对)。

        有关自碰撞处理的更多信息,请参阅自碰撞。例如:

import placo
# Loading a robot, ignoring all collisions
robot = placo.RobotWrapper("model/robot.urdf", placo.Flags.ignore_collisions)

2.1.3 使用直接URDF内容

        若需直接提供URDF文件内容,可指定RobotWrapper的第三个参数:

import placo
# Providing directly the URDF contents
robot = placo.RobotWrapper("model/", 0, urdf_contents)

2.2 自碰撞

2.2.1 配置自碰撞对

        默认情况下,加载机器人时所有碰撞对都将启用。

2.2.1.1 禁用所有碰撞

        通过在加载机器人时传递placo.Flags.ignore_collisions标志(参见标志),可禁用所有碰撞检测。

2.2.1.2 指定碰撞对

        若需指定要启用的碰撞对,可在.urdf文件旁创建collisions.json文件,其结构如下:

[
    ["body1", "body2"],
    ["body3", "body4"]
]

        其中body1、body2、body3和body4是您希望启用碰撞检测的物体名称。这些物体名称应与URDF文件中链接的名称一致。

注意

        除了使用链接名称(字符串)外,您还可以使用代表几何对象的整数(如碰撞对象中返回的那些)。借助此特性,可以编写脚本自动采样机器人构型并生成碰撞文件 collisions.json。

注意

        也可以通过调用 placo.RobotWrapper.load_collision_pairs() 显式加载碰撞对。

2.2.2 使用自身碰撞

2.2.2.1 检查自身碰撞

        通过调用 self_collisions(),您可以将当前自身碰撞作为 Collision 对象的列表获取。

2.2.2.2 检查最近距离

        通过调用 distances() 方法,可获取当前所有碰撞对之间最小距离的列表,该列表由 Distance 对象组成。

2.2.3 另请参阅

        使用运动学求解器时,可调用 KinematicsSolver.add_avoid_self_collisions_constraint 为求解器添加约束,从而防止自身碰撞。

2.3 关节构型

2.3.1 机器人状态

        机器人构型存储在RobotWrapper类的状态成员中:

  • robot.state.q 用于获取关节位置\boldsymbol{q},可使用辅助函数:
    • set_joint:设置指定关节名称的关节值,
    • set_joint_velocity:设置指定关节名称的关节速度。
  • robot.state.qd 用于获取关节速度\dot{\boldsymbol{q}},您可以使用以下辅助函数:
    • get_joint_velocity:获取指定关节名称的关节速度,
    • set_joint_velocity:设置指定关节名称的关节速度。
  • robot.state.qdd 用于获取关节加速度\ddot{\boldsymbol{q}},您可以使用以下辅助函数:
    • get_joint_acceleration:获取指定关节名称的关节加速度,
    • set_joint_acceleration:设置指定关节名称的关节加速度。

        例如:

# Sets head_pan joint to 0.5 rad
robot.set_joint("head_pan", 0.5)

2.3.2 获取所有关节名称

        所有关节名称均可通过调用 joint_names() 函数获取。

2.3.3 积分

        您可以调用 integrate 函数对机器人状态进行积分。该函数将对机器人在给定时间间隔 dt 内的加速度、速度和位置进行积分处理。

2.3.4 关节限制

        默认情况下,限制值从URDF文件加载。但您可通过set_joint_limits覆盖关节限制:

# Sets head_pan joint limits to [-1.0, 1.0] rad
robot.set_joint_limits("head_pan", -1.0, 1.0)

        您还可以分别使用 set_velocity_limit 和 set_torque_limit 来更新速度和扭矩限制。

2.3.5 添加构型噪声

        您可以调用 add_q_noise 方法为关节位置添加噪声:

# Adds noise to the joint positions
robot.add_q_noise(0.01)

        噪声参数取值范围为0到1之间。系统将在机器人运动范围内随机采样一个构型,并逐步更新构型以趋近该构型。

2.3.6 转子惯量与齿轮比

        为考虑明显的惯性效应,可通过调用 set_rotor_inertia() 和 set_gear_ratio() 函数设置转子惯量及关节传动比:

# Sets the rotor inertia to 1e-5 N.m.s^2
robot.set_rotor_inertia("head_pan", 1e-5)

# Sets the gear ratio of the head_pan joint to 100
robot.set_gear_ratio("head_pan", 100)

        转子惯量为I _ { r o t o r }且齿轮传动比为G时,将使该关节的有效惯量改变I _ { r o t o r } \times G ^ { 2 }

2.4 坐标系

重要提示

        每次机器人内部状态发生变化时,必须调用update_kinematics方法以确保坐标系保持最新状态。

2.4.1 给定坐标系到世界坐标系转换

        可通过get_T_world_frame获取从给定帧到世界坐标系的4x4转换矩阵:

# Retrieve the body to world transformation (4x4) matrix
T_world_body = robot.get_T_world_frame('body')

2.4.2 在世界坐标系中移动机器人

        您可以通过调用 set_T_world_frame 函数在世界中移动机器人。该操作将实际更新机器人的浮动基座(即根关节)。

# Move the robot in the world (left foot frame will be at the origin)
robot.set_T_world_frame('left_foot', np.eye(4))

2.4.3 坐标系间变换

        通过get_T_a_b函数可获取从给定坐标系_b到另一坐标系_a的4x4变换矩阵:

# Retrieve the transformation matrix from the left foot to the right foot
T_rightFoot_leftFoot = robot.get_T_a_b('right_foot', 'left_foot')

三、坐标系工具

3.1 坐标系偏航角

        frame_yaw 方法提取给定坐标系的偏航角。

3.2 在地面上压平

        flatten_on_floor 方法可用于将坐标系在地面上压平。该方法将坐标系的 z 分量、俯仰角和横滚角设置为零。

3.3 围绕轴旋转

        rotation_from_axis 方法构建旋转矩阵,使给定轴指向指定方向。请注意此处存在任意选择,但结果具有确定性。

        若仅关注特定轴(例如法线表面),此方法将非常便捷。

围绕轴旋转示例

        以下示例展示了rotation_from_axis函数的运行结果,要求旋转矩阵追踪紫色箭头。每次完成整圈旋转时,旋转轴会周期性地在x、y和z轴之间切换。

3.4 最优变换

        对于给定的两组点,可使用 optimal_transformation 函数在它们之间寻找最优变换。

        当某些点用于检索对应变换时,此工具便显得尤为实用。

最优变换示例

        在下图示例中,通过计算地板上红色标记点与机器人腿部之间的最优变换,可确定将机器人放置于地板上的最佳匹配位置。此方法可用于状态估计。

3.2 插值

3.2.1 坐标系插值

        interpolate_frames 函数可用于在两个坐标系之间进行插值。

# Interpolating between frame1 and frame2
# The last argument (AtoB) is the interpolation factor: 0: frameA, 1: frameB
T_world_interpolated = placo.interpolate_frames(T_world_frameA, T_world_frameB, 0.2)

3.2.2 三次样条曲线

        CubicSpline 类可用于创建点到点的轨迹,同时施加速度。

spline = placo.CubicSpline()

# Arguments are time, position and velocity
spline.add_point(0.0, 0.0, 0.0)
spline.add_point(1.0, 3.0, 0.0)
spline.add_point(2.0, -2.0, 0.0)
spline.add_point(3.0, 0.0, 0.0)

# Retrieving the position, velocity and acceleration at time t with:
t = 0.5
pos = spline.pos(t)
vel = spline.vel(t)
acc = spline.acc(t)

3.3.3 3D 立方样条曲线

        CubicSpline3D 类可用于创建三维空间中的点到点轨迹。它本质上将三个 CubicSpline 对象封装在一起。

spline = placo.CubicSpline3D()

# The API is similar to CubicSpline, with a convenient wrapper of dimension 3
spline.add_point(0., np.array([0., 0., 0.]), np.array([0., 0., 0.]))
spline.add_point(1., np.array([3., 0., 0.]), np.array([0., 0., 0.]))
spline.add_point(2., np.array([0., 3., 0.]), np.array([0., 0., 0.]))
spline.add_point(3., np.array([0., 0., 3.]), np.array([0., 0., 0.]))

# Positions, velocities and acceleration will return 3D vectors
pos = spline.pos(0.5)

四、可视化

4.1 可视化

        PlaCo 提供基于 meshcat 的基础可视化工具。这些辅助工具采用 Python 编写,收录于 placo_utils 包中。

4.1.1 命令行可视化

        以下工具用于可视化机器人:

python -m placo_utils.view path_to_robot/robot.urdf

        您可以提供以下参数:

  • --frames [坐标系1 [坐标系2 [...]]]: 待可视化的坐标系列表
  • --animate 用于驱动机器人(将对关节施加正弦运动)

4.1.2 机器人可视化

        您可以使用 robot_viz 可视化机器人,并使用 robot_frame_viz 可视化附着在机器人上的坐标系。

4.1.3 自定义坐标系

        您可以通过将T_world_frame作为参数传递,使用frame_viz可视化世界坐标系中的任意帧.

4.1.4 点

        您可以使用 point_viz 可视化单个点,或使用 points_viz 可视化点列表。

4.1.5 线条

        您可以使用 line_viz 可视化线条。

4.1.6 箭头

        您可以使用 arrow_viz 可视化箭头。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐