syuntoku14の進捗

進捗を書きなぐります

最近の動向(8/9)

  • 確率ロボティクス輪読会
  • 制御のおべんつよ(Control of Mobile RoboticsとControl Tutorial)
  • 確率統計のおべんつよ(勉強会、Probabilistic Programming for Hackers)
  • インターン先のなにか
  • サーバー管理
  • Rustを学ぶ(new!)
  • 知らない留学生とチャット(new!)

死じゃ。最後のやつは今日から始めた。あまりにもスピーキング能力に不安があると思ってはじめてみたけど、どっちかというと問題はリスニングだった。相手が何を言っているのかがわからん。つれえ。

 

Rustも学んでいくのじゃ。まだ序盤。

 

正直ね、こんなことをせずに留学の準備をするべきなんですが、全くやる気が出ない。なんか病気じゃないかな。

 

ただ、確率や制御に関してはやる気の化身になっている。ただ勉強会を受け持ちすぎた。サーバー管理のやる気は普通。

 

勉強会、輪読会の効果的な進め方がわかってきたかもしれない。HackMDもしくはそれに類する何かに知識をまとめていくのは結構良いと思う。これは一般の講義とかでも使えるんじゃないかな。しらんけど。

 

制御のシミュレーションはControl of Mobile Roboticsの関係上simiamを使っている。リファレンスが若干適当なので苦労する。俺が調べてないだけかも。MATLABの文法よくわかっていない。mendokusai

 

 

 

  夏休みのMATLABと制御の特訓(7/31)

 

あまりにも脳みそがポンコツであり、テストが全然出来なかったので、集中できることをひたすら磨いていくことにする。

これ http://ctms.engin.umich.edu/CTMS/index.php?example=InvertedPendulum§ion=SystemModeling#7

と これ https://www.coursera.org/learn/mobile-robot

を夏休みの空き時間でとにかくやっていく。今日はとりあえず倒立振子モデリング、アナリシス、PID制御までやった。Courseraの方は全然手をつけていない。通勤通学時間とかでやるつもり。

いい感じに出来てきたらこの間購入したAlphabotに実装して動かそうと思う。ROSで実装する予定だったが、ムダ時間がやばくて無理そう。やってみないとわからないのでやるけど。

最近はAIAIしていない。Courseraの強化学習のやつをやるつもりだったけど、教授の英語があまりに早口で全く聞き取れなかったのでやめた。

Raspberry Pi上でROSからハードウェアPWMを弄る(7/27)

 (期末試験全然できねえ。 でも昔からテストとか試験とか出来ない性分だったので今更感はある。)

 

今回はタイトル通り、Raspberry PiでROSからハードウェアPWMのいじり方について。

ラズパイのGPIOをいじるときはwiringPiやRPi.GPIOを使っていたが、どっちもPWMをいじるには使い勝手が悪い。wiringPiも使う際にはsudoで実行しないといけないので、rosrunするとハードウェアPWMが動かない。ソフトウェアPWMも試したが、SG90がガタガタして使い物にならなかった。

そんな時に見つけたpigpioがなかなか使い勝手がよく、ROSからでもハードウェアPWMがいい感じに動いたので布教。pigpioの使い方についてはここを参照https://karaage.hatenadiary.jp/entry/2017/02/10/073000

 

流れてきたservo_angleトピックを受け取り、その角度にSG90を動かすだけの単純なコード。ソフトウェアで生じていたガタつきがなくなったのでいいんじゃないかな(多分)。

pigpioは使う前に

sudo pigpiod

を実行しないといけないので注意。起動時に自動実行したいときは/etc/rc.localに書いとこう。

 

サーボを動かすやつ:

#!/usr/bin/env python
"""
Reference:https://karaage.hatenadiary.jp/entry/2017/02/10/073000
Summery: Move servo angle to the topic value 'servo_angle'
"""

import pigpio
import rospy
from std_msgs.msg import Float32

# initialize gpio
pwm_pin = 18
pi = pigpio.pi()
pi.set_mode(pwm_pin, pigpio.OUTPUT)

def callback(angle):
    duty = ((angle.data + 90.) / 180. * 1.9 + 0.5)\
            / 20. * 1e6
    pi.hardware_PWM(pwm_pin, 50, int(duty))

