ROS action demo(不想写了 ╭(╯^╰)╮

消息(message)是用于节点之间的数据交换的一种数据形式。话题、服务和动作都使用消息。消息可以是简单的数据结构,如整数(integer)、浮点(floatingpoint)和布尔值(boolean),或者是像“geometry_msgs/PoseStamped”一样消息包含消息的简单的数据结构,或者也可以是像 “float32[ ] ranges”或“Point32[10] points”之类的消息数组结构。另外,ROS中常用的头(header、std_msgs/Header)也可以作为消息来使用。这些消息由两种类型组成:字段类型(fieldtype)和字段名称(fieldname)。
ROS action demo(不想写了 ╭(╯^╰)╮_第1张图片
ROS action demo(不想写了 ╭(╯^╰)╮_第2张图片action小demo操作指南
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_action message_generation std_msgs actionlib_msgs actionlib roscpp
$ roscd ros_tutorials_action
$ gedit package.xml



ros_tutorials_action
0.1.0
ROS tutorial package to learn the action
BSD
Melonee Wise
pyo
catkin
roscpp
actionlib
message_generation
std_msgs
actionlib_msgs
roscpp
actionlib
std_msgs
actionlib_msgs
message_runtime


$ gedit CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(ros_tutorials_action)
find_package(catkin REQUIRED COMPONENTS
message_generation
std_msgs
actionlib_msgs
actionlib
roscpp
)
find_package(Boost REQUIRED COMPONENTS system)
add_action_files(FILES Fibonacci.action)
generate_messages(DEPENDENCIES actionlib_msgs std_msgs)
catkin_package(
LIBRARIES ros_tutorials_action
CATKIN_DEPENDS std_msgs actionlib_msgs actionlib roscpp
DEPENDS Boost
)
include_directories(${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
add_executable(action_server src/action_server.cpp)
add_dependencies(action_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(action_server ${catkin_LIBRARIES})
add_executable(action_client src/action_client.cpp)
add_dependencies(action_client ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(action_client ${catkin_LIBRARIES})

$ roscd ros_tutorials_action
$ mkdir action
$ cd action
$ gedit Fibonacci.action

#goal definition
int32 order
---
#result definition
int32[] sequence
---
#feedback
int32[] sequence

除了可以在动作文件中找到的目标(goal)、结果(result)和反馈(feedback)之外,动作基本上还使用两个额外的消息:取消(cancel)和状态(status)。取消(cancel)消息使用actionlib_msgs/GoalID,它在动作运行时可以取消动作客户端和单独节点上的动作的执行。状态(status)消息可以根据状态转换 (如PENDING、ACTIVE、PREEMPTED和SUCCEEDED)检查当前动作的状态。
$ roscd ros_tutorials_action/src
$ gedit action_server.cpp

#include 					
 // ROS的基本头文件
#include 	
 // 动作库头文件
#include  	
 // FibonacciAction动作头文件(生成后自动生成)
class FibonacciAction
{
protected:
// 声明节点句柄
ros::NodeHandle nh_;
// 声明动作服务器
actionlib::SimpleActionServer as_;
// 用作动作名称
std::string action_name_;
// 声明用于发布的反馈及结果
ros_tutorials_action::FibonacciFeedback feedback_;
ros_tutorials_action::FibonacciResult result_;
public:
// 初始化动作服务器(节点句柄、动作名称、动作后台函数)
FibonacciAction(std::string name) :
as_(nh_, name, boost::bind(&FibonacciAction::executeCB, this, _1), false),
action_name_(name)
{
as_.start();
}
~FibonacciAction(void)
{
}
// 接收动作目标(goal)消息并执行指定动作(此处为斐波那契数列)的函数。
void executeCB(const ros_tutorials_action::FibonacciGoalConstPtr &goal)
{
ros::Rate r(1);				
 // 循环周期:1 Hz
bool success = true;			
 // 用作保存动作的成功或失败的变量
// 斐波那契数列的初始化设置,也添加了反馈的第一个(0)和第二个消息(1)
feedback_.sequence.clear();
feedback_.sequence.push_back(0);
feedback_.sequence.push_back(1);
// 将动作名称、目标和斐波那契数列的两个初始值通知给用户
ROS_INFO("%s: Executing, creating fibonacci sequence of order %i with seeds %i, %i",
action_name_.c_str(), goal->order, feedback_.sequence[0], feedback_.sequence[1]);
// 动作细节
for(int i=1; i<=goal->order; i++)
{
// 从动作客户端得知动作取消
if (as_.isPreemptRequested() || !ros::ok())
{
ROS_INFO("%s: Preempted", action_name_.c_str());	
 // 通知动作取消
as_.setPreempted();					
 // 取消动作
success = false;					
 // 看作动作失败并保存到变量
break;
}
// 除非有动作取消或已达成动作目标
// 将当前斐波纳契数字加上前一个数字的值保存到反馈值。
feedback_.sequence.push_back(feedback_.sequence[i] + feedback_.sequence[i-1]);
as_.publishFeedback(feedback_);			
 // 发布反馈。
r.sleep();						
 // 按照上面定义的循环周期调用暂歇函数。
}
// 如果达到动作目标值,则将当前斐波那契数列作为结果值传输。
if(success)
{
result_.sequence = feedback_.sequence;
ROS_INFO("%s: Succeeded", action_name_.c_str());
as_.setSucceeded(result_);
}
}
};
int main(int argc, char** argv)			
{
ros::init(argc, argv, "action_server");		
FibonacciAction fibonacci("ros_tutorial_action");	
ros::spin();							
return 0;
}
// 节点主函数
// 初始化节点名称
// 声明 Fibonacci (动作名: ros_tutorial _ action// 等待动作目标
)

$ roscd ros_tutorials_action/src
$ gedit action_client.cpp

#include 					
#include  	
#include  		
#include  	
int main (int argc, char **argv) 			
{
ros::init(argc, argv, "action_client"); 		
// ROS的基本头文件
// 动作库头文件
// 动作目标状态头文件
// FibonacciAction动作头文件(构建后自动生成)
// 节点主函数
// 初始化节点名称
// 声明动作客户端(动作名称:ros_tutorial_action)
actionlib::SimpleActionClient ac("ros_tutorial_action",
true);
ROS_INFO("Waiting for action server to start.");
ac.waitForServer(); 					
 // 等待动作服务器启动
ROS_INFO("Action server started, sending goal.");
ros_tutorials_action::FibonacciGoal goal; 		
 // 声明动作目标
goal.order = 20; 						
 // 指定动作目标(进行20次斐波那契运算)
ac.sendGoal(goal);					
 // 发送动作目标
// 设置动作完成时间限制(这里设置为30秒)
bool finished_before_timeout = ac.waitForResult(ros::Duration(30.0));
// 在动作完成时限内收到动作结果值时
if (finished_before_timeout)
{
// 获取动作目标状态值并将其显示在屏幕上
actionlib::SimpleClientGoalState state = ac.getState();
ROS_INFO("Action finished: %s",state.toString().c_str());
}
else
ROS_INFO("Action did not finish before the time out."); 	// 超过了动作完成时限的情况
//exit
return 0;
}

$ cd ~/catkin_ws && catkin_make
$ roscore
$ rosrun ros_tutorials_action action_server
$ rostopic list
/ros_tutorial_action/cancel
/ros_tutorial_action/feedback
/ros_tutorial_action/goal
/ros_tutorial_action/result
/ros_tutorial_action/status
/rosout
/rosout_agg

$ rostopic list -v
Published topics:

  • /ros_tutorial_action/feedback [ros_tutorials_action/FibonacciActionFeedback] 1 publisher
  • /ros_tutorial_action/status [actionlib_msgs/GoalStatusArray] 1 publisher
  • /rosout [rosgraph_msgs/Log] 1 publisher
  • /ros_tutorial_action/result [ros_tutorials_action/FibonacciActionResult] 1 publisher
  • /rosout_agg [rosgraph_msgs/Log] 1 publisher
    Subscribed topics:
  • /ros_tutorial_action/goal [ros_tutorials_action/FibonacciActionGoal] 1 subscriber
  • /rosout [rosgraph_msgs/Log] 1 subscriber
  • /ros_tutorial_action/cancel [actionlib_msgs/GoalID] 1 subscriber
    $ rosrun ros_tutorials_action action_client
    通过设置这个目标值,动作服务器将。。。。

不想写了 ╭(╯^╰)╮

你可能感兴趣的:(Robot)