MoveIt 任务构造器
什么是 MoveIt 任务构造器?

MTC 阶段
与结果流相关的可能阶段有三个:
生成器
传播器
连接器
生成器阶段

CurrentState
,它将当前机器人状态作为规划管道的起点。GeneratePose
。它通常监控 CurrentState
或 ModifyPlanningScene
阶段。通过监控 CurrentState
的解决方案,GeneratePose
阶段可以找到它应该围绕其生成姿势的对象或框架。传播阶段

连接阶段

包装器
计算 IK
用于``生成抓取姿势`` 阶段。生成抓取姿势
阶段将产生笛卡尔姿势解决方案。通过将``计算 IK`` 阶段包装在``生成姿势`` 阶段周围,来自``生成姿势`` 阶段的笛卡尔姿势解决方案可用于生成 IK 解决方案(即)生成机器人的关节状态配置以达到姿势。|有关 MTC 提供的包装器的更多信息,请参见此处 - 包装器。
MTC 容器
当前可用的容器:
串行
并行
串行容器
并行容器
并行容器组合了一组阶段,允许规划替代解决方案。
初始化 MTC 任务
顶层规划问题被指定为 MTC 任务,由阶段指定的子问题被添加到 MTC 任务对象中。
auto node = std::make_shared<rclcpp::Node>();
auto task = std::make_unique<moveit::task_constructor::Task>();
task->loadRobotModel(node);
// Set controllers used to execute robot motion. If not set, MoveIt has controller discovery logic.
task->setProperty("trajectory_execution_info", "joint_trajectory_controller gripper_controller");
向 MTC 任务添加容器和阶段
向 MTC 任务添加阶段
auto current_state = std::make_unique<moveit::task_constructor::stages::CurrentState>("current_state");
task->add(std::move(current_state));
容器源自 Stage,因此可以类似地将容器添加到 MTC 任务中
auto container = std::make_unique<moveit::task_constructor::SerialContainer>("Pick Object");
// TODO: Add stages to the container before adding the container to MTC task
task->add(std::move(container));
设置规划求解器
执行运动规划的阶段需要求解器信息。
MTC 中可用的求解器
PipelinePlanner
- 使用 MoveIt 的规划管道JointInterpolation
- 在起始和目标关节状态之间进行插值。它不支持复杂的运动。CartesianPath
- 在笛卡尔空间中沿直线移动末端执行器。
有关如何初始化求解器的代码示例
const auto mtc_pipeline_planner = std::make_shared<moveit::task_constructor::solvers::PipelinePlanner>(
node, "ompl", "RRTConnectkConfigDefault");
const auto mtc_joint_interpolation_planner =
std::make_shared<moveit::task_constructor::solvers::JointInterpolationPlanner>();
const auto mtc_cartesian_planner = std::make_shared<moveit::task_constructor::solvers::CartesianPath>();
这些求解器将被传递到“MoveTo”、“MoveRelative”和“Connect”等阶段。
设置属性
void setProperty(const std::string& name, const boost::any& value);
阶段成本计算器
CostTerm 是计算 MTC 阶段解决方案成本的基本接口。
MTC 中可用的 CostTerm 实现
Constant
- 为每个解决方案添加一个恒定成本PathLength
- 成本取决于轨迹长度,不同关节的权重可选TrajectoryDuration
- 成本取决于整个轨迹的执行持续时间TrajectoryCostTerm
- 仅适用于 SubTrajectory 解决方案的成本术语LambdaCostTerm
- 传入 lambda 表达式来计算成本DistanceToReference
- 成本取决于到参考点的加权关节空间距离LinkMotion
- 成本取决于链接的笛卡尔轨迹长度Clearance
- 成本是碰撞距离的倒数
如何使用 LambdaCostTerm
设置 CostTerm 的示例代码
stage->setCostTerm(moveit::task_constructor::LambdaCostTerm(
[](const moveit::task_constructor::SubTrajectory& traj) { return 100 * traj.cost(); }));
MTC 提供的所有阶段都有默认的成本条款。产生轨迹作为解决方案的阶段通常使用路径长度来计算成本。
规划和执行 MTC 任务
规划 MTC 任务将返回“MoveItErrorCode”。
请参阅:moveit_msgs_codedir:here
以识别不同的错误类型。
如果规划成功,您可以预期计划函数将返回“moveit_msgs::msg::MoveItErrorCodes::SUCCESS”。
auto error_code = task.plan()
规划后,提取第一个成功的解决方案并将其传递给执行函数。这将创建一个“execute_task_solution”操作客户端。 操作服务器位于 MTC 提供的“execute_task_solution_capability”插件中。 该插件扩展了“MoveGroupCapability”。它从 MTC 解决方案构建了一个“MotionPlanRequest”,并使用 MoveIt 的“PlanExecution”来启动机器人。
auto result = task.execute(*task.solutions().front());
附加信息的链接
这里有一个 教程,介绍如何使用 MTC 创建拾取和放置管道。
下面列出的链接包含有关 MTC 提供的阶段和容器的更多信息