読者です 読者をやめる 読者になる 読者になる

お腹.ヘッタ。

関数型とかセキュリティとか勉強したい。進捗つらぽよ

学生アルバイトが決まった話とそしてコミュニティ

こんばんは。学生アルバイトで学費を稼がないと大学が通えない疑惑が出ている竹です。(初めから重い)



kazukichi.hatenadiary.com
かずきちくんがなんかこの前言及していてたということと、この前そうえば内定したよということは話してもいいと言われたので、高校生学生アルバイプログラマ(?)として僕も思うところがあって喋って見たいと思います。

僕は一発で決まってしまったのでこれから学生アルバイトとして飛び込みたい人向けではありませんが、今後何したいんだろうという話をしたいと思います。

結局どこに決まったの

インフェニットループっていう北海道で有名な会社に決まりました💫
(いやまだ定期考査明けに出社なので内定ってだけなんですけど)←
それで今年度仙台支社ができて私はそこで働くことになりました。ぜひ何もできない若輩者なので各位ご指導の程宜しくお願い申し上げます><
www.infiniteloop.co.jp


どうやらブログや大会出場を評価してくださったようで無事内定が決まりました。ぜひ自分の技術に思うところがあるなら主張してみると案外通るかもしてません。ぜひ仙台支社に仲間が増えたら私も嬉しいです!

社風としてはかなり自由な風通しのいいようで、私はとてもワクワクしています(ダーツボードがあったり生ハムの原木があったりもうなんかフリーダムすぎる笑)🌟
先輩方からいろんな知識や技術を奪えたらいいなぁと思います!!!頑張ります!

さてそれで何が思うことがあったの?

この会社を選んだ一つの決め手は情報技術のコミニュティを大切にしていることでした。
例えば勉強会やLT大会を開くにあって場所を貸してくださったり積極的に勉強会にコミットしたりなど、`仙台ではまだまだですが`北海道ではとても羨ましいぐらいに熱く!!!行なっています。
ですが仙台ではまだまだです。



そこで私は一つ野望があります。




私のいるこの仙台駅を中心に学生コミュニティを組み上げたいという野望です。
これに対しては強い気持ちがあります。主観ですが仙台の学生コミュニティはとても内向的なところが多く感じています。ざっくりとした話表面に出てくるのは東北電子専門学校のあたりのコミュニティと東北大のボンプロさんとかのコミュニティ。ぶっちゃけこの辺ぐらいしか観測できていません。とても素晴らしく学生の身分でこんなにやれるなんて素敵だと思います。ですが同じ身内ばかりで内向的なところがどこかあるのではないのか、それによって狭いところで悩みを話せず同じ共通認識がなくだから仙台はと言われる悪循環を作ってるのではないのかと強く感じます。



ですので私が考えているのはみんな所属の違うコミュニティを作るべきだと考えます。
強いていうなら風通しのいい、大学生でも、高専生でも、高校生でも、中学生でも、初心者でも、ガチプロでも自分のやってることを発信して相互的に学べるシナジーのあるコミュニティを持つべきだと強く主張します。個人単位では技術を持った人が多くいます!


そのためにも立ち上げたいと感じているだけではダメで私よりもいろんな意味でバカな奴が仲間に必要です。ぜひ私と仲良くしてくださったらとても嬉しいです!


また今後これを達成するために定期的に声を大にしてプログラムを書いてるんだぜっていうブログを書こうと思います。ぜひよろしくお願いします(着地点を地味に見失ってしまった)

「2017年にやりたいこと」

今週のお題「2017年にやりたいこと」


takeio.hatenablog.com

 恒例の抱負を書こうと思ったらはてなのお題があったのでこれを利用して少し書きたいと思います。

抱負

  • 勉学面

 数学と英語と物理を人並みにできるようになりたいです。
 数学物理は頑張ればどうにかなる機運があるんですが(自称)
 英語ばかりはどうにもダメです。これは中学からそうなので今年こそは本腰を入れて挫折しないように頑張ります!
 あと進学な()


  • 生活面

 自分で目覚ましで起きよう。たまに起きれない!!辛い!!
 あとご飯のレパートリー増やしたいなー。あと男女ともに友達を増やしたい!僕は友達が少ないだからね。。。(性格に難があるのではという気持ちだなぁ)


  • 趣味

 ダーツでのレーティングをAフラを目指したい。
 あと音ゲーを人並みに目指したいなーと思います。デレステ初見で死んじゃうの辛い。
 それと暇があれば剣道の昇段審査を受けて三段取りたいです✨


 セキュリティについて去年ちょいちょいついばむことしかできてないので本腰を入れて学びたいな。特にPwnとWeb。具体的には入学までにヒープ問題の知識があったり、ブラインドSQLiをどうにかして何も見ないで書けるようになりたい。それとインフラ周りの知識を詰め込みたいな。


 それとコーディング力がないので競技を始めようと思う。基本的なダイクストラやBFSなどはできるけど時間かかるし、DPとかはできないし、ダメダメですね。。。一年をかけてあり本を終わらせたいなと思う。それとatcoderのビギナーズと普通のやつにも毎回参加して解き直すのを癖付けたい。


 そして一番のメインは計算幾何学について知見を深めたいです。特に計算論理についてなど。全然Coqとか使っててもよくわからんパズルやってる気分だし、きちんと、しっかり、身の丈にあった学びをしてステップアップしたい。




