[[up>Speecysロボット/プログラミング関係]] ---- #contents ---- Speecysプログラミングでは,多少関数間の依存等がある.ここでは使用するシーンに応じて代表的な流れを示し,理解の一助とする. *ほぼ共通の流れ [#idb976e8] spsInitializeDeviceはSpeecysロボットを使用するための初期化関数であり,それに対応するspsCloseDeviceはSpeecysロボットの使用を終了するための関数である.ロボットのハードウェアにアクセスする場合は必須である. |>|int main(){| | |spsInitializeDevice| |~|各種処理| |~|spsCloseDevice| |>|}| *サーボコントロール(動作) &aname(servo_control);[#i5ca95bc] サーボはRS485経由でコントロールされる.よってspsOpenRS485,spsCloseRS485xによって初期化・終了処理しなければならない.~ 設定1はサーボの諸設定であり,なくてもデフォルトの値が用いられるので使用しなくても良い.また各種処理中に動的に設定を変えたい場合(トルク率を変えることによって擬似力制御を行いたいとか),必要に応じて当関数を用いてもよいがあまり素直な使い方とは思えない.~ 設定2に関しては安全に用いる為のものであり,使用者が気にしないならなくてもよい.具体的なプログラムは,サーボを動かす(トルクをオンにする)前に,ロボットの現在の状態(現在のサーボの角度)を取得してその場所を目標位置として動かすように指令する.これによってロボットの状態に対する初期化を行う.もしこれを行わなず次の操作1においてサーボのトルクをオンにすると,最悪の場合サーボが突然最大速度で動いてしまいロボットにとっても周囲の人間にとっても危険となる.~ 各設定が終われば,操作1によってトルクをオンにしてサーボに力を入れる.~ また操作2を用いながら各動作を行わせる.~ 希望する動作が終わったら,操作3によってサーボの力を抜いて終了処理にはいる. |>|int main(){| | |spsInitializeDevice| |~|spsOpenRS485| |設定1:|spsSetAngleLimitServo| |~|spsSetComplianceServo| |~|spsSetPunchServo| |~|spsSetTorqueRatioServo| |設定2:|spsGetPresentDataServo| |~|spsMoveServo| |操作1:|spsPowerOnOffServo| |操作2:|spsMoveServo| |操作3:|spsPowerOnOffServo| | |spsCloseRS485x| |~|spsCloseDevice| |>|}| *サーボコントロール(状態取得) [#j2b1d3ae] サーボの情報を取得するプログラムの流れである.状態取得1は[[サーボコントロール(動作)>#servo_control]]での設定1で設定できる情報を取得するものである.また状態取得2はサーボの角度や温度などリアルタイムに変化する情報を取得するものである.ここで,spsSendxxxはサーボへ状態取得の指令を送るものであり,spsReadxxxは送った指令に対する返答を読み込むものである.両者は対になって用いられる.一方,spsGetxxxはspsSendxxxとspsReadxxxをまとめたものである.~ 状態取得1 |>|int main(){| | |spsInitializeDevice| |~|spsOpenRS485| |状態取得1:|spsGetSettingDataServo| |~|spsSendSettingDataServo, spsReadSettingDataServo| | |spsCloseRS485x| |~|spsCloseDevice| |>|}| 状態取得2 |>|int main(){| | |spsInitializeDevice| |~|spsOpenRS485| |状態取得2:|spsGetPresentDataServo| |~|spsSendPresentDataServo, spsReadPresentDataServo| | |spsCloseRS485x| |~|spsCloseDevice| |>|}| **注意 [#w6388dac] 以下のようなプログラムは正常に動かなかった. -spsSendSettingDataServo ⇒ サーボ1に指令 -spsSendSettingDataServo ⇒ サーボ2に指令 -spsSendSettingDataServo ⇒ サーボ3に指令 -spsReadSettingDataServo ⇒ サーボ1の情報取得 -spsReadSettingDataServo ⇒ サーボ2の情報取得 -spsReadSettingDataServo ⇒ サーボ3の情報取得 よって以下のように記述する必要がある. -spsSendSettingDataServo ⇒ サーボ1に指令 -spsReadSettingDataServo ⇒ サーボ1の情報取得 -spsSendSettingDataServo ⇒ サーボ2に指令 -spsReadSettingDataServo ⇒ サーボ2の情報取得 -spsSendSettingDataServo ⇒ サーボ3に指令 -spsReadSettingDataServo ⇒ サーボ3の情報取得 *サーボコントロール(一括制御) [#wa4f6a82] この操作は,動作と状態取得両方を行えるものである.基本的には複数のサーボへ一度に(等差指令・状態取得の)指令を送る用途に使用される.サーボのメモリマップなど詳しく知る必要がある. |>|int main(){| | |spsInitializeDevice| |~|spsOpenRS485| |操作:|spsSetLongDataServo| | |spsCloseRS485x| |~|spsCloseDevice| |>|}| *頭部(カメラ以外) [#pb4a28f4] 頭部の制御は二種類.目を光らせるのと首を動かすものである.首は他のサーボと違ってPWM制御となっている. 首 |>|int main(){| | |spsInitializeDevice| |操作1:|spsWritePWM| | |spsCloseDevice| |>|}| 目 |>|int main(){| | |spsInitializeDevice| |操作2:|spsSetLedSenser| | |spsCloseDevice| |>|}| **注意 [#h596229a] 目のLEDにおけるidと色の対応関係 -led0 --左黄 -led1 --左緑 -led2 --右緑 -led3 --左赤 -led4 --右赤 -led5 --右黄 -led0 ⇒ 左黄 -led1 ⇒ 左緑 -led2 ⇒ 右緑 -led3 ⇒ 左赤 -led4 ⇒ 右赤 -led5 ⇒ 右黄 *頭部(カメラ) [#xef944d7] 操作1は,システム起動後一回だけ実行.Speecysロボットをデフォルトで起動させた場合mmEyeなんとかが起動されているが,これのことか?~ 操作2はカメラのデータを取得する関数.timeoutを設定するかしないかの違いでどちらを使用してもよい.~ 操作3は画像データの変換であり,Speecysロボット上で実行しなくてもよい関数である.~ カメラ初期化 |>|int main(){| | |spsInitializeDevice| |操作1:|spsInitializeSaa7113| | |spsCloseDevice| |>|}| カメラデータ取得 |>|int main(){| | |spsInitializeDevice| |操作2:|spsGetCameraData, spsGetCameraData2| | |spsCloseDevice| |>|}| 画像データ変換 |>|int main(){| |操作3:|spsYUV2RGB| |>|}| *主にRPU-100関係 [#a87c6426] 操作1はRPU-100のA/Bボタンの状態取得である.~ 操作2はRPU-100のLedの操作・状態取得である.~ 操作3はバッテリーの残量の取得であり,相対量(%)ではなく絶対量である(V×10かな) A/Bボタン |>|int main(){| | |spsInitializeDevice| |操作1:|spsIsPushSwitch| | |spsCloseDevice| |>|}| Led関係 |>|int main(){| | |spsInitializeDevice| |操作2:|spsSetLed, spsGetLed| | |spsCloseDevice| |>|}| バッテリー量 |>|int main(){| | |spsInitializeDevice| |操作2:|spsGetBatteryVoltage| | |spsCloseDevice| |>|}| *センサーボード関連 [#xaa57f86] センサーボードに対する各種処理.~ 操作1はハードウェアの初期化であり,フレームが歪んだりサーボを交換したり等ハードウェア的に変更がなければ一回実行するだけでよい.~ 操作2はセンサー基盤の通信速度であり,これを変更した場合には操作1にて再度初期化をしなければいけない.~ 操作3はセンサーボードの各種情報(Gセンサー・ジャイロセンサーの情報)を取得する関数である.spsSendxxxは状態取得の指令を送るものであり,spsReadxxxは送った指令に対する返答を読み込むものである.両者は対になって用いられる.一方,spsGetxxxはspsSendxxxとspsReadxxxをまとめたものである.~ 初期化・設定 |>|int main(){| | |spsInitializeDevice| |操作1:|spsInitSenser| |操作2:|spsSetBaudRateSenser| |~|spsSendDataSenser, spsReadDataSenser| | |spsCloseDevice| |>|}| 使用 |>|int main(){| | |spsInitializeDevice| |操作3:|spsGetDataSenser| |~|spsSendDataSenser, spsReadDataSenser| | |spsCloseDevice| |>|}| *サーボのハードウェア設定 [#ac560b44] この操作はサーボのハードウェアをいじくるものであり,非常に危険である.最悪の場合Speecys社に送り返すかロボットをばらして設定しなければいけなくなる.完全に理解していない場合,以下の操作は使用してはいけない. |>|int main(){| | |spsInitializeDevice| |~|spsOpenRS485| |操作:|spsSetIDServo, spsSetIDandBaudRateServo| | |spsCloseRS485x| |~|spsCloseDevice| |>|}|