OpenRoadsでロボットアプリケーションを作る

2009年6月26日(金)
春日 知昭

インターネットロボット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に用意しておけば、たったこれだけでロボットが動くのです。あとはどんなタイミングで何をやらせるかを決めるだけです。

スピーシーズ株式会社
スピーシーズ株式会社代表取締役。ソニーにて、UNIXワークステーション「NEWS」やPC「VAIO」、犬型ロボット「AIBO」などITおよびロボット関連の開発に携わる。2001年、同社を退社後、スピーシーズを設立。ロボット技術とIT技術の融合によるインターネットロボットの市場導入を目指す。2010年は初の家庭用ロボットの発売を計画している。http://vision.speecys.com/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています