ROS2(Robot Operating System 2)は、ロボットアプリケーションの開発に広く使用されている柔軟なフレームワークです。C++を使用してROS2アプリケーションを開発する際には、パフォーマンスと柔軟性のバランスを取ることが重要です。特に、Actionサーバーのコールバック関数を定義する際には、効率的かつ直感的な方法が求められます。この記事では、[this]キャプチャを持つlambda式を用いてコールバック関数を記述する利点について解説します。
Lambda式とは?
Lambda式は、匿名関数を簡潔に記述するための機能です。C++11以降でサポートされており、関数オブジェクトを直接定義して渡すことができます。これにより、コードの可読性が向上し、コールバック関数をより柔軟に扱うことが可能になります。
[this]キャプチャの利用
クラスメンバ関数内でLambda式を定義する際に[this]キャプチャを使用すると、Lambda式内からそのクラスのメンバ変数やメンバ関数にアクセスできるようになります。これは、Actionサーバーのコールバック関数を実装する際に特に有用です。
Actionサーバーでの応用
ROS2でActionサーバーを実装する際、コールバック関数を設定する必要があります。このコールバック関数内でクラスのメンバ変数やメンバ関数にアクセスする場合、[this]キャプチャを持つLambda式を使用すると、コードが非常に簡潔かつ直感的になります。
サンプルソースを以下に示します。(擬似コード)
class MyActionServer
{
public:
MyActionServer()
{
action_server_ = rclcpp_action::create_server<MyAction>(
this,
"~/my_action",
[this](const rclcpp_action::GoalUUID & uuid, const auto goal_handle) {
(void)uuid;
(void)goal_handle;
return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
},
[this](const auto goal_handle) {
(void)goal_handle;
return rclcpp_action::GoalResponse::ACCEPT;
},
[this](const auto goal_handle) {
// 別スレッドで実行
auto execute_in_thread = [this, goal_handle](){this->execute_goal(goal_handle);};
std::thread{execute_in_thread}.detach();
});
}
private:
rclcpp_action::Server<MyAction>::SharedPtr action_server_;
void execute_goal(
const std::shared_ptr<const MyAction::Goal> goal_handle)
{
// 受け入れられたゴールの処理
}
};
この方法では、コールバック関数内で直接クラスのメンバ変数やメンバ関数にアクセスすることができ、コードの再利用性と整理が容易になります。また、Lambda式を使用することで、コードの見通しを良くし、メンテナンス性を高めることができます。
まとめ
ROS2のC++でActionサーバーを実装する際に、[this]キャプチャを持つLambda式を用いることは、コードの簡潔性、可読性、メンテナンス性を向上させる有効な手法です。実際のアプリケーション開発において、このテクニックを活用して、より効率的で理解しやすいコードを書くことをお勧めします。