如何在 C++ 中实现 action 的 goal 和 result 类型?
时间: 2024-09-20 11:10:45 浏览: 27
C++实现无人机航拍图像拼接
在C++中实现Action的goal(请求)和result(结果)类型通常涉及以下几个步骤:
1. 定义action消息类型:首先,你需要定义一个自定义的消息类型,比如`Fibonacci::Goal`和`Fibonacci::Result`。这可以通过`rclcpp_action`库中的消息模板来完成。例如,`Fibonacci::Goal`可能包含一个整数`order`字段表示要计算的斐波那契数。
```cpp
namespace Fibonacci
{
class Goal : public rclcpp_action::msg::Goal
{
public:
Goal(uint32_t order)
: rclcpp_action::msg::Goal(std::string{"fibonacci"}), // action name
order_(order)
{
}
uint32_t get_order() const { return order_; }
private:
uint32_t order_;
};
}
```
2. 创建回调函数:如你所引用的代码所示,`handle_goal`函数是接受一个`Goal`实例并决定如何响应的。在这个函数里,你可以根据`Goal`的内容进行逻辑处理,然后返回`rclcpp_action::GoalResponse`来指示是否接受并执行任务。
```cpp
rclcpp_action::GoalResponse handle_goal(
const rclcpp_action::GoalUUID & uuid,
std::shared_ptr<const Fibonacci::Goal> goal)
{
RCLCPP_INFO(this->get_logger(), "Received goal request with order %u", goal->get_order());
// 处理逻辑...
return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
}
```
3. 结果处理:当action执行完毕时,你需要创建一个`Fibonacci::Result`实例,填充所需的结果数据,然后通过`publish_result`方法发送给客户端。
```cpp
rclcpp_action::GoalResponse execute_goal(
std::shared_ptr<Fibonacci::Goal> goal,
rclcpp_action::executed_result_t result)
{
rclcpp_action::GoalResponse response = rclcpp_action::GoalResponse::SUCCEEDED;
// 执行逻辑...
auto result_msg = std::make_shared<Fibonacci::Result>();
result_msg->sequence = fibonacci(goal->order);
// 发布结果
if (!this->client_->publish_result(result.get(), result_msg)) {
RCLCPP_ERROR(this->get_logger(), "Failed to publish result");
response = rclcpp_action::GoalResponse::ABORTED;
}
return response;
}
```
阅读全文