・・・・結構あるな。。。どうやって配分したらいいんだろう・・・誰か教えて・・・

  • イベントについて

 LT大会を開きたい!結局高校の時部活が忙しすぎてできなかったので是非頑張る。
 ハッカソンに参加する!時間内にそれなりのコードを叩けるようにするぜ!
 今年こそセキュキャン受かるぞ!雑魚並みの力を見せてやるぜ!()
 また、情報系のアルバイトをしたいと思います。ぜひレベルの高い人たちから学びを得たいです!

締め

今年も至らない点あると思いますがご指導ご鞭撻を賜りますようよろしくお願い申し上げます。

現役高校生が知識ゼロから、倒立振子による玉乗りロボットの機構を作り、それを活かして杖を作ってる話。

 これはStudent Advent Calendar 2016の25日の記事です。
 qiita.com

 竹です。工業高校の三年で、専攻は電気(強電です)。ひょんなことからこんなタイトル通りのことをすることになりました。
 なぜこんなこと書こうかと思ったかというと大学に進学し、高校から離れるにあたり解体することになってしまったからです。
 そして私が未だに完全に作りきれなかったことの研究が出来なくなったからでもあります。
  f:id:taketarou2:20161225010547p:plain:w400
 これは、今後パーツや素材を一から集めれた時の備忘録&これからメカトロニクス倒立振子を始めたい人のために書きました。あと残念ながら訳あってソースコードはお見せできません。すいません。ですがそのうち載せたいと思います。


 ちなみに私自身元々は自称ソフト屋さんでマイコンを取り扱うことや弱電は一度たりともありませんでした。完全に電子工作及びメカトロ初心者で、工具の使い方ひとつでさえわかりませんでした。
 メカトロニクスについて勉強したいなーと思う人は僕みたいなフローを辿るといいかもしれません


 以下に本記事の中身を記していきます。拙い文章ですが気長にお付き合いください。


概要

 大会に出すのに人の役に立つものを作りたいと考えました。
 その中のアイディアとして自立移動する杖があればじじばばが楽になるのではという理由から自立する杖を作りたいと思いました(適当)
 ちなみにこれをやったのは二年生の後半から3年の前でした。

機構を考える

 検索しまくった結果、植え付けられたせいか私の中では立つ=倒立振子だったので倒立振子を採用しました。
f:id:taketarou2:20161223124612p:plain
こんな感じが原案。

倒立振子とは?

 読んだ名の通り「逆立ちする振り子」です。普通の振り子は支持点が重心の上方に存在するのに対し、倒立振子は支持点が重心の下方に存在します。
つまり、箒を手のひらでおっとっと〜と支える感じです。

 倒立振子が倒れないようにするには,常に支持点を重心の真下に位置させる制御技術が必要です。
つまりあれです。箒が倒れそうな方向に走っていくと倒れないアレです。

取り掛かってみる

 しかし結局検索して出てきた知識を使いたくてもどうやればいいんだこれでした。全くわからん。

 というわけで先行研究を調べました。

 どうやら東北学院大学の熊谷教授が研究しているそうです。(地元なのに知らなかった。。。。)
 論文:玉乗りロボットの開発 第一報 ロボットの実装と基本制御
 https://tohoku-gakuin.repo.nii.ac.jp/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=136&item_no=1&attribute_id=22&file_no=1&page_id=34&block_id=86

(それに乗っかるつもりで)これを読み込みました。ちなみにメカトロ知識ゼロです。大学数学もわかりません。ですので並行して自動制御とメカトロについても勉強しました。

 http://www.mech.tohoku-gakuin.ac.jp/rde/contents/sendai/mechatro/archive/RMSeminar_No09_s8.pdf
 などがあるこれまた東北学院大学の熊谷教授の資料が初心者向けで最高です。以下のインデックスから漁ってください。
 Index of /rde/contents/sendai/mechatro/archive

 また
 センサの基本と実用回路 (計測・制御テクノロジーシリーズ)
 Amazon CAPTCHA
など難しい知識が必要な時はこういう本を読んでました。
 基本方針は上で紹介した熊谷教授の公開なされているpdfを読んで、たりなきゃ考えればいいみたいなのが一番よかったと思います。

 正直そんな難しいと考え込んでしまってしまっていたのが失敗なので是非楽に考えましょう。

 ちなみに今玉乗りロボットは僕が始める時にはなかったこんな知識の宝庫みたいなサイトがあるみたいです。羨ましい。。。。
 玉乗りロボット BallIPMini 技術情報

 さてさて。どうすればいいかはなんとなくわかってきましたがそれでもモーターでさえ一つ回したことありません。

 論文中にはステッピングモーターを使っています。まずは回すとこからスタートをしました。

主に使用したもの電子デバイスは
ステッピングモーター
ArduinoMega
MPU6050(6軸センサー(加速度とジャイロ))

を使いました。
また、なめらかオムニホイールと呼ばれる軌跡が一つになる特殊なオムニホイールを使用しました。


ステッピングモーターを回す

 こういう記事ととかみたりどんなのあるのかメーカサイトを見たり。
 ステッピングモーターの基本(前編)〜Arduinoでパーツやセンサーを使ってみよう | Device Plus - デバプラ
 駆動方法を調べたりしました。ぶっちゃけモーター駆動とモーター回路が一番難しくて一番大変です。しっかりと理解しましょう。

 モータードライバは細かい動きをさせるマイクロステップをやりたいが故に市販のを使いました。
 akizukidenshi.com


 これまた僕が回路周りめっちゃ苦労した時にあったら最高だったなというサイトがありました。