rospy.init_node('servo_Subscriver')
sub=rospy.Subscriber('servo_angle', Float32, callback, queue_size=1)
rospy.spin()

おわり〜

ただ、コマンドラインから

rostopic pub servo_angle std_msgs/Float32 50

でパブリッシュするとサーボが動くのが結構遅かったので、ムダ時間が結構大きいかも。そもそもROS自体がムダ時間凄そうだけど...

デスクトップを借りたりMATLABを進めたり(7/20)

久しぶりに日報を書いた。期末試験前にこんなことをしていていいのかと思ったけど、最近何をやっているのかわからなくなったのでちょうどいい。友人宅にでかいデスクトップPCを取りに行ったりした。人生で一度も自分用のデスクトップPCを持ったことがなかったので、相対的なスペックも実はよくわかっていない。

 

MATLABのsisotoolを使ったシステム設計をちょっと進めた。前に紹介したMATLABのpdfのやつ。一番最後に離散時間系と非線形系の解析もやるので、さっさと進めたい。オブザーバーの設計全然やったこと無いので、それも練習したい。そもそもシステムを設計したことなし。

 

Bayesian optimization、ちゃんと理解しないままCourseraの最終課題をクリアしてしまったので、そもそもガウス過程の学びをしないといけない。以前途中までやった"Probabilistic Programming for Hackers"の最後の方にガウス過程の話があるみたいなので、これもやらないといけない。

 

お風呂で「集合と位相を何故学ぶのか」を読んでいる。ipadを手に入れてしまい、直接ipadに書き込むことが多くなったので、ブログにがっつり何かを書くことが減った(言い訳)。必然的にブログの内容も薄い。

 

移動中にCourseraをやると良いので、今はPractical Reinforcement Learningを聞いているけど、Modern Roboticsのやつも聞きたいので、肉体が2つ以上欲しい。そもそもProbabilistic Roboticsもやるんじゃ... 無理ゾ。

さまざまな進捗 (7/10)

久しぶりに剣道をした。体力の低下を感じたものの、案外動けることが分かった。攻めって何って感じ

 

fusion 360からURDFの作成を補助するスクリプトを書いてる。まだ作成途中。 正直とても単純なので、全然自動化はできてないけど、まあ多少は楽になる(はず)だし、いっかな。CADファイルを作成し、ジョイントを定義、ジョイント情報を取り出すなどは人間の手でやって、その後は全部自動化したい(前半は難しいので)。現状STLファイルをバイナリ変換して、ジョイントの座標のxacroファイルを作成するところまでは出来たので、リンクの関係を木構造で定義して自動でxacroファイル生成までやりたいところ。そんなに難しくないはず。

 

空いた時間にMATLABもしくはtensorflowをいじる習慣をつけた。tensorflow、ちょっと触っただけで終わっているのでそろそろやる。Probabilistic Programming for Hackersもやっていきたいところ何だけど、なかなか時間が取れない。難しいです。

 

将来的にやりたい分野は制御工学なんだけど、制御工学の何を研究していくかまだ決まっておらず、悩みどころ。今のところ、マルチエージェント制御か画像制御が個人的に非常に興味がある。でもそもそも基礎的な知識がしっかりしておらず(H∞制御とか最適制御とか)、また実務経験も乏しいので、そのへんしっかりしないといけない。留学から帰ってきたら制御系インターンに行こうと思っているが、行き先も特に決めておらず...

 

留学とか鯖管理とか色々やることもあるし、非常に忙しいけど楽しい(実験が終わったので)

 

悪夢の期末試験期間が始まる。

Jetson TX2(jetpack 3.2)にROSもtensorflowも入れたい欲張りさんへ(6/30)

ここでは、ROSとtensorflowをjetsonに入れるやり方について説明する。kerasはなんかインストールできなかったが、後述のtensorflowのwheelファイルを古くしたら行けるかも(未検証)

pyenv-virtualenvによる仮想環境の構築を最初にやろうとしたが、なんかうまく行かなかったのでとりあえず生の環境に全部入れた。Jetsonはanacondaが入らないので、tensorflowのインストールはなかなか面倒くさい。頑張ろう。

 

とりあえずJetsonのセットアップ。

