2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

独自メッセージを用いたROS2 publisher/subscriber:初級 -ROS1 style-

Last updated at Posted at 2019-07-18

ROS2関係トップページへ
ROS2レクチャー:初級 -ROS1 style-

【前:ROS2独自メッセージの作成
【次:ROS2の最小構成service/client:初級 -ROS1 style-

ここで作成した独自メッセージのうちtopic用メッセージを用いたpublisherとsubscriberのプログラムを作成する.
ここでは一つのパッケージとしてpublisherとsubscriberを作る.

更新:2020/07/15

Foxy Fitzroy用.主に以下の点について加筆・修正.

  • create_subscriptionの引数の変更への対応

再度掲示:topic用メッセージ

パッケージ名:my_messages
収納ディレクトリ:msg
メッセージファイル名:TwoInts.msg

TwoInts.msg
int64 a
int64 b

上記をビルドしたものなので,以下のように使用できる.

  • インクルードファイル
    • #include "my_messages/msg/two_ints.msg"
  • 型クラス
    • my_messages::msg::TwoInts

準備

terminal
$ cd ~/ros2_studies_ws/
$ ros2 pkg create my_msg_ros1_like --dependencies rclcpp my_messages

publisher

作成物:

  • src/my_pub_main.cpp

プログラム:src/my_pub_main.cpp

src/pub_main.cpp
#include <rclcpp/rclcpp.hpp>
#include <rclcpp/qos.hpp>
#include "my_messages/msg/two_ints.msg"
#include <chrono>

int main(int argc, char * argv[]){
  using namespace std::chrono_literals;

  rclcpp::init(argc, argv);

  auto node = rclcpp::Node::make_shared("minimal_publisher");
  auto publisher = node->create_publisher<my_messages::msg::TwoInts>("msg_test",rclcpp::QoS(10));
  auto message = std::make_shared<my_messages::msg::TwoInts>();

  rclcpp::WallRate loop_rate(1s);

  while(rclcpp::ok()){
    message->a = 3;
    message->b = 4;
    RCLCPP_INFO(node->get_logger(),"Pub:%d, %d",message->a, message->b);
    publisher->publish(*message);
    loop_rate.sleep();
  }
  rclcpp::shutdown();
  return 0;
}

概要

作成した独自メッセージを使用.
独自メッセージは二つのint64型.ここでは適当な数を発信するだけのもの.

説明

3行目:独自メッセージをインクルード
12行目:独自メッセージを発信するpublisherをトピック名:msg_testで作成
13行目:独自メッセージを宣言
18,19行目:独自メッセージに値を代入
21行目:発信

subscriber

作成物:

  • src/my_sub_main.cpp

プログラム:src/my_sub_main.cpp

src/my_sub_main.cpp
#include <rclcpp/rclcpp.hpp>
#include <rclcpp/qos.hpp>
#include "my_messages/msg/two_ints.msg"

int main(int argc, char * argv[]){
  rclcpp::init(argc, argv);

  node=rclcpp::Node::make_shared("ros1_like_subscriber_test");
  auto subscription = node->create_subscription<my_messages::msg::TwoInts>(
    "topic_test",
    rclcpp::QoS(10),
    [](const my_messages::msg::TwoInts::SharedPtr msg) ->void {
      RCLCPP_INFO(node->get_logger(), "I heard: %d, %d", msg->a, msg->b);
    }
  );
  rclcpp::spin(node);
  rclcpp::shutdown();

  return 0;
}

概要

publisherと同様に独自メッセージをインクルードして使用する

package.xmlとCMakeLists.txt

以下は追加したところに関係する部分のみ抜粋

package.xml

package.xml
<package format="3">
  <depend>rclcpp</depend>
  <depend>my_messages</depend>

依存関係で必要になってくる部分が,自分で作成したmy_messagesというパッケージなので追加.

CMakeLists.txt

CMakeLists.txt
find_package(rclcpp REQUIRED)
find_package(my_messages REQUIRED)

add_executable(my_sub_test
  src/my_sub_main.cpp
)
ament_target_dependencies(my_sub_test
  rclcpp
  my_messages
)

add_executable(my_pub_test
  src/my_pub_main.cpp
)
ament_target_dependencies(my_pub_test
  rclcpp
  my_messages
)

install(TARGETS
  my_sub_test
  my_pub_test
  DESTINATION lib/${PROJECT_NAME}
)

二つのターゲットがあるだけで,これまで通り以下を追加.

  • find
  • add_executable
  • ament_target_dependencies
  • install

ビルド・実行

ビルド

terminal
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install --packages-up-to my_msg_ros1_like
$ . install/local_setup.bash

実行

publisher用のterminalとsubscriber用のterminalを起動.

terminal1
$ cd ~/ros2_studies_ws/
$ . install/local_setup.bash
$ ros2 run my_msg_ros1_like my_pub_test
terminal2
$ cd ~/ros2_studies_ws/
$ . install/local_setup.bash
$ ros2 run my_msg_ros1_like my_sub_test

独自メッセージと作成プログラムが同一パッケージの場合

基本的には独自メッセージ・ライブラリ・ターゲットは別パッケージが望ましい.
しかし例外はあるものなので,同一パッケージでどうしても,という場合はこちらを参照.
参考:公式tutorialのメッセージに関係するページの一番下.

【前:ROS2独自メッセージの作成
【次:ROS2の最小構成service/client:初級 -ROS1 style-

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?