1
1

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 1 year has passed since last update.

ROS2でメッセージを自作する

Last updated at Posted at 2023-07-14

はじめに

パブリッシュ・サブスクライブはROS・ROS2の基本である。ROS2ではメッセージを自作することができる。CMakeで作成するが、Pythonから呼び出せる。今回は0.5秒ごとに整数を1ずつ増加させて、トピック上でやり取りする。

メッセージのパッケージを作成する

~/ros2_ws/src$ ros2 pkg create my_interfaces --build-type ament_cmake

msgディレクトリを作成し、メッセージを定義する。ここに使用できる型が列挙してある

my_interfaces/msg/Num.msg
int64 num

以下を追記する。

my_interfaces/CMakeList.txt
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Num.msg"
)
my_interfaces/package.xml
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

ビルドする。

~/ros2_ws$ colcon build --packages-select my_interfaces
~/ros2_ws$ . install/local_setup.bash

呼び出すパッケージを作成する

~/ros2_ws/src$ ros2 pkg create mypkg --build-type ament_python

以下のようにノードを作成する。

mypkg/talker.py
import rclpy
from rclpy.node import Node
from my_interfaces.msg import Num


class TalkerNode(Node):

    def __init__(self):
        super().__init__('talker')
        self.pub_ = self.create_publisher(Num, 'countup', 10)
        self.create_timer(0.5, self.cb)
        self.i_ = 0

    def cb(self):
        msg = Num()
        msg.num = self.i_
        self.pub_.publish(msg)
        self.get_logger().info('Publishing: %d' % msg.num)
        self.i_ += 1


def main(args=None):
    rclpy.init(args=args)
    talker_node = TalkerNode()
    rclpy.spin(talker_node)
    talker_node.destroy_node() # ノードを終了
    rclpy.shutdown() # ROS2 クライアント ライブラリを終了


if __name__ == '__main__':
    main()
mypkg/listener.py
import rclpy
from rclpy.node import Node
from my_interfaces.msg import Num


class ListenerNode(Node):

    def __init__(self):
        super().__init__('listener')
        self.create_subscription(Num, 'countup', self.cb, 10)

    def cb(self, msg):
        self.get_logger().info('I heard: %d' % msg.num)


def main(args=None):
    rclpy.init(args=args)
    listener_node = ListenerNode()
    rclpy.spin(listener_node)
    lisetner_node.destroy_node() # ノードを終了
    rclpy.shutdown() # ROS2 クライアント ライブラリを終了


if __name__ == '__main__':
    main()

以下を追記する。

mypkg/package.xml
<exec_depend>rclpy</exec_depend>
<exec_depend>my_interfaces</exec_depend>
mypkg/setup.py
entry_points={
    'console_scripts': [
        'talker = mypkg.talker:main',
        'listener = mypkg.listener:main',
}

ビルドする

~/ros2_ws$ colcon build --packages-select mypkg
~/ros2_ws$ . install/local_setup.bash

実行する

$ ros2 run mypkg talker
$ ros2 run mypkg listener

参考

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?