本教程将向您介绍如何将对象插入规划场景并围绕它们进行规划。
先决条件
如果您还没有这样做,请确保您已完成RViz 中的可视化hello_moveit
中的步骤。本项目假设您从上一个教程结束的地方开始。如果您只想运行本教程,您可以按照Docker 指南启动一个包含已完成教程的容器。
步骤
1 添加规划场景接口
在源文件的顶部,将其添加到包含列表中:
#include <moveit/planning_scene_interface/planning_scene_interface.h>
2 改变目标姿势
首先,通过以下更改更新目标姿势,使机器人规划到不同的位置:
// Set a target Pose with updated values !!! auto const target_pose = [] { geometry_msgs::msg::Pose msg; msg.orientation.y = 0.8; msg.orientation.w = 0.6; msg.position.x = 0.1; msg.position.y = 0.4; msg.position.z = 0.4; return msg; }(); move_group_interface.setPoseTarget(target_pose);
3 创建碰撞对象
在下一个代码块中,我们创建一个碰撞对象。首先要注意的是,它被放置在机器人的坐标系中。如果我们有一个感知系统来报告场景中障碍物的位置,那么这就是它会构建的消息类型。因为这只是一个示例,所以我们是手动创建的。在这个代码块的末尾要注意的一件事是,我们将此消息上的操作设置为ADD
。这会导致对象被添加到碰撞场景中。将此代码块放在上一步设置目标姿势和创建计划之间。
// Create collision object for the robot to avoid auto const collision_object = [frame_id = move_group_interface.getPlanningFrame()] { moveit_msgs::msg::CollisionObject collision_object; collision_object.header.frame_id = frame_id; collision_object.id = "box1"; shape_msgs::msg::SolidPrimitive primitive; // Define the size of the box in meters primitive.type = primitive.BOX; primitive.dimensions.resize(3); primitive.dimensions[primitive.BOX_X] = 0.5; primitive.dimensions[primitive.BOX_Y] = 0.1; primitive.dimensions[primitive.BOX_Z] = 0.5; // Define the pose of the box (relative to the frame_id) geometry_msgs::msg::Pose box_pose; box_pose.orientation.w = 1.0; // We can leave out the x, y, and z components of the quaternion since they are initialized to 0 box_pose.position.x = 0.2; box_pose.position.y = 0.2; box_pose.position.z = 0.25; collision_object.primitives.push_back(primitive); collision_object.primitive_poses.push_back(box_pose); collision_object.operation = collision_object.ADD; return collision_object; }();
4 将对象添加到规划场景
最后,我们需要将此对象添加到碰撞场景中。为此,我们使用一个名为的对象,该对象PlanningSceneInterface
使用 ROS 接口将规划场景的更改传达给MoveGroup
。此代码块应直接跟在创建碰撞对象的代码块后面。
// Add the collision object to the scene moveit::planning_interface::PlanningSceneInterface planning_scene_interface; planning_scene_interface.applyCollisionObject(collision_object);
5 运行程序并观察变化
就像我们在上一个教程中所做的那样,使用demo.launch.py
脚本启动 RViz 并运行我们的程序。如果您使用的是 Docker 教程容器之一,则可以指定已添加 RvizVisualToolsGui 面板的其他 RViz 配置:
ros2 launch moveit2_tutorials demo.launch.py rviz_config:=kinova_hello_moveit.rviz
概括
-
您使用 MoveIt 扩展了编写的程序,以便围绕场景中的对象进行规划。