ここに従ってすすめる。jetpackは3.2を使おう。 https://qiita.com/akrian/items/54c321bfa95d8eaef17d

すると、CUDA cannot be installed...みたいなエラーが出ると思うので、出たら一回rebootする。 rebootしてから、先ほどのエラー画面に表示されているパッケージ群をsudo apt installで全部インストールする。あとは画面に従う。

 

あと、キーボードの設定もしておく。(リンク先に記載あり)

 

次に、ここ のROSのインストールにしたがってrosを入れる。

ROSがインストールできたらtensorflowを入れる。

 

ここからtensorflowのwheelファイル(version 1.9で動作確認)を入手して、

sudo pip install[tensorflowのwheelファイル]

をする。そしたらエラーが出ると思うので、

wget  https://bootstrap.pypa.io/get-pip.py

を実行した後、もう一度

sudo pip install[tensorflowのwheelファイル]

をする。すると赤い文字で何か怒られるので、

sudo pip install testresources

を実行し、もう一度

sudo pip install[tensorflowのwheelファイル]

を実行する。それでもまだenum34がuninstallできないよと怒られるので、

sudo pip install --ignore-installed [tensorflowのwheelファイル]

を実行する。これで多分行けると思う。 pythonしてimport tensorflowできたら成功!!(できなかったら分からん!)

とりあえずmatplotlibとjupyter notebookはぶち込んでおいた。jupyter notebookでサーバを立てると色々捗ることは一般に知られている。

 

これに至るまでに失敗したポイントなど:

・ tensorflowをビルドしようとして失敗した->大人しく配布されているwheelファイルを使おう 

・ネットに転がっているリファレンスがjetpack3.1を元にしている->手元の環境がubuntu16.04なのでjetpack3.2じゃないと無理!めんどくさかった。

・そもそもwheelってなに?

wheelとは? pythonのパッケージ形式のこと。実態はzip形式のアーカイブ。 pipでパッケージをインストールするときは、wheel形式のファイルをダウンロードすることから始まる。逆に、pythonのパッケージを作成して配布したい場合は、wheel形式のファイルを作成する必要がある。

・kerasがインストールできなかったんだが?

なんかpip install scipyで怒られが発生する。もう知らん。

wireguard入れたりJetsonにROSぶち込んだり(6/23)

JetsonにROSを入れたりした。http://wiki.ros.org/ja/kinetic/Installation/Ubuntu これをコピペするだけ。めっちゃ簡単。

 

あとEC2アカウントでjupyter notebook走らせて喜んだりした。 参考:https://qiita.com/t12968yy/items/b6c14f48638060916824

 

VPNのお勉強としてWireguardで遊んでいた。弊学科はこうしたネットワーク周りマジで何もやらないので、大変勉強になって良い。

やったこと:http://syuntoku14.hatenablog.com/entry/2018/06/23/001540

 

今日の機械学習交流会は実装会だった。GANの実装ということで、同期が一晩でなんか頑張って作っていた。大変関心。私も見習って進捗を産んでいきたい。

