Moveit! 学习记录2——moveit避障

本文详细描述了如何在Moveit!环境中通过替换规划器来比较不同路径规划算法的避障性能,包括设置障碍物、调整CMakeLists以及在rviz中观察结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

续学习记录1,进行不同规划器的避障效果比较

Moveit!避障实验

通过更换不同的规划器,比较不同路径规划算法的避障效果

过程如下

1.首先在moveitServerCpp.cpp文件下,设置障碍物

在create_table函数中添加和修改即可

我一共设置了两个物体,一个绿色的底板,用于防止机械臂穿模到地下;另外设置了一个障碍物,代码如下

void create_table() {        
        ros::Publisher planning_scene_diff_publisher =     nh_.advertise<moveit_msgs::PlanningScene>("planning_scene", 1);
        ros::WallDuration sleep_t(0.5);
        while (planning_scene_diff_publisher.getNumSubscribers() < 1)
        {
         sleep_t.sleep()      
        }
        moveit::planning_interface::PlanningSceneInterface planning_scene_interface;
        moveit_msgs::PlanningScene planning_scene;
        moveit_msgs::CollisionObject collision_object;
        collision_object.header.frame_id = arm_->getPlanningFrame();
        // The id of the object is used to identify it.
        collision_object.id = "table";
        // Define a box to add to the world.
        shape_msgs::SolidPrimitive primitive;
        primitive.type = primitive.BOX;
        primitive.dimensions.resize(3);
        primitive.dimensions[primitive.BOX_X] = 2;   //长宽2米,高0.01米
        primitive.dimensions[primitive.BOX_Y] = 2;
        primitive.dimensions[primitive.BOX_Z] = 0.01;
        // Define a pose for the box (specified relative to frame_id)
        geometry_msgs::Pose box_pose;
        box_pose.orientation.w = 1.0;                    //设置box的位姿
        box_pose.position.x = 0.0;
        box_pose.position.y = 0.0;
        box_pose.position.z = -0.01/2 -0.02;
        collision_object.primitives.push_back(primitive);
        collision_object.primitive_poses.push_back(box_pose);
        collision_object.operation = collision_object.ADD;   //若要放置两个物体,把从这往上到Define a box to add to the world再复制一份
        planning_scene.world.collision_objects.push_back(collision_object);
        planning_scene.is_diff = true;
        planning_scene_diff_publisher.publish(planning_scene);​
        ROS_INFO("Added an table into the world");
        // Define a box to add to the world.
        shape_msgs::SolidPrimitive primitive1;
        primitive1.type = primitive1.BOX;
        primitive1.dimensions.resize(3);
        primitive1.dimensions[primitive1.BOX_X] = 0.2;   //长宽2米,高0.01米
        primitive1.dimensions[primitive1.BOX_Y] = 0.2;
        primitive1.dimensions[primitive1.BOX_Z] = 0.2;
        // Define a pose for the box (specified relative to frame_id)
        geometry_msgs::Pose box_pose1;
        box_pose1.orientation.w = 1.0;                    //设置box的位姿
        box_pose1.position.x = 0.4;
        box_pose1.position.y = 0.0;
        box_pose1.position.z = -0.01/2 ;
        collision_object.primitives.push_back(primitive1);
        collision_object.primitive_poses.push_back(box_pose1);
        collision_object.operation = collision_object.ADD;   //若要放置两个物体,把从这往上到Define a box to add to the world再复制一份
        planning_scene.world.collision_objects.push_back(collision_object);
        planning_scene.is_diff = true;
        planning_scene_diff_publisher.publish(planning_scene);
        ROS_INFO("Added an table into the world");
    }

2.更改cmakelist

add_executable(moveitServerCpp src/moveitServerCpp.cpp)
target_link_libraries(moveitServerCpp ${catkin_LIBRARIES})

然后编译

3.启动模型的rviz看效果

启动后,运行cpp文件可以看到路径规划的避障效果

4.更换不同的规划器

在moveit_control类中更换即可

更换后重新编译再运行

比较不同的避障效果

规划成功

如果规划失败,如下图

 可以更换规划器,如果还不行,就是你设置的那个点确实到不了,换点试试

### MoveIt 中的避障路径规划实现 #### 工作原理概述 MoveIt 是一个功能强大的机器人运动规划框架,它通过集成多种路径规划算法来支持复杂的任务需求。其中,避障路径规划是其核心功能之一。MoveIt 使用场景管理工具(Planning Scene Manager)加载环境模型,并利用路径规划库 OMPL 或其他插件化规划器生成无碰撞的路径。 在实际应用中,避障路径规划的过程通常分为以下几个方面: 1. **环境建模** - MoveIt 的 `planning_scene` 提供了一个虚拟的工作空间表示方法,能够描述静态障碍物以及动态物体的位置和形状[^2]。 - 用户可以通过 ROS 消息或者 API 接口向 `planning_scene` 添加、删除或更新障碍物信息。 2. **路径规划算法** - 默认情况下,MoveIt 使用 Open Motion Planning Library (OMPL) 来执行路径规划操作。OMPL 支持许多先进的采样型路径规划算法,例如 RRT* 和 PRM* 等[^3]。 - 此外,还可以选择其他扩展性的规划器,比如 CHOMP 或 STOMP 这些基于优化的方法。 3. **碰撞检测与验证** - 在每次计算得到候选路径之后,MoveIt 会调用内置的 FCL 库来进行精确的碰撞检测,确保最终选定的轨迹不会违反任何约束条件[^4]。 以下是具体的一个 C++ 示例程序片段展示如何设置目标姿态并请求带避障功能的动作计划: ```cpp // 创建 move_group_interface 对象实例 moveit::planning_interface::MoveGroupInterface move_group("manipulator"); // 设置末端效应器的目标位置姿势 geometry_msgs::Pose target_pose; target_pose.orientation.w = 1.0; target_pose.position.x = 0.28; target_pose.position.y = -0.7; target_pose.position.z = 1.0; move_group.setPoseTarget(target_pose); // 计划动作序列 moveit::planning_interface::MoveGroupInterface::Plan my_plan; bool success = (move_group.plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS); if(success){ // 如果成功,则执行该计划 move_group.execute(my_plan); } ``` 此代码展示了基本流程:定义目标状态;让系统尝试找到连接当前配置到期望终点的有效路线;最后如果一切顺利的话就实施这个解决方案。 #### 关键技术细节说明 - **RRT 变体的应用**: 如前所述,在某些场合下可能需要用到快速随机树(Rapidly-exploring Random Trees, RRTs),特别是当面对高维连续空间时更为有效。这些变种版本如 RRT*-Connect 不仅提高了效率而且改善了所得解的质量。 - **实时性能考量**: 尽管理论上有众多优秀的全局最优求解策略可供选用,但在实际工业应用场景里往往更倾向于那些能够在较短时间内给出满意近似解答的技术方案。因此像 BIT* 或者 LazyPRM 这样的增量改进型算法也逐渐受到重视。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值