MoveIt 从版本 Noetic 开始,加入了 Task Constructor 框架,其提供了一种灵活和透明的方式来定义和计划由多个相互依赖的子任务组成的操作。该框架使用容器的概念对运动的基本阶段进行分层组织,能够实现运动任务的顺序组合和并行组合
使用 Task Constructor 能够快速的组合出特定场景的运动规划任务,但目前为止,Task Constructor 仅支持使用编写代码的方式,对于部分终端用户来说,代码编写有一些技术要求,对编程语言也需要有一个学习过程。本文介绍一个基于 Task Constructor 开发的图形化界面功能,可用通过使用图形化的界面构建 Task Constructor 的运动规划和执行
MoveIt Task Constructor 提供了多种容器策略,组合方式非常灵活,本文介绍的图形化功能目前仅支持 Serial Container 以及 MoveTo 和 MoveRelative 两种 stage,其他策略将会在后续完善
本文介绍内容的完整源码可以在 GitHub 下载
重构和新建内容涉及到对 MoveIt Task Constructor 的构建理解和各个类间的层次关系的理解,本文不再对其做详细解释和说明,读者可以在 GitHub 下载完整源码参考
File | Package | Class | Comment |
---|---|---|---|
task_view.ui | moveit_task_constructor_visualization | 重构 | 增加了execute按钮; 重命名了右键弹出菜单;增加了load/save按钮 |
task_panel_p.h task_panel.h task_panel.cpp | moveit_task_constructor_visualization | 重构 | 重构了addTask和removeStages函数 |
task_display.h task_display.cpp | moveit_task_constructor_visualization | 重构 | 增加了interactive marker |
container.h container.cpp | moveit_task_constructor_core | 重构 | 增加了通过序号获取stage元素的函数 |
cartesian_path.h joint_interpolation.h | moveit_task_constructor_core | 重构 | 增加了planner的获取函数 |
introspection.cpp | moveit_task_constructor_core | 重构 | 重构instrospection的namespace为公共适应多任务文件的加载 |
CMakeLists.txt | moveit_task_constructor_visualization | 重构 | 新增文件的导入 |
add_task_stage.h add_task_stage.cpp | moveit_task_constructor_visualization | 新增 | GUI界面的控件属性及其对应的操作逻辑 |
whi_logo.png | moveit_task_constructor_visualization | 新增 | logo图像 |
进入 ROS 的工作目录,这里假设工作目录命名为 catkin_workspace:
cd ~/catkin_workspace/src
git clone https://github.com/xinjuezou-whi/moveit_task_constructor.git
随后通过 rosdep 检查并安装所需依赖:
rosdep install --from-paths . --ignore-src --rosdistro $ROS_DISTRO
最后编译,编译完成记得为终端添加工作目录:
catkin build
source ~/catkin_workspace/devel/setup.bash
编译完成后在 RViz 的 MoveIt 环境中就能添加 Motion Planning Task 插件运行,如果直接运行 MoveIt Task Constructor 的 demo.launch 将不需要其他前置环境的设置,可以直接使用本文 GUI 功能;如果运行其他 MoveIt 的环境,比如 Motion Planning 则需要做一些简单的环境配置
运行 Task Constructor 的 demo.launch:
roslaunch moveit_task_constructor_demo demo.launch
右键点击“Motion Planning tasks”,在弹出菜单中选择“Add task or stage”。在弹出的对话框中即可设置 task 的 stage,目前支持 serial container 中的 MoveTo 和 MoveRelative stage。目标 stage 设置完成后,将“Task Solution topic”设置为:
/whi_gui/solution
随后将看到创建的 stage:
首先需要引入“ExecuteTaskSolutionCapability”,否则执行运动路径将不能得到响应。在包含引用“move_group.launch”的 launch 文件后,比如 moveit_config 的“demo.launch",加入如下语句:
同时,值得注意的是:MoveIt Task Constructor 在规划路径时会要求获得执行末端的 tip,否则将无法规划路径。这个要求即待控制的机械臂需要配置好 end effector,配置过程可以参考官网说明,这里不再累述
随后,在运行的 RViz 中添加“Motion Planning Tasks”插件:
当上述环境配置都完成后,即可以通过 MoveIt Task Constructor 构建目标任务,本文的 GUI 功能依然支持原有的编码形式。下面两个示例分别是苇航智能用于演示的 6DOF 机械臂,以及 AR2/3 开源硬件机械臂
WHI 6DOF arm:
AR2/3 arm:
勾选Loop后,点击Execute,所构建的任务路径将被循环执行:
构建的任务及其阶段可以保存为yaml文件,并通过从保存的yaml文件中加载来重用:
如果加载的yaml文件包含了多个任务,则首先需要将“Task Solution topic” 主题设置为“/whi_gui/solution”,否则将只能显示最后一个任务
ROS 精神在于开源贡献,人人都可以分享自身的成果,同时也享受他人成果带来的便利。本文将对 MoveIt Task Constructor 的图形化界面的拓展开发做了一个分享,希望借此能够给同样运用 ROS 平台的读者多少带来一些参考。
本文说明的源代码,可以完整的在 GitHub 下载,如果文中出现了描述错误以及不清晰的地方,欢迎指正,共同交流:[email protected]