この回路設計まんまパクってもいいねというぐらいいいと思います。
 1500円で作る!CNCフライス用ドライバー | 自作工房


 モーターは色々使ったんですがこの辺がすごくおすすめです。
 バイポーラ ステッピングモーター 17PM−K044−AKZ: パーツ一般 秋月電子通商 電子部品 ネット通販


 ちなみに回路周りなのですが紛失しました。。。。ごめんなさい。。。(手書きなのでどこに置いたか。。。)

 さてさてなんとなくモーター周りを理解したところで「倒立振子って結局技術的にはなんぞや」というところと「6軸センサー(角速度と加速度)の制御」、「機体の設計」の足場を固めながら三点に取り掛かります。

倒立振子って結局技術的にはなんぞや

 論文読んでもネット見てもわからん。
 今思うに、初心者には論文で使うような真面目な理論は難しすぎる。でもネットの半日でできるなんちゃらとかはの理論抜きでやりすぎてるのである程度しっかり知りたい人には全くわからない。つまりまぁ慣れろってことなんでしょうけど。

 とりあえず調べていくと平然と
”まず車体へ働く力を物理的に把握することが必要です。運動方程式を立て行います。”
とか言われます。がこれらは現代制御法の場合必要です。

 ですが今回は論文に沿うことにしたので私は今回はPD制御による加速度制御、簡単に言えば古典制御でのアプローチをしました。

古典制御とは

 偏差(修正すべきずれ)に対して比例制御、積分制御、微分制御これらを組み合わせアプローチを行う制御。
イメージとしては、
比例制御:偏差(誤差)に対して比例させて治すアプローチ。
積分制御:偏差(誤差)がどんどん溜まった際にまとめて打ち消すアプローチ。
微分制御:起こりゆく誤差に対して起こすアプローチで、少し偏差(誤差)を打ち消したい時に行うアプローチ。ズレ始めとか強く効く。
 こんな感じです。


 もう少し具体的に説明をします。
 距離、速度、加速度これらの関係は微分積分で変化させることができます。距離を二階微分すると加速度になり。で逆に二重積分すれば距離になります。この時微積分でのΔになる部分は”t:時間”です。つまるところ、微分で成分に対して制御をし、積分でまとめての大味な制御をすることができます。つまり時間のP,I,Dこれらは次元ごとの制御をしてるとも言えます。



 さてここまで理解したところで不思議なことに気がつき、疑問を持つ方もいるかもしれません。なんでPD?PIDじゃないの?という疑問です。普通に考えたらPIDの方が全部に対してやっていて良さげですよね。ですが今回の使用しているモーターはステッピングモーターです。トルクに対する指令ができません。できるのは回転速度に対することのみです。ですので角速度と角加速度のみが制御可能なので、PD制御による加速度制御となります。

具体的な制御について

f:id:taketarou2:20161225003121p:plain
  f:id:taketarou2:20161225010547p:plain
 この図はロボットに用いた,センサによるロボットの姿勢角と車輪の移動量を用いる典型的なPDフィードバックのブロック図です。


 制御部は以下の式で表されます
f:id:taketarou2:20161225003524p:plain
aは操作量で球の外周の加速度であり、θは各軸の方向の傾斜角x,yは車輪の移動量、vは速度である。添え字x,yはそれぞれの軸に関する状態量(距離)であること を示し,K*は実験を行い調整した定数制御ゲインである。またvx(y)aを数値積分することで得られました。

なおこの場合はx,y,vx,vyはワールド座標系ではなく球の回転量です。

 一般的に倒立振子はトルク制御の方が有名ですが、今回はステッピングモータ を利用したというのことから加速度制御を採用したということを前述したと思います。
 今回採用したPDフィードバックは、センサーノイズがダイレクトに操作に関わってくることが一般的に知られています。(よくわからない場合は熊谷教授のPDFを参照)
そこでセンサー対策として簡易的な一次デジタルローパスフィルタを作成し、センサデータをリプル状のノイズを消すようにしました。

f:id:taketarou2:20161225004051p:plain:w300

 パラメータはrのみで、入力を比率rをゲインとする特性を持っている。r=1のときは、ただの素通し、r=0のときは、y[k]=y[k-1]となるつまり、値を維持となります。r=0.1など小さい値にすれば変位値が元の値に寄っていながら増えるというものです。
実際に制御とデジタルローパスフィルタ(LPF)をソースに書き起こしたものが以下のソースです。なおKsという記述はゲインの入れ込んだ配列であり、LPFのゲインは実験的に求めたものです。

thx -= thofx; thy -= thofy; //PD制御
acxt = (Ks[0] * thx ) + //角度 
   (Ks[1] * thvx ) +//角速度 
   (Ks[2] * distance_x - xofs) ) + //目標距離
   (Ks[3] * vx); //速度

acyt = (Ks[0] * thy)+
           (Ks[1] * thvy)+
           (Ks[2] * distance_y - yofs) +
           (Ks[3] * vy );

