スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

44番情報公開2 中身

まあ、中身書いて行きましょう。 前回書いた物以外でつくったおもしろいものもあるよ。

●motor()に関して

三角関数を使います。

モーターを全部正回転させたときにロボットが反時計回りに回転するとします。

角度の起点はロボット右側。反時計回りに角度が増える。前なら90度。右なら0度。

で、モーターのとりつけ(出力軸が向いてる方)角度がa、進みたい方向の角度がb、進みたい力進ませたい速さがcとするとモータにかけるべき力を回すべき速度dは

d = -sin(a-b)*c

で表せますね。

それだけ。

あとはこれをタイヤの数だけ計算して回転をかければよし。

実行したらわかるが速さが無駄になるになる角度があったりする。対策は、まあ気合でなんとかしてね。

4輪のロボットならsin(θ+π/2) = cosθとか向かい側のモーターの回転方向は常に逆っていうことを利用すればすこしコードが短くなるでしょう。

●c360()はそのまま
int c360(int number)
{
while(number >= 360)
{
number = number -360;
}
while(number < 0)
{
number = number + 360;
}
return number;
}


●rmagdir()はc360を使って

void setdir(int number){stddir = number; dirinit = magdir()}

int rmagdir() {return c360(magdir() -dirinit + stddir);}

magdir()は磁気センサーの値を読む関数だ。

これだけ。たった1行。


●oob()
下を見ながらサッカーとか嫌だから作った。

理論上の話を書く。仕組みは簡単。

44番のロボットは行動のすべてを方向と力の極座標系で指示する。

まずは従来のサッカーするプログラムを実行。ロボットがとりたい行動(ホンネ?)を出す。

これは従来のプログラムなのでもちろん極座標で出力される。

この極座標を直交座標に変換。軸は壁に合わせて。

そして超音波センサーを使って壁との距離を測る。

もし壁に接近しすぎたら壁方向に進む力を消せば外でないじゃん!っていうだけのプログラム。

そうすればあたかもそこに壁があるような動きをする。

本当に線から出そうになったら壁から遠ざかる方向の力を増やせばいい。

それを今度は直交座標から極座標に変換すればmotor()で扱えるようになる。(タテマエ?)

この方法ならこれまでのプログラムの最後にこの文を追加するだけでロボットが外に出なくなる。

しかもこれまでのプログラム本体にまったく干渉しないからバグの原因にもなりにくい。


●ロボットをラジコン化してみたときに使ったプログラム。
これは楽しい。

通信にはシリアル通信を使用。ArduinoIDEのシリアルモニタとかいうあれ。あれでデータを送る。

SPPを採用したbluetoothの通信モジュール経由でもデータが送れる。

その上でデータを文字か何かに置き換えて送信し、受信してデータに戻すっていうことをする必要がある。

その”何か”のことをプロトコルというらしい。

で、プロトコル作った。

気合で。

ロボットの台車を制御するのに必要なデータといえばいつもの方向、力、回転力の3つ。

他に必要なのはいつもの3つのうちのどのデータかをしめす識別記号とデータ本体とデータの終わりを意味する終端記号。

ArduinoにはreadBytesUntil()とかいう超便利なものがあったのでそれを使用。

書式ははじめ3文字が数字を表し、4文字目を3種類のデータの識別用、5文字目を終端文字に。

すなわち

090a%255b%と送信すれば90度方向(前)に全速前進するという命令になる。

おくるべきデータは10進法で3桁なのでまずは文字を3つ使用して数字を表現、どのデータかを示すのはアルファベットでabcにした。終端文字は使わなさそうな%にした。

3桁の数字はatoi()で文字列から数字にする。

文字の受け取りには配列を使用。

reading[3]は4文字目を表すのでこれがaなら前3つの文字を数字化したものをdirに代入、bだったらpowerに代入するとかそんな感じ。

しかし、いちいち文字を打ち込むのは面倒なのでprocessingでゲームパッドの情報を読み込みシリアル通信のさっきの命令を書かせるプログラム作った。

あとbluetoothモジュール使えばゲームパッドで動くラジコンが出来上がる。

これは楽しい。

試合では使えないがやってみたらとっても楽しいので作って見ることをおすすめします。

そのうち例文上げるかも。 追記 上げましたhttp://nonamelaboratory.web.fc2.com/robo/remotedistribution.html

次回はハードに関して。それが終わったら、で、何がしたかったのかについて書く。
要は夢の様なロボット計画の*****の部分が何かって話。


今日のつぶやき
のなめサイトがのなめ倉庫になりました。上にリンクあります。
なかなか革新的なデザインだと思う。Skeuomorphic Designな感じで(読めねぇw)
昔作ったレポート用紙なピットマップ画像の上にペンタブで文字を書いた。なんで本物のルーズリーフを使わなかったのかといえば、著作権的にどうなのよって思ったから。


この記事の中身を見て意味分からねぇよ!って思ったら質問どうぞ。ソースコード公開する以外のすべての方法でお教えしましょう。sinって何?極座標って何って話からでもどうぞ。
わからないまま使うのはやめてください。意味ないですよそれ。

あ、祝7000だった。
スポンサーサイト

コメントの投稿

非公開コメント

d=-sin(a-b)*cについて

はじめまして。
福岡でジュニアサッカーチームのメンターをしております。コメントでいきなり質問するというのも失礼かと存じますが、ご容赦願います。

motor()の中の式[d=-sin(a-b)*c]についてお伺いします。

1)厳密には、dは「ホイールに与えるべき接線速度の大きさ」、cは「進みたい速さ」だと思うのですが、その理解でよろしいでしょうか。それとも、やはり「力」ですか?

2)私は同様の式をシニアリーグの方に教えていただいたのですが、Vega Altairさんは何か参考にされた文献などがおありですか?もしあるのであればぜひ教えていただけませんか?

以上2点について、ご迷惑でなければご回答お願いいたします。

d=-sin(a-b)*c

こちらこそはじめまして。
いつもそちらのblog拝見しています!

>>1
そうです。cは進みたい速さでdはホイールに与えるべき接線速度の大きさです。

書きなおしておきます・・・。

DCモーターは回転数センサーつけないと正確な速度制御できないのであきらめてdの値をモーターにかけるパルス波のデューティ比として使っていました。

>>2
参考文献はあえて言うなら学校で使っている数学の教科書でしょうか。
学校で三角関数を学んですぐに”これは使える!”と思いこの式を作りました。
初めて数学が役に立つことを知りました。

No title

早速のお返事ありがとうございます。

>いつもそちらのblog拝見しています!

あらら。全然更新できてなくて申し訳ありません・・・。

>参考文献はあえて言うなら学校で使っている数学の教科書でしょうか。

それはスゴイ!ご自分で思いつかれたのですね。
私はオムニホイールの制御を「力の合成」で考えていたのですが、多くの場合Vega Altairさん同様「速度の分解」で説明されているようです。どちらも本質的に同じ事なのかもしれませんが、今ひとつ納得のいかないところもあって、ここ数週間思考実験を続けています。
Vega Altairさんがどのようにお考えなのかを確認したくて質問させていただきました。ありがとうございました。
プロフィール

Vega  Altair

Author:Vega Altair
大学生になりました。
44番というチームでロボットの大会に出ていたドリルの刃を手で回してアルミ板に穴を空ける系プログラマー。
twitter始めました
サイト跡地にのなめ倉庫を設置してみた。下のリンクからどうぞ。

カレンダー
10 | 2017/11 | 12
- - - 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 - -
最新コメント
最新記事
月別アーカイブ
カテゴリ
きたひと
このblogには
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。