スポンサーサイト

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

やっぱり

あとは何がしたかったのかを書くだけと書いていましたが、やっぱり書くのやめます!

年齢的にやりたかったことをRCJで実現するのは無理なので、アイデアを書いて誰かにやってもらおうと思っていましたがやっぱりやめます!

なぜなら大学に入ってから自分で趣味でつくろうかと思ったからです。

どこに出せるというわけでもありませんが、知識と技術をつけてから自分のロボットを作ってみたいのです。

小学生のときにやっていたテニスを抜いて一番長くやってきた活動となったロボットづくりの終わりが”未完成”という事態は避けたい。

以前ここに敗者インタビューを投稿していたことがあります。あんな感じに問題点と改善点を書いた文章を作ったのですが、それを時々読むうちに改善したロボットを自分で作りたいと思うようになりました。

改善に加え新しいアイデアも浮かんできて、これを自分で作ってみたいと思いました。

そういうわけで何がしたかったのかの公開はおあずけです。

さあ、知識と技術と資金を持つ、大人が作る「大人げないロボット計画」の開始です!

大学で何か他のことに熱中していたら、できるのは社会人になってからになるかもしれない。


大人げないロボット計画
1 基本は夢の様なロボット計画
2 基本的にプログラム勝負で勝つ。やりたいのはラグビーじゃなくてサッカー。
  機体性能高いのにプログラム残念なロボットってたくさんあるので。
3 考えながら思ったことは”軍艦に似てる”。形じゃなくて機能の話。
4 *****



今日のつぶやき
まったく点数足りぬままもう来月センター試験。
2011年のロボカップ後に作った敗者インタビューには
「我々に足りないものは計画性」って書いてあった。うぅ・・・昔の自分、かなり痛いところを突いてきますね・・・。
そういえばロボット作るときにも知識や技術だけではなく計画性も無かった。
今の勉強も計画性薄い。このままだと失敗コース真っ逆さま。
計画つくろう。もちろん夢の様なではなく現実的なものを。
もう大人げない計画は書いたことだし今日からロボットものなめも一切考えない!受験後の楽しみにとかも考えない!
勉強するときは遠くのベッドにフィンランドの国際的スポーツ携帯電話投げしてから!
いまから英語、寝る直前に単語復習!
これでよし

みなさんも計画足りてます?


2/26追記
書かないといったけど書く予定だったものをちょっと書く。

44番的ロボット設計の哲学
1,プログラムはロボットを動かすためのものではない。
  ロボットがプログラムを動かすためにある。
2,プログラム通りに動くロボットが良いロボット。
  1+1=3になるコンピューターがあったら悪いコンピューターでしょ?
  右へいけって言ってもうまく右へ行かないとかありえない。そんなロボットすぐに取り壊す(マジで壊したことがある)。
  プログラムが理論通りに動くハード(と意識しなくても動きに補正をかけるプログラム)を作るべし。
