▼ロボゼロのプログラミング

▼昨日紹介したモーションの全プログラム

ロボゼロのサーボのレイアウト変更をした人には参考になると思います
以下を、RXコントローラの【プログラム書き込み】からSDカードの“File番号5”に書き込みます(まんま書き込んでOK)

▼ここから

;■■■■■初期設定■■■■■

HomeSet(653,2000,1549,1311,2194,1555,2206,1069,2137,1939,1960,789,2171,1040,1032,815,1940,819,1431,824,1853,2427,1027,2267);↓【ホームコマンド】で自動生成
HOMEPOS;↑【ホームコマンド】で自動生成

WAIT(200);↓【スタートアッププログラム】で自動生成
V00=200
MOTORSPEED
V00=1
V01=1
V02=1
V03=1
V04=1
V05=1
V06=1
V07=1
V08=1
V09=1
V10=1
V11=1
V12=1
V13=1
V14=1
V15=1
V16=1
V17=1
V18=1
V19=1
V20=1
V21=1
V22=1
V23=1
POWER
WAIT(200)
WAIT(200)
WAIT(200)
V00=0
MOTORSPEED
WAIT(50);↑【スタートアッププログラム】で自動生成

;■■■■■メインルーチン■■■■■
:MAIN
;----------入力判定
JUMPIF(V121,=,32,PANCH);もし(×)が押されたらラベル[PANCH]に飛ぶ
;----------モーションDATAからの回帰場所
:END
JUMP(MAIN);----------メインに戻る


;■■■■■サブルーチン群■■■■■


;■■■■■モーションDATA群■■■■■

;==========パンチ==========
:PANCH
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)
MOVE(0,0,0,0,0,0,-238,58,-445,142,-4,-391,312,36,-184,425,-103,209,0,0,0,0,0,0,7200)
MOVE(-91,-191,-156,708,1,0,-238,58,-445,142,-4,-391,312,36,-184,425,-103,209,0,1,-974,-146,275,248,2400)
MOVE(753,-105,4,730,1,0,-238,58,-445,142,-4,-391,312,36,-184,425,-103,209,0,0,-1044,20,81,390,2400)
MOVE(-278,-201,-61,925,1,0,-238,58,-445,142,-4,-391,312,36,-184,425,-103,209,0,1,-398,64,105,-710,1200)
MOVE(-353,-232,32,1143,1,0,-238,58,-445,142,-4,-391,312,36,-184,425,-103,209,0,1,149,658,167,-895,240)
MOVE(710,-105,-64,398,-1,0,-209,103,-425,184,-36,-312,391,4,-142,445,-58,238,0,-1,-925,61,201,278,1200)
MOVE(895,-167,-658,-149,-1,0,-209,103,-425,184,-36,-312,391,4,-142,445,-58,238,0,-1,-1143,-32,232,353,240)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)
JUMP(END)

▲ここまで

※初期設定の“ホームポジションデータ”とパンチの“モーションデータ”は自身のロボゼロのものでないとダメです


▼プログラムの特徴

メインルーチンをぐるぐる回るだけのプログラムです
行数は7
サブルーチンとモーションデータは、メインルーチンの外に出してひとまとめにしました
プログラムの巨大化、複雑化で、自身が混乱しないようにしました


▼プログラムの説明

“初期設定”部分は、プログラムエディタの機能で自動生成してくれます
生成したプログラムはデフォルトでも問題ありませんが、自分の好みに合わせて数値を変えてみても面白いかもしれません

“メインルーチン”部分は、無線コントローラによって代入された数値を読みにいってます
この数値を判断して、パンチのモーションにジャンプさせてます

“サブルーチン”部分は、現段階ではまだ何も入っていません

“モーションDATA”部分には、パンチのモーションが入っています
モーション終了後は“プログラムの先頭”ではなく“メインルーチンの最後”に回帰するようにしました


▼無線制御のステートメント(プログラムの部位)はありません

無線コントローラからの入力は、自動的に特定の“変数”に代入されます
(というか“REV-1”がこれを自動的に処理してくれています)
なので、無線コントローラの電波を解析するような高度なプログラムはないんですね
“変数”に代入された数値を読んで、“JUMPIF文”で指定のモーションにジャンプするだけです

これをベースにサーボノイドあいたんのプログラムを作っていきます

▼“乱数”を発生させたい

▼乱数とは

ランダムで予測不能な数列を“乱数”といいます
生物や自然現象をシュミレートする時に重要な変数になります
例えば、“敵が自分に気づくか否か”“クリティカルを出すか否か”などなど
不規則的で“自然な動き”あるいは一見して無意味に見える“有機的な動き”を再現させるときに必要になります

