はじめに
パブリッシュ・サブスクライブは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
参考