//ローパスフィルタ //LPF:y=(1-r)y+ru(u入力、y出力、rフィルタ係数r<1)*(2^n/1) #define LPF_f(y,u) y = (LPF_A*u)+((1-LPF_A)*y)
#define LPF_A 0.05
LPF_f(acx, (acxt-acx));
LPF_f(acy, (acyt-acy));
/*積分*/
vx += acx; vy += acy;
distance_x += (vx); distance_y += (vy); MotorSpeedX = (vx);
MotorSpeedY = (vy);

このような形になります。

「6軸センサー(角速度と加速度)の制御」

今回はMPU6050と呼ばれるデバイスからセンサデータを取得し、角度を得ました。
 MPU6050は少しだけ他のデバイスと異なっていて、DMP (Digital Motion Processor) という機能を使うことで、補正済みのデータを簡単に利用できるのが特徴です。一般にジャイロ(角速度センサ)の特性は温度によって変化し、ノイズも多く乗るので適切な処理が必要とされています。
私は角度を得るために今回DMPのバージョンとカルマンフィルタのバージョンを作りました。
DMPのバージョンは多くの記事があるので割愛して、初めてセンサーを触る人のために簡単に分解能についても話し、その後カルマンフィルタについて少し説明したいと思います。

分解能

このMPU6050などセンサーを調べている際にLSBという文字を目にすることがあります。LSBとは最下位のビットではなく(私が勘違いした例なんですけど)制度を論じていて、分解能という意味です.
分解能の概念は以下のサイト曰く、1メートルの物差しに1ミリメートル単位で目盛りつけた時の目盛りが、分解能だそうです。
分解能 - National Instruments

詳しくは以下のサイトなどがよくわかりやすいのかと思うので査収ください。
www.widesnow.com



カルマンフィルタ

カルマンフィルタは逐次ベイズフィルタの一種で、オンラインのフィルターです。簡単にいうと確率論をベースにしたフィルターで、昔のアポロ計画、カーナビ、今回のように角度を求めるなどなどの様々なところで利用されていて、モデルが線形である(または線形近似したもの)ことや,ノイズがガウス分布である必要があります。


基本的には

  • 状態空間表現(動作モデル,観測モデル)
  • 予測ステップ(事前推定値,事前誤差共分散)
  • フィルタリングステップ(カルマンゲイン,事後推定値,事後誤差共分散)


の三つを基本としています。
簡単にざっくりいうと対象のデータにはホワイトノイズが乗っていてその際にはどれがどのノイズかがわかりません。
そこでデータの中間を取り、それに対してその時共分散という値の関係する度合いを用いて、誤差に寄与率加えて、センサーのノイズを薄めるという手法です。



今回の場合、なぜ使うのかというと、角度を求めるのには加速度センサーを使うことで求めることができ、止まっている時は重力加速度のみなので、十分に値が取ることができます。ですがそれだけでは並行に移動し加速(以下並進加速度と呼ぶ)している時に思わぬ値が出てしまいます。そこで、角速度センサーの値を用いて、移動している時は角速度センサーの値を用い、相補的な方策で立てて対抗をすることができます。



しかし、角速度センサーには弱点があり、ドリフトと呼ばれる値のズレが存在します。それに対してのアプローチの方法がこのフィルターなのです。



具体的には

  • ジャイロにドリフトあるが、加速度センサには誤差ないとしたときがある。⇒この時は、誤差の要因は全てジャイロであり加速度センサの値を正解として補正をしたい。
  • ジャイロにドリフトないが、加速度センサには誤差あるとしたとき⇒この時は、誤差の要因は全て加速度センサであり加速度センサの値は無視したい。


という判断をしていかなくてはいけません。



もし詳しく知りたい場合は以下の記事を見てください(私の説明が正解なのか怪しいので)
qiita.com



さて、以下にソースコードを示します。なお、このソースコードは以下のサイトを参考にしました。
TKJ Electronics » A practical approach to Kalman filter and how to implement it



gist.github.com
gist.github.com

このような形になります。ぜひこれはソースコードと参考サイト、上での紹介した記事をぜひ読み込んで理解してください。


機体の設計

結論としては、球乗りの機構を実現するためにオムニホイールをモータ軸につけ、等間隔に3軸を並べそこへ球に乗せる形を作りました。またギアによるバックラッシをなくすためにステッピングモータを使用し、それをダイレクトドライブにしました。それ故移動制御 がパルス分だけの移動なので確実に移動距離を把握できるようになりました。

言葉ではわかりにくいので以下の実際の球乗りの台座を写真a写真bを参照してください。

f:id:taketarou2:20161225002808p:plain:w300
f:id:taketarou2:20161225002816p:plain:w300

ちなみにbは改良を行い捻りを加えサイズの大きいモータでも十分にコンパクトな サイズにできるようにしたものです(論文中と同じですね)

さて。モーターが三つなので少し複雑になりました。そのためにx,yの制御をに変換しなくてはいけませんですので、

まずはX,Y軸の制御を変換するために球駆動のための車輪速度の算出を行いました。

車輪速度の算出

始めに球の中心を原点とする局所座標系を定義します。
(図a)この座標系はロボット本体に固定し,z軸は球の中心とロボットの質量中心を通る鉛直線として,x,y 軸はz軸に垂直に定義します。
f:id:taketarou2:20161224225324p:plain


1.球の角速度ωを得るための車輪の速度を導くために、車輪iと球の接点をPiそ の位置ベクトルをpiとする.球の角速度ω対応する,Piにおける球の周速度viは次式で得られます。
f:id:taketarou2:20161224225435p:plain:w300