そこそこのファームウェアだと、乱数を発生させてくれるコマンドがあったりするのですが、
ロボゼロには乱数を発生させるコマンドがありません(←なのでユーザーが作る必要があります)


▼変数とは ← 予備知識

変数とは、演算(計算)時に任意の数字を代入できる“X”や“Y”みたいなもので、
ロボゼロでは、V●●●とかV▲▲▲とか限られたものがその代用として(変数として)使えます
変数には、システム変数(代入できない)・ソフトウェア変数(用途が制限されている変数)・ユーザー変数があり、そのうち何の制限も無く使えるのがユーザー変数になります
ただ、ユーザー変数は無限にあるわけではないので効率的に使う必要があります


▼自由に使える変数→調査中

デアゴが用意したモーションプログラムは一切使わない(←使えない)ので、使える変数は、
ノーマル機体より多いと思われます
詳細については調査中・・・(調べたらUPします)


▼乱数発生につかえそうな変数

ロボゼロには、システムタイマーが付いています(水晶発振から得たものか?)
これを基にした?2つのタイマー変数が存在します

変数:V127 カウントアップ -32768→+32767(ソフトウェア変数)
変数:V129 カウントダウン +32767→0(システム変数) 

V129 は、正の整数のみ使用されています
この下2ケタを上手く取得できる方法があれば(任意のタイミングで)00~99の範囲の乱数が得られそうです


▼2ケタ乱数の取得方法


V110=V129;-------->V110にシステムタイマの数値(最大5ケタの正の整数)を代入
V111=V129;-------->V111にシステムタイマの数値(最大5ケタの正の整数)を代入
V111=V111/100;---->V111を百分の1にする→下2ケタが小数点以下になり消失する
V111=V111*100;---->V111を百倍にする→下2ケタ“00”で復活するも切り捨てられた感じに
V110=V110-V111;--->V110が2ケタ整数に更新される


これで2ケタ乱数の取得成功・・・できるかな??(検証中)

※V110,V111の変数を使った理由
ロボゼロのデフォルトプログラム“1~5分タイマー”にこの変数が使われています
(↑どこかのWebサイトの情報、、、ブックマークし忘れですスイマセン)
時間つながりで、覚えやすいと考えこの変数を使いました


▼モーションコール(コマンド)

