ROS 2 动作通信
概述
ROS2(Robot Operating System 2)是一种广泛应用于机器人领域的开源框架。动作(Action)是ROS2中用于处理长时间异步任务的通信机制。本文将介绍如何在ROS2中使用C++实现动作通信。
动作通信的基本概念
动作通信由三部分组成:
- 目标(Goal):要执行的任务。
- 反馈(Feedback):任务执行过程中的进展信息。
- 结果(Result):任务完成后的最终状态。
实现步骤
1. 创建自定义动作文件
在ROS2中,动作文件通常位于action
目录中。假设我们创建一个名为Progress.action
的动作文件。
# Progress.action
int64 num
---
int64 sum
---
float64 progress
2. 生成C++接口
在CMakeLists.txt
中添加以下内容以生成C++接口:
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/PositionSpeed.msg"
"srv/ComputeArea.srv"
"srv/AddTwoInts.srv"
"action/Factorial.action"
"action/Count.action"
"action/Move.action"
//添加下面一行
"action/Progress.action"
DEPENDENCIES # Add packages that above messages depend on
)
运行colcon build
以生成对应的代码。
3. 创建动作服务器
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "my_custom_msgs/action/progress.hpp"
using my_custom_msgs::action::Progress;
using GoalHandleProgress = rclcpp_action::ClientGoalHandle<Progress>;
using namespace std::placeholders;
// 3.定义节点类;
class MinimalActionClient : public rclcpp::Node
{
public:
explicit MinimalActionClient(const rclcpp::NodeOptions & node_options = rclcpp::NodeOptions())
: Node("minimal_action_client", node_options)
{
// 3-1.创建动作客户端;
this->client_ptr_ = rclcpp_action::create_client<Progress>(this,"get_sum"); }
// 3-2.发送请求;
void send_goal(int64_t num)
{
if (!this->client_ptr_) {
RCLCPP_ERROR(this->get_logger(), "动作客户端未被初始化。");
}
if (!this->client_ptr_->wait_for_action_server(std::chrono::seconds(10))) {
RCLCPP_ERROR(this->get_logger(), "服务连接失败!");
return;
}
auto goal_msg = Progress::Goal();
goal_msg.num = num;
RCLCPP_INFO(this->get_logger(), "发送请求数据!");
auto send_goal_options = rclcpp_action