Placo 入门教程(一)安装与使用
摘要:PlaCo是一款基于C++开发的全身逆运动学与动力学求解器,提供Python绑定以支持快速原型开发。文档详细介绍了安装方法(PIP和源码编译)、机器人模型加载(支持URDF文件)、自碰撞检测配置、关节状态管理、坐标系变换工具以及可视化功能。关键特性包括:支持机器人构型积分与噪声添加、关节限制设置、转子惯量建模、三维轨迹插值(三次样条曲线)以及基于meshcat的可视化工具,适用于机器人运动规
系列文章目录
目录
前言
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 的第二个参数是用于指定修饰符的标志符。可用的标志符如下:
|
标识符 |
描述 |
|---|---|
|
|
加载碰撞几何体作为视觉几何体。 |
|
|
忽略所有碰撞(移除所有碰撞对)。 |
有关自碰撞处理的更多信息,请参阅自碰撞。例如:
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 用于获取关节位置
,可使用辅助函数:
- set_joint:设置指定关节名称的关节值,
- set_joint_velocity:设置指定关节名称的关节速度。
- robot.state.qd 用于获取关节速度
,您可以使用以下辅助函数:
- get_joint_velocity:获取指定关节名称的关节速度,
- set_joint_velocity:设置指定关节名称的关节速度。
- robot.state.qdd 用于获取关节加速度
,您可以使用以下辅助函数:
- 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)
转子惯量为且齿轮传动比为
时,将使该关节的有效惯量改变
。
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 可视化箭头。
更多推荐



所有评论(0)