RubyからRAPIROを制御する
RAPIRO( https://www.rapiro.com/ja/ )をRubyから制御してみたかったのでラッパー作ってみた。
このライブラリはシリアルコマンドの#M0〜#M9( http://wiki.rapiro.com/page/serial-command_ja/ )を使わずに直接サーボモーターやLEDの制御をする#Pコマンドを使ってRAPIROを動かすライブラリです。(※まだテストしてないのでRubyGemsに上げてません。)
1. できること
このライブラリを使うことでこんな感じでRAPIROの動きを制御できるようになります。
require 'rapiro_wrapper'
commander = RapiroWrapper::Commander.new('/dev/tty.usbserial-DA00HMG6')
sleep 20
commander.execute!([
RapiroWrapper::Head.new( left: 30 ),
RapiroWrapper::Waist.new( right: 30 ),
RapiroWrapper::RightSholderRoll.new( up: 160 ),
RapiroWrapper::RightSholderPitch.new( up: 20 ),
RapiroWrapper::RightHandGrip.new( hold: 0 ),
RapiroWrapper::LeftSholderRoll.new( up: 30 ),
RapiroWrapper::LeftSholderPitch.new( up: 20 ),
RapiroWrapper::LeftHandGrip.new( open: 0 ),
RapiroWrapper::RightFootYaw.new( open: 30 ),
RapiroWrapper::RightFootPitch.new( open: 5 ),
RapiroWrapper::LeftFootYaw.new( close: 20 ),
RapiroWrapper::LeftFootPitch.new( close: 0 ),
RapiroWrapper::Eyes.new('#00ff00')
], 5)
RapiroWrapper::Commander
はシリアルI/Oを管理するクラスで、シリアルポートを引数に与えて初期化します。
その後インスタンスメソッドの execute!()
により各モーター、LEDに対して操作を行います。 execute!
の第一引数は各サーボモーターの状態を表す RapiroWrapper::ServoMotor
のサブクラスの配列を指定し、第二引数は指定した位置に何秒後に達するかをミリ秒(1〜255)で指定します。
RapiroWrapper::ServoMotor
のサブクラスと初期化時の引数は下記の通りで、各々の値は角度です。
クラス | 位置 | 引数と値の範囲 |
---|---|---|
RapiroWrapper::Head | 首(頭) | left:0〜90 または right:0〜90 |
RapiroWrapper::Waist | 腰 | left:0〜90 または right:0〜90 |
RapiroWrapper::RightSholderRoll | 右肩 | up:0〜180 (default:0) |
RapiroWrapper::RightSholderPitch | 右腕 | up:0〜90 (default:0) |
RapiroWrapper::RightHandGrip | 右手 | hold:0〜50 または open:0〜50 |
RapiroWrapper::LeftSholderRoll | 左肩 | up:0〜180 (default:0) |
RapiroWrapper::LeftSholderPitch | 左腕 | up:0〜90 (default:0) |
RapiroWrapper::LeftHandGrip | 左手 | hold:0〜50 または open:0〜50 |
RapiroWrapper::RightFootYaw | 右足の開き | close:0〜60 または open:0〜60 |
RapiroWrapper::RightFootPitch | 右足 | close:0〜40 または open:0〜40 |
RapiroWrapper::LeftFootYaw | 左足の開き | close:0〜60 または open:0〜60 |
RapiroWrapper::LeftFootPitch | 左足 | close:0〜40 または open:0〜40 |
また目のLEDについては下記のとおりです。
クラス | 引数と値の範囲 |
---|---|
RapiroWrapper::Eyes | Webカラーの16進記述 または red:0〜255, green:0〜255, blue:0〜255 |
値を省略した場合は#M0同様各値を初期化します。
commander.execute!([])
2. インストール手順
インストールは(1)直接ダウンロードしてインストールする か、(2)Gemfileを使ってインストールします。
(1)の手順:
# git clone -b master --depth 1 https://github.com/tk-hamaguchi/rapiro_wrapper.git
# cd rapiro_wrapper/
# gem build rapiro_wrapper.gemspec
# gem install rapiro_wrapper-*.gem
(2)のGemfileへの追記内容:
gem 'rapiro_wrapper', github: 'tk-hamaguchi/rapiro_wrapper'
3. 読み込みと初期化
シリアルポートを RapiroWrapper::Commander
の引数に与えて初期化します。
※RaspberyPiを接続しているときはシリアルポートが /dev/ttyAMA0
場合引数を省略できます。
require 'rapiro_wrapper'
commander = RapiroWrapper::Commander.new('/dev/tty.usbserial-DA00HMG6')
4. しぐさサンプル
とりあえず全部動かしてみる
commander.execute!([
RapiroWrapper::Head.new( left: 30 ),
RapiroWrapper::Waist.new( right: 30 ),
RapiroWrapper::RightSholderRoll.new( up: 160 ),
RapiroWrapper::RightSholderPitch.new( up: 20 ),
RapiroWrapper::RightHandGrip.new( hold: 0 ),
RapiroWrapper::LeftSholderRoll.new( up: 30 ),
RapiroWrapper::LeftSholderPitch.new( up: 20 ),
RapiroWrapper::LeftHandGrip.new( open: 0 ),
RapiroWrapper::RightFootYaw.new( open: 30 ),
RapiroWrapper::RightFootPitch.new( open: 5 ),
RapiroWrapper::LeftFootYaw.new( close: 20 ),
RapiroWrapper::LeftFootPitch.new( close: 0 ),
RapiroWrapper::Eyes.new('#00ff00')
])
sleep 5
commander.execute!([])
首ふり。
duration = 7
2.times.each do
commander.execute!([
RapiroWrapper::Head.new( left: 30 )
], duration)
sleep duration * 0.1
commander.execute!([
RapiroWrapper::Head.new( right: 30 )
], duration)
sleep duration * 0.1
end
commander.execute!([],10)
あばれてみる。
duration = 5
5.times.each do
commander.execute!([
RapiroWrapper::Head.new( left: 10 ),
RapiroWrapper::RightSholderRoll.new( up: 160 ),
RapiroWrapper::LeftSholderRoll.new( up: 160 ),
RapiroWrapper::RightSholderPitch.new( up: 5 ),
RapiroWrapper::LeftSholderPitch.new( up: 5 ),
RapiroWrapper::RightFootPitch.new( open: 0 ),
RapiroWrapper::LeftFootPitch.new( close: 0 ),
RapiroWrapper::Eyes.new('#ff0000')
], duration)
sleep duration * 0.1
commander.execute!([
RapiroWrapper::Head.new( right: 10 ),
RapiroWrapper::RightSholderRoll.new( up: 170 ),
RapiroWrapper::LeftSholderRoll.new( up: 170 ),
RapiroWrapper::RightSholderPitch.new( up: 40 ),
RapiroWrapper::LeftSholderPitch.new( up: 40 ),
RapiroWrapper::RightFootPitch.new( close: 0 ),
RapiroWrapper::LeftFootPitch.new( open: 0 ),
RapiroWrapper::Eyes.new('#330000')
], duration)
sleep duration * 0.1
end
commander.execute!([],10)
ドヤァ〜
commander.execute!([
RapiroWrapper::Head.new( left: 40 ),
RapiroWrapper::Waist.new( right: 40 ),
RapiroWrapper::LeftHandGrip.new( hold: 0 ),
RapiroWrapper::RightHandGrip.new( hold: 0 ),
RapiroWrapper::RightSholderRoll.new( up: 90 ),
RapiroWrapper::LeftSholderRoll.new( up: 20 ),
RapiroWrapper::LeftFootYaw.new( open: 30 ),
RapiroWrapper::RightFootYaw.new( open: 20 ),
RapiroWrapper::Eyes.new('#003300')
], 5)
sleep 1
commander.execute!([
RapiroWrapper::Head.new( right: 30 ),
RapiroWrapper::Waist.new( left: 30 ),
RapiroWrapper::LeftHandGrip.new( hold: 0 ),
RapiroWrapper::RightHandGrip.new( hold: 0 ),
RapiroWrapper::RightSholderPitch.new( up: 30 ),
RapiroWrapper::RightSholderRoll.new( up: 90 ),
RapiroWrapper::LeftSholderRoll.new( up: 0 ),
RapiroWrapper::LeftFootYaw.new( open: 30 ),
RapiroWrapper::RightFootYaw.new( open: 20 ),
RapiroWrapper::Eyes.new('#00ff00')
], 2)
sleep 5
commander.execute!([],10)
というわけで、人によっては使いやすいかも?
ぼちぼちテスト書くか〜
Discussion