3,資金は贅沢に使ったほうが得。中途半端に金を惜しんだほうが損する。
  うちのチームでは中途半端に出し惜しみするほどの資金もなかったけどね・・・(´Д⊂ヽウェェェン
  ただ、不動でも胡蝶でも、たいてい思い切って買った部品は値段の割に良かった。

また書き足すかも。
スポンサーサイト

44番情報公開3 ハードウェア

ひさびさ更新。受験中なのでささっと解説。

こんなロボットになってました。
写真23

前回からの違いといえば三代目ドリブラーが追加されて上部に電池収納用の穴がテキトーに追加されたことですかね。

このドリブラーは予想通りドリブルできない。ボールを保持する腕が無いので簡単にこぼれる。

モーターの駆動には予備部品を使ったがその予備部品が故障していたため実戦では蹴るしかしなかった。

後にラジコンのプログラムにドリブラー駆動の命令を入れてゲームパッドからも動くようになった。

まともなのは台車だけ。
写真20
機能の割にはすっきりしてると思う。

写真22
45×45の基盤にモータードライバ制御用論理回路(IC2つ)と接続用端子2つとそこまでつながる配線を詰め込んだ。

基盤の両面はほとんど配線で埋まっている。最大3層にもなる配線は電子辞書に入れたGIMPのレイヤー機能とグリッド表示を使って気合で書いた。

写真21

メインマイコンからの指示でモータードライバを動かす基盤はかなり昔に作った自作Arduinoに自作シールド(?)を取り付けて使用。

長さの長いリセットスイッチは横に倒すだけで反応してくれるので挿したままでもリセットできる。

同時に5つのモーターに命令を送ることができる。



以上、本当にささっと解説終了。

あとは何がしたかったかを書くだけだがいつ書けるかな・・・。


今日のつぶやき
放送部で文化祭で流す10分の映像を30分で編集(しかも完成)させた。しかもその後切り替え効果半分自作の10分の映像をまた30分で完成させた。
昔3時間はかけてたのに。何をしてたんだろう。
放送部最後の作業ですね・・・。

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だった。

44番情報公開1 ソフトウェア構成

44番のプログラムはとってもわかりやすくて高機能。

それを支えるのが使いやすく高機能な関数群。

違うハードウェアでもその差を関数が吸収するため違うロボットでも同じ動きをさせることができる。

全部Arduino用





motor() 開発名motor
宣言 void motor(int power , int dir , int turnpower)
戻り値 なし
依存 なし
機能 powerは力(0-255)、dirは方向(0-359)、turnpowerは回転方向と力(-255-255)。
   4輪のオムニホイールを制御しやすくするために作った。
   コート上のロボットの動きは平面2軸の直行座標と地面からの垂直方向を軸とする回転(ヨー)で示すことができる。
   というわけでこれら3つの情報だけでオムニ台車のロボットを制御することができる。
   ただ、人間にはx,yからなる直交座標で進む方向を指定するよりも方向と長さ(この場合なら方向と力)からなる極座標で指定したほうがやりやすいので極座標を採用。
   進む力と回転する力を足すことで合成し、モーターを動かす。
   大会では胡蝶が使用。

motor() 開発名intmotor
宣言 void motor(int power,int dir,int turnpower)
戻り値 なし
依存 なし
機能 上記のmotorは浮動小数点数を大量に使用していたため計算速度を早くしようとその計算をすべて整数(int)でやってみようとしたもの。
   結果、4倍早くなったがあまり変わらないなということで使用しなかった。
   進む力と回転の合成を足すのではなく回転を優先し、その余った力で進むようにしたため走行中は回転が遅くなるという欠陥が解消されている。

motor() 開発名dmotor
宣言 void motor(int power,int dir,int turnpower)
戻り値 なし
依存 なし
機能 motorとintmotorをあわせて作った。motorの進む力と回転の合成部分をintmotorのものに取り替えた。
   大会では不動が使用。大会直前に作ったため安定性を求める胡蝶には採用されていない。

motor() 開発名master007
宣言 int motor(int power,int dir,int turnpower)
戻り値 i2cの通信状態
依存 なし
機能 不動はdmotorを台車側Arduinoに搭載しているためメインコンピューターは情報を送信するだけでよい。
   その情報をi2c経由で送信するための関数。
   違うハードウェア間で同じ動きをさせる例。

emotor() 開発名emotor
宣言 void emotor(int power,int dir,int turnpower)
戻り値 なし
依存 motor()
機能 motor()の拡張。motor()に規定を超える数を代入しないようにするためのもの。
   power(0-255)に300と入力すれば255にしてくれる。dir(0-359)に400と入力すれば40にしてくれる。
   大会では胡蝶と不動が使用。

daisen() 開発名daisen003
宣言 int daisen(int motor_power1,int motor_power2,int motor_power3,int motor_power4,int motor_power5,int motor_power6)
戻り値 i2cの通信状態
依存 なし
機能 もともとはダイセン社製の6chモータードライバを動かすための関数だった。が、いろんなところで騒がれているArduinoから動かそうとしたらフリーズする問題で没に。代わりに不動台車のモーターを個別に動かすDaisenMode用に使われている。

c360() 開発名c360
宣言 int c360(int target)
戻り値 0-359の値
依存 なし
機能 emotorの”dir(0-359)に400と入力すれば40にしてくれる。”の機能だけ独立させたもの。
   方位センサーまわりで便利に使えることがわかったので独立させた。

us() 開発名us
宣言 long us(int pingpin)
戻り値 超音波センサーの測定結果
依存 なし
機能 超音波センサーから値を読むだけのふつーのプログラム。
   plusein()を使用。

us() 開発名us2
宣言 int us(int pingpin)
戻り値 超音波センサーからの測定結果またはエラーコード
依存 なし
機能 plusein()を使用したパルス長計測は超音波センサーがはずれていたりコードが断線してたとかのときにプログラムの実行が1秒ほど停止されてしまう。
   そこでplusein()を使用せずにパルス長を計測し、異常を検知したら測定を中止し、決められた数字を出す。
   たとえばその数字を0にしたら壁を検知するアウトオブバウンズ対策に影響を与えるが1000にしておけばその心配は無い。

magdir() 開発名daisenmagdir
宣言 int magdir()
戻り値 コンパスから読み取った値
依存 なし
機能 ダイセンの多機能電子コンパスを使うための関数。一番初めに作った関数。
   センサーの性能が悪すぎるために使われなくなった。
   後述するmagdirと入れ替わってバグの原因になったりと、とっても鬱陶しい。

magdir() 開発名hmcmagdir
宣言 int magdir()
戻り値 コンパスから読み取った値
依存 なし
機能 hmc6352から値を読む関数。磁気方位センサーから値を読むからmagdir。
   数学の単位円の角度の方向に合わせて数値を逆にし(時計回りに増える数字を反時計回りに増えるようにした)、0.1度の精度をおとして1度きざみの0-359にして出力。

rmagdir() setdir() 開発名rmagdir
宣言 int rmagdir() void setdir(int dirinit)
戻り値 rmagdir():方位合わせされた角度
依存 magdir() c360()
機能 これまでセンサー本体を回していた方位あわせをソフトウェア上でできるようにしたもの。
   といってもたった1行追加しただけ。
   setdir()で方位合わせをしてrmagdir()で方位を読む
   setdirはsetdir(90);とすると現在向いている方向を90度とする、とかそういうふうに使う。

daisen() 開発名hexmot
宣言 void daisen(int motor_power1,int motor_power2,int motor_power3,int motor_power4,int motor_power5,int motor_power6)
戻り値 なし
依存 なし
機能 以前公開したhexmotそのまま。i2cの代わりにシリアル通信を使用して6chモータードライバを作動させる。
   通信速度を115200bpsにしたら4chも動いた。

gadget() 開発名gadget
宣言 int gadget(int pin)
戻り値 スレーブとしたgadgetのセンサーの値
依存 なし
機能 e-gadgetをセンサースレーブにして動かす関数。
   胡蝶に搭載していたが、結局gadgetの先につけるセンサーが故障して使わなかった。
   立/命/館/守/山/高/校/ /S/c/i/-/t/e/c/h/部さんのgSlaveSensorの改造品。
   自由に使っていいって書いてあったので・・・。

analyze() 開発名analyze
宣言void analyze(int dir,int power)
戻り値 なし(グローバル変数に出力)
依存 なし
機能 極座標を直交座標に変換する関数。oobで使う。だふがコーディングした。

mixPower() 開発名mixPower
宣言 void mixPower(int xpower,int ypower)
戻り値 なし(グローバル変数に出力)
依存 なし
機能 直交座標を極座標に変換する関数。oobで使う。だふがコーディングした。

oob() 開発名oob
宣言 void oob()
戻り値 なし
依存 analyze() mixPower() us()
機能 アウトオブバウンズ対策を一手に引き受ける関数。仕組みはそのうち書く。
   かなり便利。だふがコーディングした。
   ハードウェア構成が大幅に異なる不動にそのままコピペしたのに動いたという関数標準化の鑑。


またこんど、仕組みと一部のソースコードを投稿します。

13年度ロボカップ25 日本大会の記録

負けました。

日本大会で起こった最大の、そしてすべての問題点はハードが動かなかったことだろう。

不動はいつもどおり走りはしたんだが、やっぱり工作精度が悪く直進するのが難しかった。

胡蝶はピニオンギアがはずれまくっていろいろ大変だった。


受験前。つくる時間がなかった。

最後の大会でもロボットが動かせなかった。


ただ、大会会場で交流できたのは良かった。


最後の大会が終わったので、これまで作ってきたプログラムの考え方と一部のソースコードを公開しようと思う。

それから、やろうとしてたことも。

だれかの役に立てばいいな。
プロフィール

Vega  Altair

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

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

この人とブロともになる

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