2.球の周速度vと車輪の周速度vsの関係を導出する。(図b)最初に右の図の ように速度vを車軸に平行な成分vfと垂直な成分vsに分解する。vfは車輪外周 の樽型の小さいローラの自由な回転によって生成され、vsはモータの回転によ る車輪の周速度である。このvvsは,車輪の駆動方向単位ベクトルsによって対応付けられ、
f:id:taketarou2:20161224230140p:plain:w300
となり、vsの正負は車輪の回転方向を示す.各車輪の位置piと方向siを定めることにより、角速度に対応する車輪速度が求まります。

3.vsの正負は車輪の回転方向を示す。各車輪の位置piと方向siを定めることにより、角速度に対応する車輪速度が求まり、車輪の速度の基本式が
f:id:taketarou2:20161224230256p:plain:w300
とわかります。

4.3の式よりモータ3つの式を求めていく。天頂角φrを球の半径と置く時、位置ベクトルpiは以下となりました。
 f:id:taketarou2:20161225000804p:plain:w300

5.駆動方向siは球の俯瞰図及び車輪の上面図(図a)より
 f:id:taketarou2:20161225000858p:plain:w300
となる。

6.x軸周りに角速度ωxで回転させる時(ω=(ωx,0,0)とする時)サラスの公式を 用いて4.、5.より求めました。
なお単位ベクトルの和は
 f:id:taketarou2:20161225001435p:plain:w300
とします。

 f:id:taketarou2:20161225001307p:plain

7.同様にしてy軸周りに角速度ωyで回転させる時(ω=(0,ωy,0)とする時)を求めました。
 f:id:taketarou2:20161225001654p:plain

 以上よりx方向とy方向へのベクトルを分解する式を得ました。
 これをソースに書き起こす際は以下のようにしました。
 なお以下で√3/2を近似で扱った理由としてはマイコンのスペックを考慮した故です。

  //x>>1は1/2、√3/2~=222/256->√3/2*256=221.7という近似で扱っている 
  Moter_action_1 = -((long)MotorSpeedX ) + 0;//モータ1
  Moter_action_2 = ((long)MotorSpeedX >> 1) - (((long)MotorSpeedY * 222) >> 8;)//モータ2
  Moter_action_3 = ((long)MotorSpeedX >> 1) + (((long)MotorSpeedY * 222) >> 8);//モータ3

これらを用いて加速度的にモーター駆動を行いました。
この時加速度的というのは自分なりでいいのでオレオレ加速度(つまり自然界の尺ではなく相対的なものでもいい)を作りモーターの駆動を行いましょう。
意味がわかりにくいと思いますが、V=V0+atみたいなことになれば良いのです。ここがかなりキモになります。

もしピンとこない場合は以下のソースコードを読んでください。モーター駆動の記述でオレオレ加速度を設定しているのがわかります。
self balancing arduino robot

機体の作成

せっかくなので、初めて旋盤やポール盤、シャーなどを使い、色々試行錯誤した後も含め見てもらいたいと思います。

1番最初は、
   f:id:taketarou2:20161225025750j:plain:w300
このような形で鉄を曲げてそれに小型のステッピングモーターを入れました。
ちなみにアルミの柱、オムニホイールのハブはアルミの廃材より全て手作りです。(ほんと苦労した。。。。)

ですがこれでは若干のトルク不足など応答性が低いということがありました。その後もこれをベースに何度か改良をするのですが、残念ながらうまくいきませんでした。

下の写真は改良の跡で、写真の上には、球を止めるための機構で、キャスターで使うような玉がついています。
改良を行った際にピラミット型にしてその表面三つにモーターを設置できないかとアプローチした後です。
f:id:taketarou2:20161225030847j:plain:w300



その後思い切って下のベースごと変えました。

f:id:taketarou2:20161225030245j:plain:w300

この時ねじりを加える工夫を行い、モーターも通常のステッピングモーターへと換装しました。

ちなみにモーターのブランケットも手作りで、
f:id:taketarou2:20161225030648j:plain:w300
このような台紙をCADで作り、それを元に廃材のアルミ板を切り、曲げて、下のようになりました。
f:id:taketarou2:20161225031214j:plain:w300

中間はまだ安定してないのでスカスカでした笑

f:id:taketarou2:20161225031638j:plain:w300

そして上部には下からモータードライバー、マイコン、センサーと設置しました。
f:id:taketarou2:20161225031903j:plain:w300
f:id:taketarou2:20161225031940j:plain:w300
f:id:taketarou2:20161225032006j:plain:w300

そうして現在の改良を行った形へとなりました。

まとめ

ここまでお付き合いいただき有り難うございました。
肝心のこれって立つのという話ですが、まだ5〜15秒ぐらいしか安定しません。最長で30でした。何が悪いのかわからんので今後の課題です。

それと、実はこのロボットの機構には続きがあって、”ステキなすてっき”という親父ギャグの効いたシステム名をつけてもらい、まさかの友達にロゴを作ってもらうなど、いろいろなことをしました。

