この記事は筆者オンリーのAdvent Calendar 20234日目の記事です。
OSS連携を試みるため、ROS2の簡単なモジュールを数回に渡って作っていきたいと思います。
の続きです。
ROS2でモジュール作成
前回、ROS2のチュートリアルを使って自作パブリッシャーとサブスクライバーでHelloWorldを行いました。
今回はAutowareのメッセージをサブスクライブして、サブスクライブしたことを表示するデモを行いたいと思います。
とはいえ、こちらの記事のほぼ丸写し、今回丸写しだと動かなかったので一部改造しただけです。
環境作成
前回記事と、こちらの記事を参考にROSのモジュールを作成。
今回はPathがメッセージとしてパブリッシュされていない様子のため、PathWithLaneIdのメッセージをサブスクライブしてメッセージを受領したことを確認するように改造。
#ifndef PATH_SUBSCRIBER_HPP_
#define PATH_SUBSCRIBER_HPP_
#include <rclcpp/rclcpp.hpp>
#include <autoware_auto_planning_msgs/msg/path_with_lane_id.hpp>
using PathWithLaneId = autoware_auto_planning_msgs::msg::PathWithLaneId;
class PathSubscriber : public rclcpp::Node
{
public:
PathSubscriber();
void topicCallback(const PathWithLaneId::ConstSharedPtr msg);
private:
rclcpp::Subscription<PathWithLaneId>::SharedPtr sub_path_;
PathWithLaneId::ConstSharedPtr path_;
};
#endif // PATH_SUBSCRIBER_HPP_
#include "path_subscriber.hpp"
#include <memory>
using PathWithLaneId = autoware_auto_planning_msgs::msg::PathWithLaneId;
using std::placeholders::_1;
PathSubscriber::PathSubscriber() : Node("path_subscriber")
{
sub_path_ = create_subscription<PathWithLaneId>("behavior_planning/path_with_lane_id", 10, std::bind(&PathSubscriber::topicCallback, this, _1));
}
void PathSubscriber::topicCallback(const PathWithLaneId::ConstSharedPtr msg)
{
path_ = msg;
RCLCPP_INFO(this->get_logger(), "I heard");
}
int main(int argc, char *argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<PathSubscriber>());
rclcpp::shutdown();
return 0;
}
実行
docker上で以下を実行
#AWSIMの起動
$ bash run_awsim.sh
#Autowareのビルド、起動
$ bash clean_build.sh
$ bash run_autoware.sh
以下のメッセージが出力され、Autowareのメッセージをサブスクライブしていることを確認しました。
今後の予定
1.Autowareのメッセージをパブリッシュし、既存のAutowareがサブスクライブするようにする。
2.OSS連携もできるように変更する。
という流れで行きたいと思います。