OpenRoadsでロボットアプリケーションを作る
インターネットロボットSPC-101Cを動かす4つの方法
ロボットアプリケーション開発用API「OpenRoads」を利用してインターネットロボットSPC-101Cを動かすには、以下に示す4つの方法があります。なお、OpenRoadsの仕様書はhttp://speecys.com/openroads.htmlからダウンロードできます。
1)miniSDメモリカード内にあるモーションのIDを指定してモーションを再生
(_SSR_RCMD_MOTIONパケットを利用。 参照:OpenRoads仕様書p.31)
2)22個のサーボに対して個別に角度を指定、制御
(_SSR_CMD_SERVOパケットを利用。 参照:OpenRoads仕様書p.32)
3)パソコンからポーズファイルを送信、再生
(_SSR_CMD_FILEパケットと_SSR_RCMD_POSE_FILEパケットを利用。 参照:OpenRoads仕様書p.24、p.29)
4)パソコンからモーションファイルを送信、再生
(_SSR_CMD_FILEパケットと_SSR_RCMD_MOTION_FILEパケットを利用。 参照:OpenRoads仕様書p.24、p.29)
※OpenRoads仕様書はver1.0.1のものです。
一例として、_SSR_CMD_SERVOパケットを使ったサンプルアプリを下に示します。
これを実行すると、ボタン(btnStart)を押すたびに首を左右に各90°、サーボの最高速から移動時間を1秒ずつ増やしながら4回振ります。サーボの目標位置と移動時間が簡単に指定できることがわかると思います。
Option Explicit On Friend Class Form1 Inherits System.Windows.Forms.Form Private intPortNo As Integer = 5001 '//ポート番号// Private objNetStream As System.Net.Sockets.NetworkStream Private objTcpClient As System.Net.Sockets.TcpClient Private dg1, dg2 As Byte Private tm1, tm2 As String Private time As Integer = 0 '//TCP/IP接続ルーチン// Private Sub chkTcp_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkTcp. CheckedChanged Dim intIpAdd As String = txtIp.Text If chkTcp.Checked Then objTcpClient = New System.Net.Sockets.TcpClient Try objTcpClient.Connect(intIpAdd, intPortNo) '//リモートホストと接続// objNetStream = objTcpClient.GetStream Catch Ex As Exception chkTcp.Checked = False End Try Else objTcpClient.Close() '//TCP接続を終了// Exit Sub End If End Sub Private Sub txtIp_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtIp.TextChanged If txtIp.Text = "" Then chkTcp.Checked = False If chkTcp.Checked Then objTcpClient.Close() 'TCP接続を終了// Exit Sub End If Else If chkTcp.Checked Then chkTcp.Checked = False End If End If End Sub '//_SSR_CMD_SERVOパケット組み立てルーチン// Private Sub neck() '//_SSR_CMD_SERVOパケットをリモートホストへ送信// Dim pac As Byte() = New Byte(22) {} pac(0) = &HFA pac(1) = &HFA pac(2) = &H0 pac(3) = &H20 '//_SSR_CMD_SERVO// pac(4) = &H0 pac(5) = &H0 pac(6) = &H0 pac(7) = &HC pac(8) = &H2 '//Sarvo ID:02(首)// pac(9) = &H0 pac(10) = &H0 pac(11) = &H0 pac(12) = &H0 pac(13) = &H0 pac(14) = &H14 pac(15) = &H4 pac(16) = dg1 '//目標角度// pac(17) = dg2 pac(18) = "&H" & tm1 '//移動時間// pac(19) = "&H" & tm2 pac(20) = &HFB pac(21) = &HFB objNetStream.Write(pac, 0, 22) System.Threading.Thread.Sleep((time * 10) + 500) '//移動待ちウェイト// End Sub |
'//首降り開始ルーチン// Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click Dim rg As Integer Dim rlf As Boolean = False time = 0 For rg = 0 To 4 If rlf = False Then rlf = True dg1 = &H7C dg2 = &HFC Else rlf = False dg1 = &H84 dg2 = &H3 End If If time tm1 = time.ToString("x") tm2 = "0" Else tm2 = time.ToString("x").Substring(0, 1) tm1 = time.ToString("x").Substring(1) End If neck() time = time + 100 '//1秒(10ms x 100)加算// Next dg1 = &H0 dg2 = &H0 neck() End Sub End Class '//終了ルーチン// Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If chkTcp.Checked Then Try If objTcpClient.Connected Then objTcpClient.Close() '//リモートホストを切断// End If Catch Ex As Exception Exit Sub '//有無を言わさず終了// End Try End If My.Settings.Save() Environment.Exit(0) '//閉じる// Me.Close() End Sub |
図1:ロボットの命令/応答パケット
_SSR_RCMD_MOTIONパケット
それでは、ロボットを動かす方法について具体的に説明していきます。
SPC-101Cのプロセッサボード(RPU-50)にはminiSDカードスロットが搭載されており、モーションやサウンドのストレージとしても使え ます。格納ディレクトリ(/MiniSD/copy/data/motion)には“motion.def”というシステムファイルがあり、 _SSR_RCMD_MOTIONパケットで渡されたモーションIDと実際のモーションファイル(*.mtr)とを関連付けています。以下は motion.defの例です。
00001:Fwd.mtr
00002:Back.mtr
00003:turnR.mtr
00004:turnL.mtr
00005:Banzai.mtr
このファイルとBanzai.mtr(モーションファイル)、Banzai.raw(サウンドファイル)をロボットのminiSDに格納し、下記に示す パケットをロボットに投げれば、ロボットはすぐにサウンドを再生しながらバンザイします。下に示したのが_SSR_RCMF_MOTIONパケットの例で す。
FA FA 00 11 01 00 00 08 01 10 00 00 00 05 00 00 FB FB
ここで重要なのは後半1/3辺りの4バイト“00 00 00 05”です。ここでモーションID5番を指定しています。インターフェースとしては4バイトデータなのですが、現状のシステムではモーション数は255個 までとなっています。
このパケットをVB.netで組み立てる場合のコードを以下に示します。
Private Sub mkpac()
Dim pac As Byte() = New Byte(18) {}
'データをリモートホストへ送信
pac(0) = &HFA
pac(1) = &HFA
pac(2) = &H00
pac(3) = &H11
pac(4) = &H01
pac(5) = &H00
pac(6) = &H00
pac(7) = &H08
pac(8) = &H01
pac(9) = &H10
pac(10) = &H00
pac(11) = &H00
pac(12) = &H00
pac(13) = "&H" & mtr '//モーションID//
pac(14) = &H00
pac(15) = &H00
pac(16) = &HFB
pac(17) = &HFB
objNetStream.Write(pac, 0, 18)
End Sub
モーションをminiSDに用意しておけば、たったこれだけでロボットが動くのです。あとはどんなタイミングで何をやらせるかを決めるだけです。
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- インターネット経由でロボットを動かす
- 加速度センサーやジャイロスコープセンサーを使った、3つのセンサーサンプル
- Leap Motionで画像のトリミングと保存を行うためのサンプルプログラムを作る
- 画面上の図形を5本の指で操作する基本的なLeap Motionプログラムを作る
- モーションセンサーとShareStatusTask、MediaPlayerLauncherを使う
- Leap Motionのスクリーン・タップを使った音声の再生と画像の表示
- マウス・カーソルで指定した画像の一部を拡大表示するLeap Motionプログラム
- 手の動きに合わせて画面上のキャラクターを操作するLeap Motionプログラムを作る
- VNC環境とRaspberry Piで簡単電子工作(3)
- 張子の虎をキー・タップすると頭が上下に動くLeap Motionプログラムを作る