ROS2极简总结-MoveIt2
【摘要】 用于 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
-
// \brief load the robot model,
-
// configure the planning pipeline from ROS2 parameters and
-
// initialize defaults
-
moveit_cpp_ = std::make_shared<moveit::planning_interface::MoveItCpp>(node_);
-
// \brief associated to a planning group
-
// used to setup the motion plan request and
-
// call the low-level planner
-
moveit::planning_interface::PlanningComponent arm("ur5_arm", moveit_cpp_);
-
/** \brief Set the goal constraints generated from target pose and robot link */
-
geometry_msgs::PoseStamped target_pose1;
-
target_pose1.header.frame_id = "base_link";
-
target_pose1.pose.orientation.w = 1.0;
-
target_pose1.pose.position.x = 0.28;
-
target_pose1.pose.position.y = -0.2;
-
target_pose1.pose.position.z = 0.5;
-
arm->setGoal(target_pose1, "ee_link");
-
/** \brief Set the goal constraints generated from a named target state */
-
arm->setGoal("ready");
约束规划
用于如下场合:
- 约束机器人运动
- 定义规划目标
-
kinematic_constraints::JointConstraint
-
kinematic_constraints::OrientationConstraint
-
kinematic_constraints::PositionConstraint
-
kinematic_constraints::VisibilityConstraint
例如: 使用为机器人上的连杆指定的路径约束进行规划
-
moveit_msgs::OrientationConstraint ocm;
-
ocm.link_name = "panda_link7";
-
ocm.header.frame_id = "panda_link0";
-
ocm.orientation.w = 1.0;
-
ocm.absolute_x_axis_tolerance = 0.1;
-
ocm.absolute_y_axis_tolerance = 0.1;
-
ocm.absolute_z_axis_tolerance = 0.1;
将此设置为计划组的路径约束
-
moveit_msgs::Constraints test_constraints;
-
test_constraints.orientation_constraints.push_back(ocm);
-
move_group_interface.setPathConstraints(test_constraints);
笛卡尔规划
- 末端执行器沿表面精确路径(焊接和喷漆应用)
- 为末端执行器指定的路径点列表
- MoveIt 现在支持实时和全局、碰撞感知的笛卡尔规划
理想的属性
完整性、约束不足、提前规划、实时
-
std::vector<geometry_msgs::Pose> waypoints;
-
waypoints.push_back(start_pose);
-
geometry_msgs::Pose way_pose;
-
waypoints.push_back(way_pose);
-
way_pose.position.y -= 0.2;
-
waypoints.push_back(way_pose); // right
-
way_pose.position.z += 0.2;
-
way_pose.position.y += 0.2;
-
way_pose.position.x -= 0.2;
-
waypoints.push_back(way_pose); // up and left
现在用插值计算轨迹:
-
moveit_msgs::RobotTrajectory trajectory;
-
const double jump_threshold = 0.0;
-
const double eef_step = 0.01;
-
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)