datetime:2025/04/27 16:39
author:nzb

生成阶段

生成阶段不从相邻阶段获得输入。它们计算结果并传递给相邻阶段。

MTC 提供以下生成器级:

  • CurrentState
  • FixedState
  • Monitoring Generators - GeneratePoseGenerateGraspPoseGeneratePlacePoseGenerateRandomPose

CurrentState

CurrentState 阶段通过 get_planning_scene 服务获取当前的规划场景。 该阶段通常用于 MTC 任务流水线的开头,以便根据当前机器人状态设置起始状态。

示例代码

auto current_state = std::make_unique<moveit::task_constructor::stages::CurrentState>("current_state");

API doc for CurrentState.

FixedState

固定状态阶段会生成一个预定义的规划场景状态。

moveit::task_constructor::Task t;
auto node = rclcpp::Node::make_shared("node_name");
t.loadRobotModel(node);

auto scene = std::make_shared<planning_scene::PlanningScene>(t.getRobotModel());
auto& state = scene->getCurrentStateNonConst();
state.setToDefaultValues();  // initialize state
state.setToDefaultValues(state.getJointModelGroup("left_arm"), "home");
state.setToDefaultValues(state.getJointModelGroup("right_arm"), "home");
state.update();
spawnObject(scene); // User defined function to add a CollisionObject to planning scene

auto initial = std::make_unique<stages::FixedState>();
initial->setState(scene);

API doc for FixedState.

Monitoring Generators

监控生成器有助于监控和使用另一个阶段的解决方案。

GeneratePose

GeneratePose 是一个监控生成器阶段,可用于根据被监控阶段提供的解决方案生成姿势。

GenerateGraspPose

GenerateGraspPose 阶段源于 GeneratePose,后者是一个监控生成器。 该阶段通常会监控 "当前状态 "阶段,因为该阶段需要最新的 "规划场景"(PlanningScene)来找到将围绕其生成抓取姿势的对象位置。 该阶段可通过设置所需的属性来生成抓取姿势。 设置同一属性可以有多种方法。例如,如下表所示,有两种功能可以设置预抓取姿势。用户可以通过使用字符串组状态或明确定义机器人状态来设置该属性。

由用户设置的属性表

Property Name Function to set property Description
eef void setEndEffector(std::string eef) Name of end effector
object void setObject(std::string object) Object to grasp. This object should exist in the planning scene.
angle_delta void setAngleDelta(double delta) Angular steps (rad). The target grasp pose is sampled around the object’s z axis
pregrasp void setPreGraspPose(std::string pregrasp) Pregrasp pose. For example, the gripper has to be in an open state before grasp. The pregrasp string here corresponds to the group state in SRDF.
pregrasp void setPreGraspPose(moveit_msgs/RobotState pregrasp) Pregrasp pose
grasp void setGraspPose(std::string grasp) Grasp pose
grasp void setGraspPose(moveit_msgs/RobotState grasp) Grasp pose

有关代码的最新状态,请参阅 API 文档。GenerateGraspPoseAPI 文档

示例代码

auto initial_stage = std::make_unique<stages::CurrentState>("current state");
task->add(initial_stage);

auto gengrasp = std::make_unique<stages::GenerateGraspPose>("generate grasp pose");
gengrasp->setPreGraspPose("open");
gengrasp->setObject("object");
gengrasp->setAngleDelta(M_PI / 10.);
gengrasp->setMonitoredStage(initial_stage);
task->add(gengrasp);

GeneratePlacePose

GeneratePlacePose 阶段源于 GeneratePose,后者是一个监控生成器。

该阶段为放置流水线生成姿势。

请注意,GenerateGraspPose 生成的姿势有一个角度_delta 间隔,而 GeneratePlacePose 的采样量是固定的,取决于对象的形状。

示例代码

// Generate Place Pose
auto stage = std::make_unique<stages::GeneratePlacePose>("generate place pose");
stage->properties().configureInitFrom(Stage::PARENT, { "ik_frame" });
stage->properties().set("marker_ns", "place_pose");
stage->setObject(params.object_name);

// Set target pose
geometry_msgs::msg::PoseStamped p;
p.header.frame_id = params.object_reference_frame;
p.pose = vectorToPose(params.place_pose);
p.pose.position.z += 0.5 * params.object_dimensions[0] + params.place_surface_offset;
stage->setPose(p);
stage->setMonitoredStage(pick_stage_ptr);  // hook into successful pick solutions

API doc for GeneratePlacePose.

GenerateRandomPose

生成随机姿态(GenerateRandomPose)阶段源于生成姿态(GeneratePose),后者是一个监控生成器。 该阶段为姿态维度(X/Y/Z/ROLL/PITCH/YAW)配置随机数分布(见 https://en.cppreference.com/w/cpp/numeric/random)采样器,以随机化姿态。

由用户设置的属性表

Property Name Function to set property Description
max_solution void setMaxSolution(size_t max_solution) Limit of the number of spawned solutions in case randomized sampling is enabled.

FixedCartesianPose

固定笛卡尔姿态(FixedCartesianPose)生成一个固定的笛卡尔姿态。该阶段不进行采样。该阶段适用于从预期的未来状态进行规划,从而实现同步规划和执行等功能。

results matching ""

    No results matching ""