RubyとROS 2
普段仕事でROSを触るときはPythonかC++を利用することになるが、Ruby好きとしては、やはりRubyでもノードを書いたりしたくなる。
ということで、すこし調べてみた。
ROS 2以前
調べるとROS 2ではなくて、ROSに関する取り組みはあるようだった。
九州工業大学の田中先生の研究室の学生さんの記事。対象はNoetic。

ROS 2対応のrclrb
やはり今ならROS 2使いたいので、調べてみると1つだけ見つかった。
2024年5月の記事。

リポジトリ

FFIでrclをラップしてRubyから使えるようにしてある実装で、コードもシンプルで素敵です。
動かしてみる
サンプルコードを動かしてみる。Pythonで書いたような雰囲気でROSのノードが書けている。
Publisher
require 'rclrb'
require 'std_msgs/msg'
class MinimalPublisher < Rclrb::Node
def initialize()
super("publisher_node")
string_msg = StdMsgs::Msg::String.new
string_msg.data = "Hello World!"
pub = self.create_publisher(StdMsgs::Msg::String, "topic", 1)
@timer = self.create_timer(1.0) do |time|
pub.pub(string_msg)
end
end
end
def main(args)
Rclrb.init(arguments: args)
Rclrb.spin(MinimalPublisher.new)
end
if $0 == __FILE__
main(ARGV)
end
Subscriber
require 'rclrb'
require 'std_msgs/msg'
$stdout.sync = true
class MinimalSubscriber < Rclrb::Node
def initialize
super("subscriber")
self.create_subscription(StdMsgs::Msg::String, "topic", 1) { |msg| puts msg.data }
end
end
def main(args)
puts "start subscriber node"
Rclrb.init(arguments: args)
Rclrb.spin(MinimalSubscriber.new)
end
if $0 == __FILE__
main(ARGV)
end
ROSのインストールとか大変なので、Dockerで簡単に試してみる環境を準備しました。
実行結果
$ docker compose up
[+] Running 1/1
✔ Container try-rclrb-ros-nodes-1 Created 0.2s
Attaching to ros-nodes-1
ros-nodes-1 | run publisher node
ros-nodes-1 | ros2 node list
ros-nodes-1 | /publisher_node
ros-nodes-1 | ros2 topic list
ros-nodes-1 | /parameter_events
ros-nodes-1 | /rosout
ros-nodes-1 | run subscriber node
ros-nodes-1 | start subscriber node
ros-nodes-1 | Hello World!
ros-nodes-1 | Hello World!
ros-nodes-1 | Hello World!
細かいところ対応してなさそうだが、シンプルな使い方なら普通に使えそうと感じた。必要があれば、自力でrcl叩いて拡張することもできそう。
こちらも踏まえて、mruby絡めたり、いろいろ可能を探っていきたいと思って色々試しているところです。