MOTIONCALL(##)というコマンドがあるようです

JUMPIF(#,#,#,#)で同一プログラム上のラベルに飛ばすのではなく、
MOTIONCALL(##)で直接モーションをコールしてしまう技なのかな??

これが使えるとプログラムがすっきりしますね?

▼乱数発生プログラム

▼ロボゼロ用乱数発生のプログラムです

使用するユーザー変数は、V110とV111
0~99の乱数を発生し、V110に収納します(V111は計算に使います)

前回UPしたものはバグがあります←システムタイマ(129)からは数値が取得できませんでした
そこで取得先をソフトウェアタイマ(V127)に変更しました(←うまくいきました)
ただ、そのことにより3行ほどプログラムが長くなってます


▼アルゴリズム

ロボゼロのタイマーは、5ミリ秒毎に1カウントです・・・つまり1/100秒ストップウォッチの倍のスピードで動くタイマーになります
その下2ケタを抽出し、乱数として使います
しかし「はたして時間が乱数になりうるのか」という当然の疑問が出てきますが、、、答えは“ノー”・・・乱数ではありません
なぜなら得られる数値は、単に「ループ1周にかかる時間」にすぎないからです

ですが、ループの時間がキッカリ100カウント(500ミリ秒)のタイミングにならなければ同じ数値は繰り返されません
更に、しぐさモーションが発動すれば、ループの起点が変化しズレが生じます
まぁそんな理由で“乱数”としてつかえるワケです

乱数ではない=乱数として使えない わけではないということです

そもそもそんな高度な使い方をしているわけではないので問題はないというわけです


ぱぱっちさんより、INPUTDCコマンドでの乱数取得のアイデアを頂いています
ロボゼロには常に変化する変数がかなり存在し、それらを加減乗除すれば法則性の薄い乱数がまだまだ取得できる可能性を見出して頂きました
また、このアイデア(INPUTDC)はロボゼロが疲れてきたら(バッテリーが消耗してきたら)発動するモーションなども作れるってことを意味していますから、ロビの「お腹すいたー」のモーションをロボゼロでまんまトレースすることも可能です
面白いアイデアを有難う御座いました


▼乱数発生プログラムの導入の注意

プログラムはどこにおいても動作します(まんま、好きなところに貼り付けて下さい)
ただ、変数:V110と変数:V111を既に使っているプログラムには導入できません


▼プログラム

;↓乱数発生プログラム ここから
V110=V127;-------> V110にソフトウェアタイマの数値(最大5ケタの整数)を代入
V111=V127;-------> V111にソフトウェアタイマの数値(最大5ケタの整数)を代入
V111=V111/100;---> V111を百分の1にする→下2ケタが小数点以下になり消失する
V111=V111*100;---> V111を百倍にする→下2ケタ“00”で復活するも切り捨てられた感じに
V110=V110-V111;--> V110が2ケタ整数に更新される
JUMPIF(V110,>,0,RND_END) ;--> もしV110が正の数なら[RND_END]に飛べ
V110=0-1*V110 ;--> V110に-1を乗じて正の数にする
:RND_END
;↑乱数発生プログラム ここまで

新たな乱数を取得したい場合は、その都度プログラムを実行する必要があります
なので、サブルーチン化してその都度『コール』した方が(使い方としては)合理的です
コールするたびにV110が更新されます

コールは『CLL(###)』⇔『RETURN』で行います ※###はランダムルーチンの(任意の)ラベル

▼無限モーションプログラム

▼乱数分岐による“無限仕草モーション完成”

電源を入れると、勝手にモジモジ動き出します
モジモジはいまのところ2パターン
ランダムなインターバル、ランダムな分岐によってモジモジは制御されてます

20130207ZPM_01.jpg
▲・・・ですが仕草モーションが納得いきません(実際はもっと派手)

コンセプト・・というか方向性は間違っていないと思われます・・・
モーションがわざとらしく大きなことが問題かもしれません
全然萌えません##

ひとまず、動作確認がとれたのでプログラム全体を公開しておきます
乱数分岐による仕草モーション導入を考えているビギナー様の参考にでもなればと思います

▼ここから
;■■■■■初期設定■■■■■
;
;▼【ホームコマンド】で自動生成(注意★自身のロボゼロのデータでないとダメ)
HomeSet(773,1960,1495,1360,2095,1541,2045,961,2427,929,2026,1959,1039,990,2072,616,2005,856,1459,806,1651,2462,1033,2225)
HOMEPOS
;▼【スタートアッププログラム】で自動生成
WAIT(200)
V00=200
MOTORSPEED
V00=1
V01=1
V02=1
V03=1
V04=1
V05=1
V06=1
V07=1
V08=1
V09=1
V10=1
V11=1
V12=1
V13=1
V14=1
V15=1
V16=1
V17=1
V18=1
V19=1
V20=1
V21=1
V22=1
V23=1
POWER
WAIT(200)
WAIT(200)
WAIT(200)
V00=0
MOTORSPEED
WAIT(50)
;
;■■■■■メインルーチン ここから■■■■■
:MAIN
;----------乱数(V110)取得のサブルーチンをコール
CALL(RANDOMIZE)
;----------仕草判定
JUMPIF(V110,=,10,S_NOBI_1);もしV110(乱数)=10 ならラベル[S_NOBI_1]に飛ぶ
JUMPIF(V110,=,20,S_MOJI_1);もしV110(乱数)=20 ならラベル[S_MOJI_1]に飛ぶ
;----------入力判定
JUMPIF(V121,=,32,PANCH);もし(×)が押されたらラベル[PANCH]に飛ぶ
;----------モーションDATAからの回帰場所
:END
JUMP(MAIN);----------メインルーチンの最初に戻る
;■■■■■メインルーチン ここまで■■■■■

;■■■■■サブルーチン群
;----------2ケタの乱数を変数V110に取得
:RANDOMIZE
V110=V127;-------> V110にシステムタイマの数値(最大5ケタの正の整数)を代入
V111=V127;-------> V111にシステムタイマの数値(最大5ケタの正の整数)を代入
V111=V111/100;---> V111を百分の1にする→下2ケタが小数点以下になり消失する
V111=V111*100;---> V111を百倍にする→下2ケタ“00”で復活するも切り捨てられた感じに
V110=V110-V111;--> V110が2ケタ整数に更新される
JUMPIF(V110,>,0,RND_OK) ;--> もしV110が2ケタ正の整数なら[RND_OK]に飛べ
V110=0-1*V110 ;--> V110に-1を乗じてプラス化する
:RND_OK
RETURN
;■■■■■モーションDATA群(注意★自身のロボゼロのデータでないとダメ)
;
;==========パンチ==========
:PANCH
;パンチのモーション調整中
JUMP(END);----------メインルーチンの最後に戻る
;
;==========仕草01(伸び)==========
:S_NOBI_1
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)
MOVE(-159,-122,5,-255,-25,-77,-85,31,-2,9,35,-2,0,36,-2,1,-16,-95,6,2,-30,-1,132,193,7200)
MOVE(-238,-178,232,-441,-25,-45,-198,36,3,13,72,0,1,60,2,-2,-8,-194,5,2,-1145,-740,416,-417,7200)
MOVE(-219,-302,-158,-472,-661,-73,-135,63,-3,46,58,-1,-1,57,-30,-6,-18,-140,7,699,-1032,-1015,408,-354,7200)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)
JUMP(END);----------メインルーチンの最後に戻る
;
;==========仕草02(もじもじ)==========
:S_MOJI_1
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)
MOVE(141,67,-384,-3,-19,-83,-217,117,109,186,76,-2,0,54,-162,-126,-65,-200,9,0,1,108,-155,-169,7200)
MOVE(169,-43,-270,-420,-175,-82,-54,83,120,175,24,-2,-1,4,-167,-130,-59,-40,8,128,453,108,3,-115,7200)
MOVE(-117,5,-274,-470,-736,77,160,52,125,156,-54,-1,0,-74,-173,-132,-69,181,-2,634,454,109,-84,46,7200)
MOVE(200,75,-249,-1,-191,42,-66,236,-5,89,18,-2,-1,11,-45,53,-239,-62,2,167,-58,228,-83,-181,7200)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)
JUMP(END);----------メインルーチンの最後に戻る
▲ここまで

