🧸

RubyからRAPIROを制御する

2015/01/18に公開

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. しぐさサンプル

とりあえず全部動かしてみる

https://www.youtube.com/watch?v=iA_qV0nP3kA

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!([])

首ふり。

https://www.youtube.com/watch?v=6m-REzt9UDs

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)

あばれてみる。

https://www.youtube.com/watch?v=UvvGZUE2Si8

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)

ドヤァ〜

https://www.youtube.com/watch?v=q26WvcQ6zVk

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