这里写自定义目录标题
大多数文章介绍move_group_interface都停留在对其成员函数的使用,plan()、execute()、move()等,但对其内部结构流程探究的很少。move_group_interface是Action的消息机制,并连接ompl库进行的运动规划和轨迹生成。下面来对move_group_interface中的plan()函数做深入了解,并借此学习Moveit!的Action。
1、move_group简介
move_group是Moveit!的核心组件,综合机器人的各独立组件,为用户提供一系列的动作指令和服务。
其中用户接口move_group_interface.cpp是C++的程序接口。moveit_commander.py是为Python提供的API 。GUI是rviz的插件,三种接口都一样,可以布置场景,设置碰撞,指定目标点等操作。
ROS参数服务器为move_group提供三种信息,URDF是机器人模型描述,SRDF是模型描述信息,Config是机器人配置的关节限位,运动学插件和运动规划插件等。
move_group和机器人之间的通讯通过Action和Topic。话题通讯很简单不再说明,下面简单介绍动作的通讯。
2、Action简单学习
2.1、action消息定义
Action是一种类似Service的问答通讯机制,不过Action带有连续反馈,可以在执行过程中反馈任务进度,也可中途中止任务。action通过*.action文件定义,格式如下:
int Goal //定义Action的目标
---
char Feedback //定义Action的反馈
---
bool Result //定义Action的结果
将其命名为text.action并链接编译后,会生成一系列.msg文件。
2.2、action使用:客户端
客户端用于发出action的目标,接收反馈和最终结果。
#include <actionlib/client/simple_action_client.h>
#include <ros/ros.h>
#include "move_msgs/text.h"
typedef actionlib::SimpleActionClient<moveit_msgs::text> Client;
void donecb (const moveit_msgs::textGoalState& state,
const moveit_msgs::textResultConstPtr& re)
{
ROS_INFO("Finish!");
ros::shutdown();
}
void activecb()
{
ROS_INFO("Start")
}
void feedbackcd (const moveit_msgs::textConstPtr& fb)
{
ROS_INFO("feedback is %c", fb->feedback);
}
int main (int argc, char ** argv)
{
ros::init(argc, argv, "text_client");
//定义客户端
Client client("text", true);
//等待服务器连接
client.waitForServer();
//定义目标变量
moveit_msgs::textGoal goal;
//填充目标信息
goal.Goal = 111;
//发送目标消息至服务端,并设置三个回调函数
client.sendGoal(goal, &donecb, &actioncb, &feedbackcb);
ros::spin();
return 0;
}
2.3、action使用:服务端
#