ROS2极简总结-MoveIt2

举报
zhangrelay 发表于 2021/08/04 22:46:44 2021/08/04
【摘要】 用于 ROS 2 的 MoveIt 运动规划框架。 The MoveIt Motion Planning Framework for ROS 2.   参考文献:MoveIt2 MoveIt2功能 运动规划 生成高自由度轨迹可在杂乱的环境中运动并避免局部最小值操纵 通过抓取生成分析环境并与环境交互逆向运动学 求解给定姿势的关节位置...

用于 ROS 2 的 MoveIt 运动规划框架。

The MoveIt Motion Planning Framework for ROS 2


 参考文献:MoveIt2


MoveIt2功能

  • 运动规划
    • 生成高自由度轨迹
    • 可在杂乱的环境中运动并避免局部最小值
  • 操纵
    • 通过抓取生成分析环境并与环境交互
  • 逆向运动学
    • 求解给定姿势的关节位置,也适用于过度制动的手臂中
  • 控制
    • 使用通用接口对低级硬件控制器执行时间参数化联合轨迹
  • 3D 感知
    • 使用 Octomaps 连接深度传感器和点云
  • 碰撞检查
    • 使用几何图元、网格纹理或点云避开障碍物

时间线


MoveIt2(ROS2) vs MoveIt1(ROS1)

  • 实时功能现已可用(ROS2)
  • 专为生产而设计 - 同样支持研发
  • 多平台:Linux、Windows、macOS 全部都支持!

里程碑

  • M1:直接端口到 ROS2
    • 将现有包完全迁移到 ROS2
    • 利用 ROS2 功能:编译(ament)、中间件、日志记录、参数
  • M2:实时支持
    • 对传感器输入的反应式闭环控制
    • 混合规划(全局和局部)
    • 与控制器的零内存复制集成
  • M3:充分利用ROS2
  • MoveIt 节点的生命周期管理
  • 利用 ROS2 组件节点

实时功能(M2)

在线机器人操作需要实时安全:

  • 通过力、扭矩与环境进行复杂的相互作用
    • 推、抛、拧
  • 启用:
    • 反应式闭环控制
    • 高速率联合命令流(例如 >1 kHz)
    • 低延迟和可靠的传感器->控制管道

使用 MoveItCpp 改进 MoveIt 1

直接访问核心 MoveIt 组件

  • 支持多个规划管道
  • 支持运行多个机器人
    • 更灵活的配置


架构(M3)

利用 ROS2 组件节点获得更好的性能


混合规划 

全局规划

  • 优点:
    • 围绕复杂的障碍物进行规划
    • 避免陷入局部最小值
    • 完成:如果存在,将找到解决方案
  • 缺点:
    • 较慢的计算时间
    • 非实时
    • 不确定

局部规划

  • 优点
    • 快速/反应式
    • 确定性的
    • 非常适合视觉伺服
  • 缺点
    • 陷入局部最小值
    • 更少的碰撞安全保障

核心概念

  • 机器人状态
    • 包含几何信息和关节值
  • 当前状态监视器
    • 通过订阅 /joint_states(由驱动程序提供)更新机器人状态
  • 规划场景
    • 碰撞检查和约束检查
  • 规划场景监视器
    • 通过 ROS 接口更新规划场景
  • 控制器接口
    • 使用 FollowJointTrajectory 发布的规划轨迹(由驱动程序使用) 

MoveIt2 配置

  • URDF - 通用机器人描述格式
    • 安全控制器
    • 用于碰撞检查的网格
    • UR5 说明
  • SRDF - 语义机器人描述格式
    • 关节组(关节和连杆的集合)
      • 作为关节、连杆或串联链
    • 虚拟和被动关节
    • 机器人姿势
    • 自碰撞
    • UR5 SRDF
  • 其他配置
    • 关节限制、运动学和运动规划插件

MoveItCpp API


  
  1. // \brief load the robot model,
  2. // configure the planning pipeline from ROS2 parameters and
  3. // initialize defaults
  4. moveit_cpp_ = std::make_shared<moveit::planning_interface::MoveItCpp>(node_);
  5. // \brief associated to a planning group
  6. // used to setup the motion plan request and
  7. // call the low-level planner
  8. moveit::planning_interface::PlanningComponent arm("ur5_arm", moveit_cpp_);
  9. /** \brief Set the goal constraints generated from target pose and robot link */
  10. geometry_msgs::PoseStamped target_pose1;
  11. target_pose1.header.frame_id = "base_link";
  12. target_pose1.pose.orientation.w = 1.0;
  13. target_pose1.pose.position.x = 0.28;
  14. target_pose1.pose.position.y = -0.2;
  15. target_pose1.pose.position.z = 0.5;
  16. arm->setGoal(target_pose1, "ee_link");
  17. /** \brief Set the goal constraints generated from a named target state */
  18. arm->setGoal("ready");

约束规划

用于如下场合:

  • 约束机器人运动
  • 定义规划目标

  
  1. kinematic_constraints::JointConstraint
  2. kinematic_constraints::OrientationConstraint
  3. kinematic_constraints::PositionConstraint
  4. kinematic_constraints::VisibilityConstraint


例如: 使用为机器人上的连杆指定的路径约束进行规划


  
  1. moveit_msgs::OrientationConstraint ocm;
  2. ocm.link_name = "panda_link7";
  3. ocm.header.frame_id = "panda_link0";
  4. ocm.orientation.w = 1.0;
  5. ocm.absolute_x_axis_tolerance = 0.1;
  6. ocm.absolute_y_axis_tolerance = 0.1;
  7. ocm.absolute_z_axis_tolerance = 0.1;

将此设置为计划组的路径约束


  
  1. moveit_msgs::Constraints test_constraints;
  2. test_constraints.orientation_constraints.push_back(ocm);
  3. move_group_interface.setPathConstraints(test_constraints);

笛卡尔规划

  • 末端执行器沿表面精确路径(焊接和喷漆应用)
  • 为末端执行器指定的路径点列表
  • MoveIt 现在支持实时和全局、碰撞感知的笛卡尔规划

理想的属性

完整性、约束不足、提前规划、实时


  
  1. std::vector<geometry_msgs::Pose> waypoints;
  2. waypoints.push_back(start_pose);
  3. geometry_msgs::Pose way_pose;
  4. waypoints.push_back(way_pose);
  5. way_pose.position.y -= 0.2;
  6. waypoints.push_back(way_pose); // right
  7. way_pose.position.z += 0.2;
  8. way_pose.position.y += 0.2;
  9. way_pose.position.x -= 0.2;
  10. waypoints.push_back(way_pose); // up and left

现在用插值计算轨迹:


  
  1. moveit_msgs::RobotTrajectory trajectory;
  2. const double jump_threshold = 0.0;
  3. const double eef_step = 0.01;
  4. double fraction = move_group_interface.computeCartesianPath(waypoints, eef_step, jump_threshold, trajectory);

更多内容参考:Github之moveit2。 


 

 

 

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/119352049

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。