目录
前言
在机器人运动控制领域,MoveIt 2作为一个先进的框架,为开发者提供了一套强大的工具和接口。move_group 节点,作为MoveIt 2中的一个核心ROS 2节点,扮演着至关重要的角色。它不仅简化了运动规划和执行的过程,而且通过其高度集成的架构,为用户提供了与机器人进行交互的高级接口。本文将详细介绍move_group 节点的架构、功能以及如何通过ROS 2 API与之交互,进而实现机器人运动的精确控制。
1.move_group介绍
在 MoveIt 2中,move_group 节点是一个 ROS 2 节点,提供高级接口来执行运动规划和控制任务。它允许用户发送规划请求、执行轨迹,并与机器人的当前状态进行交互。
1.1 move_group节点架构
下图展示了move_group这一关键节点的系统架构。这个节点就像一个集成器,将所有单独的组件联系在一起,
1.2 用户界面
用户可以通过两种方式访问其提供的操作和服务:move_group
-
在 C++ - 使用提供易于设置的 C++ 接口的 move_group_interface 软件包访问move_group
-
通过 GUI - 使用 Motion Planning 插件到 Rviz(ROS 可视化工具)
1.3 节点配置
move_group是一个ROS节点,它使用ROS参数服务器来获取三种信息:
- URDF
move_group查找robot_description参数以获取机器人的 URDF。
- SRDF
move_group查找robot_descrition_semantic参数以获取机器人的 SRDF。SRDF 通常由用户使用 MoveIt 设置助手(MoveIt Setup Assistant )一次性创建。
- MoveIt 配置
move_group将查找config参数获取特定于 MoveIt 的其他配置,包括关节限制、运动学、运动规划、感知和其他信息。这些组件的配置文件由 MoveIt 设置助手(MoveIt Setup Assistant )自动生成,并存储在机器人的相应 MoveIt 配置包的目录中。
1.4 机器人接口
move_group通过ROS提供的话题通信与动作通信与机器人进行通信,获取机器人当前状态(关节位置等),从机器人传感器获取点云和其他传感器数据,并于机器人上的控制器进行通信。
1.5 关节状态信息
move_group通过监听主题来确定机器人的当前状态信息,如每个关节的位置等等,它有能力监听这个主题上的多个发布者(publisher),即使只发布关于机器人状态部分的信息但也会分为多个发布者来实现(比如,可能分别为机器人的机械臂和移动底座使用单独的发布者)。需要注意的是move_group不会自己设置关节状态发布者;这是需要在每个机器人上单独实现的功能。
1.6 Transform 变换信息
move_group使用 ROS 的 TF(Transform Library)变换库来监控变换信息。这使得该节点能够获取关于机器人位姿的全局信息(以及其他信息)。例如,ROS 的导航堆栈(navigation stack)会将地图框架(map frame)与机器人基框架(base frame)之间的变换发布到 TF 中。move_group可以使用 TF 来获取这些变换信息以供内部使用。
请注意,move_group只监听 TF 发布的变换信息。如果希望从你的机器人发布 TF 信息,需要在用户的机器人上运行一个节点来发布这些信息。
1.7 控制器接口
move_group使用 FollowJointTrajectoryAction接口与机器人上的控制器进行通信。这是一个 ROS 动作(action)接口。在机器人上需要有一个服务器来响应这个动作请求——这个服务器不是由 move_group本身提供的。move_group只会实例化一个客户端,用于与机器人上的这个控制器动作服务器进行通信。
1.8 规划场景
move_group使用规划场景监视器(Planning Scene Monitor)来维护一个规划场景,该场景是机器人所处世界及其当前状态的表示。机器人的状态可以包含任何被机器人携带或附着的物体,这些物体被视为与机器人刚性连接。关于如何构建和更新这个规划场景的详细架构,将在下节的“规划场景”部分中进行说明。
1.9 可扩展功能
move_group的结构设计得易于扩展。诸如拾取和放置、运动学、运动规划等个别功能实际上被实现为具有共同基类的独立插件。这些插件可以通过 ROS 使用一组 ROS yaml 参数以及 ROS 的pluginlib库进行配置。大多数用户无需配置 move_group插件,因为它们在由 MoveIt 设置助手(Setup Assistant)生成的启动文件中已经自动配置好了。
2.move_group节点使用示例
启动 move_group节点
ros2 launch moveit2_move_group move_group.launch.py
使用 ROS 2 API 与 move_group交互
#include <rclcpp/rclcpp.hpp>
#include <moveit/move_group_interface/move_group_interface.h>
class MoveGroupDemo : public rclcpp::Node
{
public:
explicit MoveGroupDemo(const rclcpp::NodeOptions & options)
: Node("move_group_demo", options),
moveit_interface(this)
{
}
void run_demo()
{
// 设置目标姿态
std::map<std::string, double> joint_goal;
joint_goal["joint_1"] = 0.0;
joint_goal["joint_2"] = -0.4;
joint_goal["joint_3"] = 0.2;
joint_goal["joint_4"] = -1.0;
joint_goal["joint_5"] = 0.0;
joint_goal["joint_6"] = 0.0;
moveit_interface.setJointValueTarget(joint_goal);
// 规划运动
moveit_msgs::MotionPlanRequest req;
moveit_interface.planAndExecute(req);
}
private:
moveit::planning_interface::MoveGroupInterface moveit_interface;
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
auto demo = std::make_shared<MoveGroupDemo>(rclcpp::NodeOptions{});
demo->run_demo();
rclcpp::spin(demo);
rclcpp::shutdown();
return 0;
}
MoveIt 2 同样与 RViz 集成,允许你通过可视化界面进行运动规划和执行。
3.总结
本节简要介绍了与move_group有关的节点架构、用户界面、节点配置、机器人接口、关节状态信息、Transform变换信息、控制器接口、规划场景以及可扩展功能概念,理解了move_group节点如何将复杂的运动规划任务简化为易于管理的过程。通过提供的C++示例代码,进一步了解了如何实际使用ROS 2 API与move_group节点交互,实现机器人的运动规划和执行。此外,MoveIt 2还可以与RViz的集成使用户能够通过可视化界面进行更加直观的运动规划和执行。