サーバ管理課題2

  • [x]NATについて調べる
  • [x]VPSについて調べる
  • [x]WireGuardについて調べる
  • [x]AWS EC2インスタンスにWireGuardをインストール・セットアップする
  • [ ]NATされた二つのクライアントがAWS上の中継点を通して接続できるようにする(WireGuardで)
  • [ ] (発展課題) DNSレコードを設定し、ドメイン名からアクセスできるようにする
  • [ ] (発展課題) 適当なオープンソースサーバソフトウェアを動かしてみる (nginxでウェブサイト作ったり、tt-rssRSSリーダを動かしたり、gogsでgitレポを置く場所作ったり… https://github.com/Kickball/awesome-selfhosted に色々あるから面白そうなのを見つけて動かしてみよう)

座学この中から1つ以上選んで調べよう

  • [x] sshの仕組み(若干わかった)
  • [x] 公開鍵暗号・対称暗号(若干わかった)
  • [ ] ufw/iptables
  • [x] tmuxの操作(慣れてきた)
  • [ ] DNS
  • [ ] sudoコマンドと/etc/sudoers
  • [ ] 仮想マシン・ハイパーバイザ・Xen
  • [ ] コンテナ技術・lxc・lx

NATとは

Network Address Translatorの略。プライベートIPアドレスグローバルIPアドレスに変換すること。

組織でのNAT:組織内部のノードがインターネットへアクセスした時、NAT装置が発信元のローカルIPアドレスを空いているグローバルIPアドレスに変換する。

インターネット側からのパケットは、NAT装置がグローバルアドレスからプライベートアドレスに書き換えて元のノードに送信する。

共用サーバと専用サーバ

共用サーバは、一つのホストマシンを複数人で共用して使用する。一般に、レンタルなものはサーバ会社から用意された環境を利用するため、専門的な知識がなくても利用できるなどのメリットがある。一方他のWebサイトやシステムによる影響を受けてしまう可能性があり(計算リソースなど)、サーバの設定や利用できるソフトウェアに制限がある。

専用サーバは契約者がサーバの持つリソースを全て使用でき、必要なソフトウェアのインストールや設定の変更を行える。root権限がある。レンタルだと非常に高額になってしまう。

VPSとは

Virtual Priveate Serverの略。

VPSでは1台の物理的なサーバの中に、仮想的な複数のサーバを構築する。共用サーバと異なり、ホストOSの土台の上にユーザーごとにゲストOSが用意されており、基本的にゲストOS同士が鑑賞することが無い。メモリやCPUもゲストOS用の性能が確保されるため、共用サーバと異なり、不可のかかる利用にも適している。

専用サーバと異なり、物理サーバを専有しているわけではなく、物理サーバに障害が発生した場合は全てのVPSユーザが影響を受けてしまう。

VPNとは

Virtual Private Networkの略。離れた場所の間を仮想的な専用線で繋いで安全なデータ通信を実現する仕組み。 公開回線をあたかも専用回線であるかのように利用し、物理的に遠くに存在するコンピュータを同一のLAN内にあるように扱う技術のこと

これによって距離の離れた拠点同士のLANをつなぐことができる。

WireGuardとは

大体ここhttps://www.wireguard.com/ の内容をまとめ上げている

Wireguardはとは、state-of-artな暗号化方式を使うことでシンプルで高速なVPNを実現しているらしい(ホームページより)

WireGuard securely encapsulates IP packets over UDP.

WireGuardはIPパケット(ネットワーク層でのデータの塊)をUDP(User Datagram Protocol)によってやり取りする(多分)

WireGuardインターフェースでは公開鍵認証方式でパケットの送受信をするよ

SSHmoshの仕組みを利用しているらしい。

WireGuardは、eth0やwlan0と同じように、wg0,wg1,...といったネットワークインターフェースを追加して利用する。(??)

WireGuardsを利用するとき、インターフェースは次のような形式で通信相手にパケットを送りつける

  1. 送信相手のIPアドレス(192.168.30.8.)から、送信相手Aに送りたいことがわかった
  2. Aの公開鍵を使ってIPパケットを暗号化する
  3. Aのエンドポイントを検索し、host(216.58.211.110.)の53133ポートであることがわかった。
  4. 2番で暗号化したものを216.58.211.110:53133にUDPで送りつける

疑問

IPアドレスとエンドポイントの違いがきちんとわかっておらず、なぜステップ3でエンドポイントの検索が行われるのかがわからなかった。そもそもエンドポイントの検索is何?って感じ

質問終わり

パケットを受け取ると、次のステップが生じる

  1. host 98.139.183.24のUDPポート7361からパケットを受け取ったので、解読していく
  2. 送信相手LMNOPQRSに向けて解読、authenticated(認証?)されたみたいなので、LMNOPQRSの最新のエンドポイントを98.139.183.24のUDPポート7361として記憶する
  3. 解読したところ、192.168.43.89からのパケットであることがわかった。LMNOPQRSがこいつからのパケットを許可しているか調べる
  4. 許可していたらパケットを受け取る。そうでなければ破棄する

疑問

だいぶガバガバ解釈かもしれない。しかし、これはSHSと何が違うのだろうか?SSHは公開鍵認証を使う仕組みのことを言っていて、インターネット層のプロトコルが決まっていない?WireGuardでは、SSHの送受信部分にUDPを使っているよっていう話かな?

質問終わり

https://www.slideshare.net/codeblue_jp/cb16-donenfeld-ja ここが分かりやすかった