はじめに
ROBO-ONEサーバはROBO-ONE委員会に協賛されている企業から提供いただいているアプリケーションやデバイスの間を取り持つアプリケーションとその付帯コンポーネントで構成されるミドルウェアです。
サーバの主な機能は、サーボメーカ各社で異なる通信プロトコルやI/F、さらにはそれら利用した際の操作手順の相違をサーバ内で出来うる限り吸収し、上位アプリケーションからはもう少し抽象的に角度指令や現在のステータスの取得といった環境を提供する事にあります。
リアルタイム性を要求されるデバイスとのコミュニケーションについては標準APIを使用して可能な限りプライオリティの高い状態で処理を行い、異なるベンチであっても上層のアプリケーションの修正は基本的に必要なく、通信を意識せずにアプリケーションの開発に専念できる事に期待しています。
なお、ここで公開するプログラムは本来の機能を極端に絞った上、諸々制限を設けているため、アクチュエータ以外のデバイスやタスクの追加等には対応していないROBO-ONEのコンテスト向けにあつらえたフリーソフトウェアとなります。
また、昨年までのコンテスト向けに配布したバージョンとある程度の機能は踏襲していますが、バージョン違いの混在による不具合を防ぐ目的で、意図的に各APIの名称等を変更しています。
概要
以下はサーバを挟み上層(MatlabやLabVIEW)と下層(デバイス)の環境を含む構成図です。
サーバでは各デバイスへの指令やステータスの取得を高い周期で処理し、それらから得られるデータを上位アプリケーション向けに変換や咀嚼をして提供します。
上位アプリケーションとは個別のプロセスとなるため、基本的に非同期で処理がなされます。
現在サーバが管理しているデータは以下の通りです。
- 256軸分の各アクチュエータの目標角度[deg]
- 256軸分の各アクチュエータの現在アラームステータス
- 256軸分の各アクチュエータの角加速度[deg/s^2]
- 256軸分の各アクチュエータの現在角度[deg]
- 256軸分の各アクチュエータの現在トルク
これらの情報は逐次サーバ内で処理され、上位のアプリケーションからは自由に読み書きが出来ます。
なお、ROBO-ONE向けとしてコンテスト毎に最大軸数の制限を設けたり、限定的な機能拡張を都度行っています。現時点で対応する軸数は6となります。
サポート対象
コンテスト毎に限定的にサポートするデバイスが追加される場合もありますが、現在標準で対応しているものを挙げます。
OS
Intel CPU用Microsoft Windows XP以降でサーバを除きます。32bitないし64bitはいといませんが、管理者権限でログインしている必要があります。
Linuxはリアルタイムカーネルに依存する構成のため、フリーソフトウェアとして単体での公開は行いません。
アクチュエータ
次のサーボメーカのシリーズとシミュレータのうち、ROBO-ONE標準化APIにて対応が明記されているものに限ります。
ROBO-ONE標準化APIをベースにDLLが提供されたら他のデバイスにも対応してく予定です。
アプリケーション
サーバが管理するデータへのアクセスパスは、専用のdllを仲介する形で提供されます。GUIベースのツールからこれらのdllをアクセスする事が容易でないため、以下に挙げるツールにおいてはラッパーを提供しています。
ファイル一覧
簡易版と言う事もあってかなり雑多な管理にし、実行にあたって必要なファイルをカレントにある前提にしたため、ファイルが多めになっています。
また、あえてインストーラを設けておらず、アクセス制限のないフォルダに配置して使用します。
SERVER
サーバ本体に関連するファイル一覧です。、
- SERVER32.exe/SERVER64.exe
サーバ本体。ROBO-ONE標準化API(dll)と設定ファイル(xml)と合わせて使用。
- targetedit.exe
後述のxmlファイルを編集するツール。
- dxlib_x32.dll/dxlib_x64.dll
ROBOTIS Dynamixelシリーズ用標準化API。Ver.2.9降版。
I/FはCOMポート(仮想も含む)が提供されている事。
- krslib_x32.dll/krslib_x64.dll
KONDO ICS3.0/3.5 KRSシリーズ用標準化API。Ver.1.1以降版。
I/FはCOMポート(仮想も含む)が提供されている事。
- rslib_x32.dll/rslib_x64.dll
FUTABA RSシリーズ用標準化API。Ver.1.1以降版。
I/FはCOMポート(仮想も含む)が提供されている事。
- gslib_x32.dll/gslib_x64.dll
TECHNO ROAD Go Simulation!用標準化API。Ver.1.1以降版。
I/Fはソケットが提供されている事とアンチウィルス等によりポートがブロックされていないこと。
- gosim_roboone_api_socket\DllCont2.dll
gslibとGo Simulation!の任意プロジェクトを接続するためのプラグイン。本ファイルの設置と運用方法はGo Simulation!のドキュメントに委ねる。
- arm_robotis.xml
ROBOTIS Dynamixelシリーズで構成される実機の情報を定義したファイル。
- arm_kondo.xml
KONDO ICS3.0/3.5 KRSシリーズで構成される実機の情報を定義したファイル。
- arm_kondo_b3m.xml
KONDO B3Mシリーズで構成される実機の情報を定義したファイル。
- arm_futaba.xml
FUTABA RSシリーズで構成される実機の情報を定義したファイル。
- arm_gosim.xml
TECHNO ROAD Go Simulation!で構成されるモデルの情報を定義したファイル。
これらが同一フォルダに存在している必要があります。_x32や_x64といったサフィックスはWindowsの32bitか64bitで任意ないし自動で選択しますが、少なくとも32bit版のWindowsでは64bit版のバイナリは使用できません。
また、サーバ内の都合で「管理者権限」でしか正常に動作しません。
LabVIEW
LabVIEWからサーバで管理される情報へアクセスするためのコンポーネントです。
ラッパールーチンの使用方法は、ひとまず同梱されるtestという名称のファイルを参照の上、何かあればメーリングリストにて問い合わせて下さい。
なお、同梱するviはLabVIEW 2011で記述しているため、これより古いバージョンのLabVIEWには対応していません。
- SHMIF32.dll
外部アプリケーションからサーバへアクセスするためのI/Fを含んだdll。
- SHMIF.llb
LabVIEWからSHMIF32.dllをアクセスするためのラッパーvi集。dllと同一フォルダにあるものとする。
- GetDiffTime.vi
コールされると前回コールされた時間との時差[ms]を返す。ループさせているルーチンの実行時間を簡単に計測するために用意。
- GetElapsedTime.vi
コールされるとサーバ内の実行時間[ms]を返す。時間を引数にして処理する場合に利用する。
- GetAlarmStatus.vi
各軸のアラームをサーバでの定義有無にかかわらず6軸分の配列で取得する。
特に問題が無い軸の値は0、何かしらの問題が発生している軸はそれ相応の数値が返される。
- SetBlntGain.vi
指令角度への遷移時間を設定する。0(=1)ないし1で遅れなし、0よりも大きくするに連れ遷移時間が短くなる。ステップ的な角度指令がなされても動きをあえて鈍らすために用意。
- SetGate.vi
各軸の位置決め制御を最大6軸分の配列で開始(TRUE)・停止(FALSE)させる。FALSEが指令された軸へ角度指令しても、アクチュエータへの角度指令は行われない。FALSEからTRUEに変化させると、予め指令されている角度へ位置決め制御を開始する。
- SetGateEachOne.vi
指定された1軸の位置決め制御を開始(TRUE)・停止(FALSE)させる。FALSEが指令された軸へ角度指令しても、アクチュエータへの角度指令は行われない。FALSEからTRUEに変化させると、予め指令されている角度へ位置決め制御を開始する。
- SetAngle.vi
各軸の角度[deg]を最大6軸分の配列で指令する。実際の制御はSetGate・SetBlntGain・SetAngularVelocityで設定された値に影響される。
- SetAngularVelocity.vi
各軸の角速度[deg/sec]を最大6軸分の配列で指令する。アクチュエータ自体がそういった指令をサポートしているか否かにかかわらずサーバ自身にて対応する。
- SetAngleOneAxis.vi
指定された1軸の角度[deg]と角速度[deg/sec]を指令する。
- GetPhisicalAngle.vi
各軸の現在の角度[deg]をサーバでの定義有無にかかわらず6軸分の配列で取得する。
- GetPhisicalTorque.vi
各軸のトルクをサーバでの定義有無にかかわらず6軸分の配列で取得する。単位はデバイスに依存。
Matlab/Simulink
Matlab/Simulinkからサーバで管理される情報へアクセスするためのコンポーネントです。環境によってはCコンパイラが別途必要です。
また、Matlabの「パスの設定」で本フォルダを登録しておく必要があります。
こちらもラッパールーチンの使用方法は、同梱されるtestという名称のファイルを参照の上、何かあればメーリングリストにて問い合わせて下さい。
- SHMIF32.dll/SHMIF64.dll
外部アプリケーションからサーバへアクセスするためのI/Fを含んだdll。
- SHMIF.h
SHMIF内で定義されるAPIのプロトタイプ宣言を含むヘッダファイル。コンパイル際に必要。dllと同一フォルダにあるものとする。
- roboone_svif.mdl
SimulinkからSHMIF32.dllないしSHMIF64.dllをアクセスするためのラッパーブロック集。dllと同一フォルダにあるものとする。
- GetDiffTime
コールされると前回コールされた時間との時差[ms]を返す。ループさせているルーチンの実行時間を簡単に計測するために用意。
- GetElapsedTime
コールされるとサーバ内の実行時間[ms]を返す。時間を引数にして処理する場合に利用する。
- GetAlarmStatus
制御している各軸のアラームをサーバでの定義有無にかかわらず6軸分の配列で取得する。
特に問題が無い軸の値は0、何かしらの問題が発生している軸はそれ相応の数値が返される。
- SetBlntGain
指令角度への遷移時間を設定する。0(=1)ないし1で遅れなし、0よりも大きくするに連れ遷移時間が短くなる。ステップ的な角度指令がなされても動きをあえて鈍らすために用意。
- SetGate
各軸の位置決め制御を最大6軸分の配列で開始(1)・停止(0)させる。0が指令された軸へ角度指令しても、アクチュエータへの角度指令は行われない。0から1に変化させると、予め指令されている角度へ位置決め制御を開始する。
- SetGateEachOne
指定された1軸の位置決め制御を開始(1)・停止(0)させる。0が指令された軸へ角度指令しても、アクチュエータへの角度指令は行われない。0から1に変化させると、予め指令されている角度へ位置決め制御を開始する。
- SetAngle
各軸の角度[deg]を最大6軸分の配列で指令する。実際の制御はSetGate・SetBlntGain・SetAngularVelocityで設定された値に影響される。
- SetAngularVelocity
各軸の角速度[deg/sec]を最大6軸分の配列で指令する。アクチュエータ自体がそういった指令をサポートしているか否かにかかわらずサーバ自身にて対応する。
- SetAngleAndVelocityEachOne
定された1軸の角度[deg]と角速度[deg/sec]を指令する。
- GetPhisicalAngle
各軸の現在の角度[deg]をサーバでの定義有無にかかわらず6軸分の配列で取得する。
- GetPhisicalTorque
各軸のトルクをサーバでの定義有無にかかわらず6軸分の配列で取得する。単位はデバイスに依存。
- slblocks.m
先のラッパーブロックをSimulinkのライブラリブラウザに登録するmファイル。dllと同一フォルダにあるものとする。
- *.m
arm.mdlから呼ばれるM-ファイル群。
サーバの使用方法
構成ファイルエディタ(targetedit.exe)の各部詳細
付属するxmlファイルの中身を編集するエディタです。xmlファイルをテキストエディタ等で編集した場合の動作は保証できないため、必ず本エディタで編集しなくてはなりません。
targetedit.exeを実行すると、次の様なウィンドウが開きます。
各部位の名称と機能は以下の通りです。
- Target
ドロップダウンしたリストより、編集する構成ファイルを選択。後述のDevice nameにはTargetで選択したメーカでかつ標準化APIがサポートするデバイスが列挙される。
- Save
現在編集中のI/F・Baudrate・デバイスリストをTargetで選択した構成ファイルへ上書き保存する。
- I/F
サーバがデフォルトで使用するI/Fを記述する。
- Baudrate
サーバがデフォルトで使用するI/Fの通信速度等を記述する。なお、使用する全てのデバイスが同じ通信速度でなくてはならない。
- デバイスリスト
デバイスの一覧が表形式で表示される。マウスの左クリックで選択されたデバイスがウィンドウ下段の編集エリアにて変更可能。右クリックで表示されるポップアップメニューから追加や削除が可能。
- Selected Device
- ID
デバイスのID。デバイスがサポートする範囲かつデバイスリスト内で未登録のIDのみが選択可能。
- Device name
現在選択しているデバイスの名称が表示される。ドロップダウンするとサポートするデバイスが列挙される。その中から任意のデバイスを選択すると、エディタ内で決められたデフォルト値が各パラメータへ反映される。
- min pos
移動させる際の最小の「位置」(デバイス自身が位置として受けとれる値)を指定。選択したデバイスがサポートする範囲外は指定出来ないのと、min pos ≦ home pos ≦ max posの条件が満足されなくてはならない。
サーバはmin posよりも小さい値を指令しないため、構造的に干渉しない範囲を設定したい場合にのみ制限を設ける事。
- home pos
サーバから0°の角度を指定された際の「位置」(デバイス自身が位置として受けとれる値)を指定。サーバが0°とみなす際のオフセット位置として、ここで指定された置を使用する。選択したデバイスがサポートする範囲外は指定出来ないのと、min pos≦home pos≦max posの条件が満足されなくてはならない。
- max pos
移動させる際の最大の「位置」(デバイス自身が位置として受けとれる値)を指定。選択したデバイスがサポートする範囲外は指定出来ないのと、min pos≦home pos≦max posの条件が満足されなくてはならない。
サーバはmax posよりも大きい値を指令しないため、構造的に干渉しない範囲を設定したい場合にのみ制限を設ける事。
- Angle conversion coefficient
「位置」と「角度」を相互に変換する際の係数。計算式は以下の通り。
角度[deg]=位置÷係数
なお、サーバではマイナスが付与されていると逆回転させるものと判断するのと、home posを含めて変換がなされる。
- Update
デバイスリスト中の選択されたデバイスへ編集したパラメータを上書きする。なお、条件が整わないと本ボタンが活性化しない。
位置と角度の関係を具体的に説明します。
0~1023の範囲で位置指令を行うと0~300°の角度で制御出来るアクチュエータがあった場合、単純に角度から位置を算出する際の係数は(1023+1)÷300≒3.41となります。次に、動作させたい範囲は「位置」で決定するものとしているため、物理的に動作できない位置があるのであれば、min posとmax posを変更して動作範囲を狭めます。最後にサーバから0°を指定された際のアクチュエータの位置をhome posに設定して終了です。
次の図に min pos=106, home pos=565, max pos=816 とした場合の角度との相関を示します。
また、アクチュエータから取得された位置を角度に変換する際にも、これらの値が使用されます。そのため、相互に数値誤差が生じます。
サーバ(SERVER32.exe/SERVER64.exe)の各部詳細
SERVER32.exeないしSERVER64.exeを直接実行すると、次の様なウィンドウが開きます。起動前にユーザーアカウント制御等のセキュリティにかかるダイアログボックスが表示された場合は、メッセージに従い「許可」します。
各部位の名称と機能は以下の通りです。
- I/F (I/F選択)
- COMポートの場合
実際にPCに装備されているCOMポートが全て列挙されるので、その中から選択。
Openしている間は変更不可。
- その他
NETWORK等。
Openしている間は変更不可。
- BAUDRATE (通信速度等)
- COMポートの場合
選択したI/Fで使用する通信速度を設定。アクチュエータ等の設定と一致させなくてはならない。
Openしている間は変更不可。
- その他
主にネットワークの設定を記述。IPアドレス:PORT番号といった具合。
Openしている間は変更不可。
- Port Open/Port Close (I/F開閉ボタン)
Port Openと書かれている時が閉じている状態、Port Closeと書かれている状態が開いている状態となる。押下する事で相互に切り替わり、何らかの問題があると開くことが出来ない。
- Target (ターゲットリスト)
列挙されるターゲットから任意のものを選択する。使用するデバイスと同じメーカのアイテムを選択する事。起動直後は前回終了時に選択されていたターゲットが自動選択される。
ポートが閉じている時にのみ選択の変更が可能。
- Running, Alarm (ステータスランプ)
サーバが運転している最中の状態を表示する。Runningは運転中に一定間隔で明滅し、停止中に消灯する。Alarmは運転中に標準化APIから得られるアラームによって点灯ないし消灯する。
Alarmが点灯している状態で運用し続けることは好ましくないため、サンプルプログラム等を使用してアラームの要因を調査し適宜対処の事。
- Start, Stop (開始・停止ボタン)
サーバの運転及び停止を指示する。運転中は標準化APIを使用してデバイスとの通信が常に行われている。
Openしている時にのみ変更が可能。
基本的な運用手順
- 構成ファイルの編集(必要に応じて)
テンプレートとして用意されたxmlファイルには、3軸で構成されたアクチュエータが定義されています。まずは自信の環境に合わせて構成を修正します。
- 任意の構成ファイルを選択。
- 必要な軸数分だけデバイスリストを追加。
- ID・デバイス名・位置の範囲・ホームポジション・角度変換係数を適宜修正。
- 保存して終了。
- I/Fと実機の準備
- アクチュエータに応じたPC用のI/Fを準備し、各アクチュエータのIDと通信速度を予め先のエディタで設定したものに変更。
- 各社から提供されるツール等で最低限の動作確認を行っておく。
- 全て接続し電源を投入。
次の図はDynamixelを例にしたものだが、概ねどのメーカのアクチュエータも似た構成になるはず。
- サーバの運転
- サーバのポートがクローズしている状態で、Targetから任意の構成ファイルを選択。
- ポートやボーレートが予定と異なっているのであれば適宜変更。
- Port Openボタンを押下後、Startボタンを押下。Runningが一定間隔で点滅し、Alarmが消灯していれば概ね運転開始完了。
なお、一部のTargetにおいて運転開始直後に1度だけ特殊な処理を付加するものがある。その場合、運転中にデバイスの電源を入れ直す等の操作をすると、この付加処理がデバイス側でキャンセルされて正常に動作しなくなる。その際はStopボタンを押下後に再度Startボタンを押下し、付加処理を促すことで対処する事。
- ユーザアプリケーションの実行
SHMIFを使用してデザインしたMatlab/SimulinkやLabVIEW用アプリケーションは、基本的にサーバの状態とは関係なく単独で実行されていても構いません。もちろんサーバが停止している間は、サーバが収拾しているデータは更新されないためにアプリケーション上でも更新されません。
- サーバの停止・終了
- Stopボタンを押下
- Port Closeボタンを押下
- アプリケーションの「×」ボタンで終了
ダウンロード
- robo-one_server_v1.4
公開日: 2013/11/12
サイズ: 5,842,198 byte
MD5チェックサム: bb2cd2ce10d1b0df65bf0fc1ee459d81
更新内容:krslibのバグ修正, KONDO B3M対応, 軸毎に個別指定するAPI追加, 鈍しフィルタと角速度演算の多段化対応, 構成ファイルエディタで設定したCOMが選ばれないバグ修正, LabVIEW用サンプル追加
- robo-one_server_v1.3.1
公開日: 2013/10/10
サイズ: 7,199,377 byte
MD5チェックサム: efc871297b9d648050c7e2210f99c8e
更新内容:32bit版のdllコールを修正(未使用のため特段影響なし), dxlib_x??.dllのデフォルトオフセットタイムを0から20に変更しタイムアウトの検出をゆるめに
- robo-one_server_v1.3
公開日: 2013/09/17
サイズ: 6,747,283 byte
MD5チェックサム: a13b8a573253d3a7a70bda538a624ff0
ダウンロードファイルは自己解凍書庫になっており、解凍先をデフォルトのまま実行すると、PCの「マイ ドキュメント\besttech」フォルダへ全て解凍されます。またブラウザから直接実行するとセキュリティーの問題で実行出来ない場合がありますので、ダウンロードした上でエクスプローラ等から実行して下さい。
- フォルダ構成
besttech | server | gosim_roboone_api_socket | GoSim用プラグイン |
サーバ・構成ファイルエディタ等 |
hostapp | labview | LabVIEW用ラッパー及びサンプル類 |
matlab | Matlab/Simulink用ラッパー及びサンプル類 |
留意事項
PCとアクチュエータ間のI/Fの大半は、FTDI社のUSBシリアル変換チップを搭載しているものと思います。このチップを使用している場合、「待ち時間」という設定がデバイスドライバに存在します。この値が大きければ大きいほど遅延が生じ、見かけ以上のパフォーマンスが落ちるため、本サーバで使用する場合は1msに設定を変更して下さい。変更の方法はこちら。
その他
アラーム
サーバの運転中にアクチューエータに何かしらの問題が生じていると、サーバのウィンドウに配置されたAlarmのLEDが点灯します。これだけではアラームの要因を特定できないため、SHMIF32.dllのSHGetAlarm(LabVIEWならGetAlarmStatus.vi、simulinkならGetAlarmStatus)を使用して各軸の16bitで表されるアラーム情報を取得して判断してください。
メーカごとのアラーム情報のビットアサインは以下の通りです。
Vendor | Bit | Information |
ROBOTIS | 15 | 不正デバイスIDエラー |
14 | 不正IDエラー |
13 | 異IDエラー |
12 | 不正サイズエラー |
11 | 不正パラメータエラー |
10 | COMポートエラー |
9 | チェックサムエラー |
8 | 通信タイムアウト |
7 | - |
6 | インストラクションエラー |
5 | 過負荷 |
4 | チェックサムエラー |
3 | レンジエラー |
2 | 過加熱 |
1 | アングルエラー |
0 | 過電圧 |
KONDO KRS | 15 | 不正デバイスIDエラー |
14 | 不正IDエラー |
13 | 異IDエラー |
12 | 不正サイズエラー |
11 | 不正パラメータエラー |
10 | COMポートエラー |
9 | チェックサムエラー |
8 | 通信タイムアウト |
7 | - |
6 | - |
5 | - |
4 | - |
3 | レンジエラー |
2 | - |
1 | - |
0 | - |
KONDO B3M | 15 | 不正デバイスIDエラー |
14 | 不正IDエラー |
13 | 異IDエラー |
12 | 不正サイズエラー |
11 | 不正パラメータエラー |
10 | COMポートエラー |
9 | チェックサムエラー |
8 | 通信タイムアウト |
7 | B3MのSTATUSに準拠 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
FUTABA | 15 | 不正デバイスIDエラー |
14 | 不正IDエラー |
13 | 異IDエラー |
12 | 不正サイズエラー |
11 | 不正パラメータエラー |
10 | COMポートエラー |
9 | チェックサムエラー |
8 | 通信タイムアウト |
7 | 温度リミットエラー |
6 | - |
5 | 温度リミットアラーム |
4 | - |
3 | フラッシュROM書き込みエラー |
2 | - |
1 | 受信パケット処理不能エラー |
0 | - |
TECHNO ROAD | 15 | 不正デバイスIDエラー |
14 | 不正IDエラー |
13 | 異IDエラー |
12 | 不正サイズエラー |
11 | SOCKETエラー |
10 | - |
9 | - |
8 | - |
7 | - |
6 | - |
5 | 不正PORTエラー |
4 | 不正パラメータエラー |
3 | メモリエラー |
2 | タイムアウト |
1 | 未知エラー |
0 | - |