普段仕事でROSを触るときはPythonかC++を利用することになるが、Ruby好きとしては、やはりRubyでもノードを書いたりしたくなる。
ということで、すこし調べてみた。
ROS 2以前
調べるとROS 2ではなくて、ROSに関する取り組みはあるようだった。
GitHub - OTL/rosruby: ruby ROS client.ruby ROS client. Contribute to OTL/rosruby development by creating an account on GitHub.GitHub
九州工業大学の田中先生の研究室の学生さんの記事。対象はNoetic。
【Ruby】RubyでROSを動かしてみた - Qiita九州工業大学 田中和明研究室の大学院生です。Rubyと産業用ロボットに関する研究に携わっています。 背景 ROSでロボットを動かす場合、一般的にはPythonやC++を使用したプログラムが基本です。また、ROSは主にUbuntu上で動作し、ターミナル操作やUNIX系コマ...Qiita
ROS 2対応のrclrb
やはり今ならROS 2使いたいので、調べてみると1つだけ見つかった。
2024年5月の記事。
rclrb: bindings for using ROS2 with RubyHi everyone, I am happy to announce here bindings to use ROS2 RCL with the Ruby programming language. The bindings have been stable for a few months now and are ready for more wide spread usage. Feel free to report any issue on the gitlab tracker. The bindings can be installed as a gem or as a colcon package. Instructions can be found in the readme of the repository: Documentation is sparse, but the API is generally similar to Python/C++ one. The main difference is that the only available ex...Open Robotics Discourse
リポジトリ
rosrb / rclrb · GitLabGitLab.comGitLab
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で簡単に試してみる環境を準備しました。
GitHub - kishima/try-rclrbContribute to kishima/try-rclrb development by creating an account on GitHub.GitHub実行結果
$ 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絡めたり、いろいろ可能を探っていきたいと思って色々試しているところです。