f:id:taketarou2:20161225040851p:plain
また、スマホで動かすためにespwroomというWi-Fimoduleを繋いでいて、iOSアプリサイドのお話も実はあるのです。また、espwroomもArduino化していて、温湿度と気圧をはかり、ミスナールの式で体感温度や気圧の変動のスパンで簡単な天気予報をしてくれる機能がついている。といったまだまだ実はネタがありますが、それはぜひまたの機会にとでも思います。もし気になる方がいれば説明書を以前作ったのでぜひ見てください。
Suteki-Na-Stick/SutekiNaStick取扱説明書.pdf at master · Suteki-Na-Stick/Suteki-Na-Stick · GitHub

 これを手伝ってださった先生や、関係している方々、所属してる部活動の人たちに感謝の気持ちを申し上げます。

 また、まだまだ初学者の身分で偉そうなことを言っていて、これにも間違えがあるかもしれません。もしよければ優しくご指導ください。



 最後になりますが、これを通じて何かお互いに拙い文章の中でも学べるものがあれば幸いと感じます。


 Studentアドベントカレンダーお疲れ様でした!!!(結局当日の朝4時までかかったので遅刻(白目))

Haskell(再)入門2回目中編。

Haskell

こんにちは。竹です。そろそろ"MASAKARI"が飛んできそうで震えてますがやります。怒られることにより圧倒的な成長((

関数の定義方法。

名前::引数 ->返り値

これだけです。忘れないでください。いきなり使います。(突然)
詳しいのは後々説明しますが、とりあえず今日はこれをまず覚えてください。あとから使います。

思い出しフェイズ

[ ]

これ覚えてますか?多相型です。この前出したキーワードでした。
”仲間としては、タプルやEitherなど。
具体的に言うとC++のテンプレートのようないわゆる型ジェネリックと言われているもののように柔軟に扱えれるタイプのことです。”(前回記事よりコピペ)

今回はこれにフォーカス当てて型の続きを進めていきたいと思います。

多相型は型変数

型変数の中でも幾つかを多相型と呼びます。
Haskellにおいて多相型の具体例は

  • リスト
  • タプル
  • Either
  • Mayby

などがあります。
今回はこれらを使って”多相型と型変数”のテーマでいきたいと思います。

リスト

リストはリストです。他の言語と同じで”何かの型のリスト(配列)”という形になります。(しかし飽くまでHaskellは一つの型のみ。)
具体的には文字のリスト

[Char]

整数のリスト

[Interger]

といった感じです。
ちなみにリストの先頭に要素を追加するときは

入れたいもの:[ ]

でできます。

さて「型変数is何?」って思うと思います。ではリストの中の長さを求める関数(突然関数を覚えろといった理由)を考えることにしましょう。
例えば

[Interger]

の長さの関数を考える時

[Interger] -> Int

といった具合になります。
その際、Doubleで使いたい時とか毎回とか型を変えて関数を作るのって大変ですよね。そこで型を変数のように振舞わせれたら楽ですよね?
安心してください。それが型変数です。
ex.

length::[T] -> Int

このように定義できます。
ちなみに型コンストラクタと言ってある型に別のものを足しあわせて別の型を作ることを型コンストラクタといいます。
リストで考えると

[]

で包んでリストになるリスト型の型コンストラクタと理解してください。

タプル

いわゆる無名構造体です。2つの値を組みにした構造です。
Haskellでは

(4,5)

このように表現します。
これも多相です。
ちなみに二つの型の組み合わせを使って作る型を直積型とも言われます。

Either

二つの値のうちどちらかを取るのがEitherです。
Haskellではどっち取るかをLeft,Rightで表現します。


ナニコレ

下書きに入っていた頑張ってた跡がある過去です(めんどくさくなったんで勝手に打ち切り)

esp-wroom-02でラジコン作って遊んだのでまとめとく

マイコン

この記事はStudent Advent Calendar 2016の24日目の記事です。

qiita.com


f:id:taketarou2:20161223114317p:plain
どうにか事故?自己紹介を回避しました褒めてください。



esp-wroom-02ってみなさん知っていますか?強いWi-Fiモジュールです。
知らないのであればググり倒してください。以上です。



さて、当記事は完全二番煎じで、以下のものと同じようなノリです。がっかりした方ごめんなさい。
あとやっつけです。実質2日分ぐらいで終わります。(私は、モーターの電流特性計り忘れてモタド殺したりしてしまったのでその辺なければ1日ぐらい)

https://www.elekit.co.jp/product/docs/PU-2709Wi-ficar.pdf

ハードウェア構成

RCカー を作る ( バギー工作基本セット + Arduino + Bluetooth + Androidスマートフォン )
ArduinoBluetoothesp-wroom-02で置き換えて、行いました。

また今回は速度を出すためにトルクチューンモーターを採用しました。個人的には普通のモーターでも十分です><(理由は反省点で述べる)
トルクチューン2モーター タミヤ ミニ四駆モーター・電池 15484 :4950344154845:みなと模型 Yahoo!店 - 通販 - Yahoo!ショッピング

これを使うための注意点として電圧がmax3Aなのでそれに対応したモータードライバーを使用してください。
DRV8835使用DCモータードライブキット: 組立キット 秋月電子通商 電子部品 ネット通販
私はDRV8853を採用しました。回路図はめんどくさくて作ってないです><ごめんなさい><

ソフトウェア構成

スマホをコントローラーとしてesp-wroom-02UDPでデータを投げつけたいと思います。
UDPの採用理由としてはOSCアプリ等でも利用するのを前提にしたからです。

今回はiOSのネイティブアプリを作ってUDPで投げつけました。
(時間なくてUIを作り込めませんでしたが。。。)


以下にソースを示します。

ラジコン側(esp-wroom)

gist.github.com
gist.github.com

iOSのやつ

github.com

UDPで投げるためにSwiftSocketというライブラリを使って投げました。
cocoapods.org


これらを組み合わせて使う感じです。

完成!

すいません画像撮り忘れました(学校に置きっぱなしにしてしまった。)
年明けには更新します・・・・

反省点

モーターを欲張ってトルクチューンモーターにしたところ、まさかの定格で書いてる3Aを超えて流れて熱暴走をしてしまいました。。。。(余裕を持ったHブリッチ買えばよかった。。。。)
うまくいかないのでコンデンサをモーターにさしてやったり(セラコン0.1pFぐらいかな?)逆にダイオード差し込んだりという手でどうにしましょう(リプル殺せるので)。



次は竹 (@takemioIO) | Twitterさんですw!(俺やんけ)

進学って大変ですねっていうポエム

雑記

進学って大変ですね

 こんにちは。しくじり先生(?)です。進学なんか決まったぽいんで悔しさと浅はかさを込めて自戒のための記事を書きます。ぜひ笑ってください。
(単純に希望大学全部落として、第四希望ぐらいのAOでスルッと地元の私大の新設の情報学科に入ってしまったというオチ)

 あとこれから技術だけで受けようとする人に対してちゃんと考えて欲しいという気持ちで書きます。ぜひ受験生の人は考えてください。

お前ってどこ受けたの?

coinsと農工大電通(夜間)と地元の私大です。

お前ってなんで大学行きたかったの?

高校進学時は大学でも終着駅は就職なら就職でいいだろと思っていました。
ですが元カノに大学行こうぜって誘われ、そのうち自分自身が情報を学び進めて行くうちに、様々なことに興味が出てきて、関数型言語に興味があり、特に型理論(リファーメント型でのコンパイル時の安全性など。。。)を学びたくなったから。

お前にそれだけの頭あったの?

頭ありませんでした。地元の工業高校(偏差値は50前後だと思う)に在学で評定は安定して3.5でした。

お前技術力はあるの??

微妙なところです。高校プロコン優勝でITジュニア賞もらったり、サイバー甲子園で入賞して、2015のSECCON決勝大会に出場したり、iCANという国際大会の予選に出て奨励賞とか、地元のソフトウェアコンテストで一位になってみたり、機械学習が好きで遊んだり、関数型好きで勉強したり人並み以上だとは思ってました。

実際の受験フロー(しくじり部分ともいう)

 僕は三年時にパソコン部(名前は違いますが)で部長をやっていて10月の文化祭が引退でした。ですの本当は受験勉強で忙しい3年の夏も大会のために強制的に平均睡眠時間3時間ぐらいでマイコンをいじりプログラムを書いていました。そこで私は一般を早々に諦めて技術力だけでの勝負に切り替えました(つまり推薦やAOに切り替えた)
しかしそれでも大学に出願するには大変時間がありませんでした。(どれくらい時間がなかったかというと大学に間に合うのにのせなきゃいけない郵便配達の集荷の締め切り1時間前までやってたり、台風なのに高校まで行って調査書を取りに行くなど。。。。)



 さて微妙な出来の書類をまずはcoinsへ出しました。このとき、色んな人や先生、フォロワーさんに見てもらったりして大丈夫でしょと言われ自信満々でした。
 しかし落ちました。辛い。今思うに評定なのかなとか思います。
 さて農工にも出しました。実際に受かった人に見てもらっておそらく一次は確実に通るって言われたりしてたので、この時も自信満々でしたが。落ちました。
 



 さぁ困りました。次どうしよう。。。迷走します。センターとりあえず払いこむとか他の推薦やAOを探すとか色々手当たり次第探していました。



 迷走を経て次の進路を決めました。電通大の夜間を受けることにしました。
 理由は単純でお金の面を心配せず行え、やりたい研究室もあり、かつMMAに入れるから。
さてそれに向けて頑張りました。ちなみに夜間と言いながらも入試問題は一般の電通大の推薦入試と同一の問題です。ですので私の高校では開講していない基礎なしの物理や化学、数学Bなどを自力でやりました(必死)

 しかし、努力叶わず爆死しました。それは今年の問題がレベルが過去三年分と比べてえらく上がっていたということ。例えば電磁気が今までは電気回路だったのがいきなりコンデンサの静電容量がどれくらい貯めれるとかクーロンの法則が出たりなど、また僕がそれに対して絶対これだろというふうにある程度ヤマを張っていたこと。ちなみにヤマは全て外した記憶があります。本当にしくじりました。まさか融合問題が出るとは。。。。(頭抱え)


 その後とりあえず浪人はみんなに止められたので、やめようという方針を立て始めた失意の中、顧問の先生の助けを借り、第四希望の大学に出願したのがポーンと受かりました。(おそらくそれは面接に出した賞状で殴った感じだと思う。)
まぁそんなもんだろうみたいな感じ。

まとめと反省と僕みたいに失敗して欲しくないためのポエム

 受験をなめてた。正直夏休み明けの時点で高校選択間違えたなと、さえ思った。
中学の時にもう少し頑張って高専狙うとかできれば。。。とか評定がもう少し高ければ。。。とか就職であれば楽だったのに誘われてたとこに行けば。。。とか自分より実績がない部活の同級生が公立に受かるのを見て公立なら受かったのかな。。。とかIFばかり考えてしまう。本当に後悔後先立たずとはこのことなんだろうなと思う。
 

 だけどもこの経験は後悔してはいない。自分自身の足りないところや至らないところ。言葉ばかりでとり作ってきたところ。本当に色んなところに気がついた。精進が足りませんでした。過程があれば評価されると思っていた。本当に甘かった。


もしこの記事を読んでくれた中高生(特に工業高校の人)がいるならしくじった人並みのアドバイスをします。

高校生へ。
 一度将来をしっかりと考えましょう。このためになら1~2日潰しても構いません。ネットサーフィンしまくるなり、本屋さんに行くなりして何やりたいのか考えましょう。いつでも遅くありません。できるなら一年生の時からです。
 そしてもし就職なら評定を一生懸命上げましょう。
 進学ならば、1年生は今すぐ河合塾に行くなりスタディサプリ(科目の足りない学校にいるならなおさら。)を取るなりしましょう。最低限進学就職どっちに転んでもできるように知識をつけましょう。一年生なら評定もあげやすいですし一年生の科目だけを課す試験が就職にも進学にも多いです。
2年ならまずは模試を受けるべきだと思います。自分の実力によっては最悪頑張っても難しい場合があります。全統模試など全国クラスのにしましょう。自分が低く出た方が危機感が湧きます。
3年次の人で早い段階の入試を受ける場合で部活が忙しいなら部活をやめましょう。それくらい覚悟が必要だと思います。

中学生へ。
 もし工業高校に行きたいとか思う人がいたとしてもやめておくべきだと思う。少なくても大学に行くのがお金的に無理とか家を継ぐとかない限り。もしくはそこの高校でしかできないとかない限り。初め進学なんてしねぇよと思っても、専門分野を深く学ぶうちにやっぱ大学進学したいと思うようになると思います。特に大学数学などが必要だったり化学が好きだったりとかだと特にその可能性が高くなります。(正直工業高校の化学は実用よりで大学の範囲までは言わないので)
それでも専門分野を学びたいと思うならば高専か理数科を目指すべきです。高専であれば3年次編入があり、それは高専生向けである場合多く、進学時学んでないなどでのカリキュラムで困ることが少ないと思います。理数科であれば特に物理系の部活や化学系の部活などで工業高校でやれる部分と同じ理論基礎に対して取り組めます。また、もしそのような取り組みをした場合、理数科目でのバフになり得ることが多く点数が取りやすくなり、さらにはその学校が科学オリンピックなどに力を入れてる場合が多いです。

高いレベルの高校に行く意味はあります。先生の質も変わります。是非頑張ってください。


これらは人によってはそんなことないみたいな顔するかもですけど少なくても僕がすればよかったなと感じたことなので書きました。


 僕はこれから大学生活をするわけなんですが足りない科目を自力で埋めなきゃいけません。辛いです。ですが一つやろうとしていることで大学での編入を目指そうと思っています。そのためには一度高専に行くとかしなきゃいけないんですけど。。。自分のやりたいことをするために賭けてみたいと考えています。


以上ポエムでした。

何かあれば@takemioIOにメンションをください

Arukas-CLIをbrewで入れる

 こんにちは今回はクジラさんではなくイルカシャチさんに(イルカに見えたんだもん)簡単にお世話になろうという話です。

 仮想化技術、皆さんは使っていますか?VMとかVagrant とかdocker使っていますか?使ってますね。僕もお世話になっています。



・・・ではもう一つ知っていますか?「Arukas
arukas.io

なんと純国産の仮想化コンテナ技術を提供するサービスである。ちなみに今ならベータ版という理由で使い放題無料なので今のうち使いましょう!

本題:Arukas-CLIbrewで入れる

 さてそんなArukasをじゃんじゃん使おうぜということでArukas-CLIを簡単にbrewで入れようという記事です><
 ちなみにですが今は公式だと手動(バイナリDL)大変なのです><
github.com
qiita.com
上のqiitaには入れ方があります。



brewとは。
Homebrew — OS X 用パッケージマネージャー

 正式名称はHomebrew。詰まる所Macintosh用のパッケージマネージャーです。これを入れると簡単に様々なライブラリ、フレームワークやソフトウェアを入れて便利って感じのものです。これは入れてあるものとして進めます。(入れてない方はbrewインストールとかで調べて戻ってきてくださいね><)


インストール(brewで)をする。

 

Go言語でつくったツールをHomebrewで配布する · THINKING MEGANE


などを参照するとわかるのですがHomebrewに独自リポジトリを実は入れることができます。


上のブログのことをやると brew tap [リポジトリ] , brew install arukasが可能になります。


ただ面倒なので私は直で作ったFormulaファイルを/usr/local/Library/Formulaに投げてbrew install arukasを行いました。



では実際に入れていきましょう。




まずは投げる前に
github.com
からarukas.rbを拾ってきましょう。



拾ってきたら/usr/local/Library/Formulaを参照してarukas.rbを突っ込みます。



そしたらbrew install arukasをしましょう。終わり(早い!!)
これを手動で入れるとめんどくさいのにこんなに簡単ヾ(・ω・*)ノ ワーイ


CLIを入れれた人へ

arukas.io

(力尽きたので上見てやってください(時間があればエントリ書きます)><)