操纵运动规划
ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html
Isaac SDK 为机械臂的运动规划提供了以下组件:
-
EndEffectorGlobalPlanner:使用逆运动学将末端执行器的笛卡尔目标转换为关节角度目标。 此小码可以接收笛卡尔目标(3d 姿势)作为复合消息,或从姿势树中读取。
-
MultiJointPlanner:生成轨迹以将关节列表从起始状态移动到目标状态。 该组件包含消息的通用解析代码,并且需要一个额外的组件来实现 MultiJointPlannerInterface。
-
MultiJointLqrPlanner:使用 LQR 实现 MultiJointPlannerInterface。 LQR 求解器将每个关节独立对待,并自动调整时间以找到不超过最小和最大速度和加速度约束的有效轨迹。 它还确保轨迹中的最后一个状态是接收到的目标。
该组件仅在目标更改时输出新计划。 使用 speed_max、speed_min、acceleration_max 和 acceleration_min 配置参数确保计划对机器人可行。
-
MultiJointRmpPlanner:使用 RMPFlow 实现 MultiJointPlannerInterface。 它通过在多个时间步长上整合 RMPFlow 策略的输出来输出短轨迹。 因为 RMPFlow 充当本地反应控制器,所以它期望目标状态不会离起始位置太远。 有关 RMPFlow 工作原理的更多信息,请参阅下面的论文。
-
MultiJointController:对从规划器接收到的轨迹进行插值以确定要发送的当前命令。 此小代码可以根据 control_mode 配置输出关节位置或速度命令。 插值基于轨迹中的时间戳和当前滴答时间——具有小的前瞻性,可以使用 command_delay 配置参数进行配置,以考虑控制循环中的延迟。
这些小码需要一个 kinematic_tree 配置参数,该参数必须引用一个 kinematic-tree 文件。 小代码使用运动树配置来检索关节的数量及其名称,以解析和序列化 CompositeProto 消息。 有关创建运动学树文件的更多信息,请参阅操纵运动学文档。
操纵子图
Isaac SDK 提供了一个集成了 MultiJointPlanner、MultiJointController 和 KinematicTree 组件的子图。 您可以在 packages/planner/apps/multi_joint_lqr_control.subgraph.json(使用 MultiJointLqrPlanner)或 packages/planner/apps/multi_joint_rmp_control.subgraph.json(使用 MultiJointRmpPlanner)找到这个子图。 子图提供以下接口边:
-
state (input): “subgraph/interface/joint_state”
-
target (input): “subgraph/interface/joint_target”
-
command (output): “subgraph/interface/joint_command”
消息
与操作相关的组件使用 CompositeProto 消息进行通信。 具有 rank-1 张量的 CompositeProto 用于单个状态或命令。 以下示例显示了两个关节的状态:
CompositeProto: {
"schema": [
{"entity": "shoulder", "element_type": Float64, "measure": Position},
{"entity": "shoulder", "element_type": Float64, "measure": Speed},
{"entity": "elbow", "element_type": Float64, "measure": Position},
{"entity": "elbow", "element_type": Float64, "measure": Speed}
],
"schema_hash": "...",
"values": {
"element_type": Float64,
"sizes": [19],
"dataBufferIndex": 0
}
}
buffers: [[0.7, 0.3, -0.4, 0.1]]
具有 2 阶张量的 CompositeProto 表示轨迹。 张量的第一个维度是时间步数。 每个时间步长的时间戳都是架构的一部分。 以下示例显示了两个关节在 t=0 和 t=0.1 时具有两个时间步长的轨迹:
CompositeProto: {
"schema": [
{"entity": "timestamp", "element_type": Float64, "measure": Time},
{"entity": "joint1", "element_type": Float64, "measure": Position},
{"entity": "joint2", "element_type": Float64, "measure": Position},
{"entity": "joint1", "element_type": Float64, "measure": Speed},
{"entity": "joint2", "element_type": Float64, "measure": Speed}
],
"schema_hash": "...",
"values": {
"element_type": Float64,
"sizes": [10 , 4],
"dataBufferIndex": 0
}
}
buffers: [[[0, 0.3, 0.7, -0.4, 0.1], [0.1, 0.32, 0.72, -0.3, 0.15]]]
更多精彩内容:
https://www.nvidia.cn/gtc-global/?ncid=ref-dev-876561