乱数発生プログラムはサブルーチン化してメインループの外に出しています
メインループの“CALL(RANDOMIZ)で、ラベル“RANDOMIZ”の乱数発生サブルーチンをコールし、サブルーチン末行の“RETURN”でメインループに復帰します
サブルーチン化のメリットは、、
①メインループがスッキリし見やすくなること
②他の演算でも自由に何度でもコールでき、新しい乱数を取得できること
③乱数サブルーチンをそっくり入替え(バージョンアップ)できること
などなど




▼動作が大きいことが良いとは限らない←ちょっと思い出した

実は、サーボノイドあいたんのバストには“ゆるるんギミック”が内蔵してあり揺れるようになってます
このギミックを作る時、揺れる量を研究したのですが“バストの揺れは小さいほどエロい”ことが判明しています→【コチラ】

そもそも“仕草”は気づかない人の方が多いくらいですから、そういう意味ではオーバーアクションにする必要はなんですね(←なぜ気づかなかったんだろう)


▼─wwヘ√レvv~(゚∀゚)─wwヘ√レvv~─ 、、、なんだ?(アムロ風)

なぜ気づかなかったんだ!
宝の持ち腐れじゃないか
くそ~ああああコレだ!!
思い出したよ!
思い出したよおおおおあああ!!


20130207ZPM_02.jpg
▲サーボノイドあいたんも気合が入ってきたようです

最小限度の動きで効果的に乳ゆれを誘発させるーション←これこそが正解
気づいてよかったです
危うく“タダの乳”に成り下がるところでした、、
さぁ、あいたんプルプル揺らせましょうねぇ~♪
■スポンサー
■ロボット通販


■カウンター
カウンタ → 

現在の閲覧者数 → 
■更新履歴
09 ≪ 2017/10 ≫ 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
■サーボノイドあいたん
■カテゴリ
■ロビ
▼サイト内検索
■最新コメント
■ショートカット
▼ヴィストン楽天ショップ
■関連リンク
▼エンジョイ工業(ブログ)
専門用語をあまり使わない初心者に優しいロボゼロ関連サイト。電気回路の基礎はここで学びました
▼ROBOMIC(ブログ)
ロボゼロフリークにとって絶対的存在ソフトウェア神の運営するブログです。降臨が続く限りロボゼロの進化は止まりません
▼ぱぱっちの私事
ロボゼロ進化のお手本がここにあります。
他の追随をゆるさない完成されたデザインが圧巻です
▼デアゴ掲示板
ロボゼロの掲示板
カコキには登録が必要

▼2ch掲示板
ロボゼロの掲示板
希に重要な情報あり

▼デアゴ特設ページ
ロボゼロWebサイト

▼JO-ZERO Type2
ロボゼロの兄弟機種
同一のコンポーネントのロボット

月別アーカイブ
ヤフーショップ