syuntoku14のブログ

進捗を書きなぐります

ros japan 勉強会(6/20)

注目したもののまとめ

URDFについて 結論から言うと、CADからURDFを直接生み出す充実したツールは無い、もしくはあまり整備されていないらしい。(ある程度経験がある人が言っていた。) しかし、URDFの作成を楽にするツールはいくつか紹介していただいた。

URDFをブラウザ上でリアルタイムに可視化しながら作成する:

  1. https://tsumehashi.github.io/urdfblocks/

  2. http://www.mymodelrobot.appspot.com/5629499534213120

f:id:syuntoku14:20180621002427p:plain

f:id:syuntoku14:20180621002410p:plain

1は本当にすごいと思った。これを二週間で作り上げたらしい。すごい。 直感的にブロックを組み合わせることでurdfを組み上げることができる。ある程度これで組み上げて、適宜調節するといいだろう。

2は似たようなものが存在するという話を聞いてググったら出てきた。まだ使ったことはない。こちらも非常に便利そう。

また、urdfの可視化ということで、こんなものも教えてもらった。 https://github.com/OTL/urdf-viz まだ使っていないが、urdf設計の際には非常に便利になるようだ。

ROS2について

やはりROS1はリアルタイム性にかけ、組み込みの際にもある程度強いlinuxが乗るコンピュータが必要になってしまうので、分散ロボティクスには向いていない。そのため、開発途中ではあるが、組み込みをやるならROS2、という主張を聞いた。

ROSCOREの耐障害性について

Dockerでroscoreを丸ごとダンプすることで、roscoreが落ちてしまってノード全ての再起動が必要になってしまう現象を防ぐ。Dockerは触ったことが無いので詳しくはわからないが、学ぶべき。

以下はメモです

トレーラトラックの自動駐車計画アルゴリズムの紹介

全更新とステアリングだけでトレーラの位置を制御した人の話

自動運転でよく使われているHybrid A*っていうアルゴリズム

ROS1ノードを組み込みで動かそうとした話

組み込みで使いたいのにLinuxが必要になっちゃう

mROSという存在(開発途中)

SLAM入門

ポーズ調整に似た方法でIMUの累積誤差を修正

SLAM:センサデータを繋いで地図を作る 自分の位置がわからないと綺麗につながらない

ROS対応LittleSLAMについて

IMUでの加速度の積分の調整

グラフベース最適化による誤差習性

PCA第一主成分で卓球の打ちわけを分析している

Sciurus17の紹介

RTの紹介

CLANE-X7の紹介(アームロボット) 1本90万円(高いね)

RoboCup SSl戦略システム「CON-SAI」

Robocup SSLの基本システム全部入りパッケージ

ROSによるッマルチロボットシステムのメリット・デメリット

  • CPUリソースが比較的簡単に活用できる
  • ロボットごとのNamespacee、それをまとめるlaunchファイル

シリアル通信を使ってSTMマイコンでROSメッセージを喋ったり聞いたりする

ROSを強いPCで動かすのとよわいPC で動かすのでは結果が全然違う。(SLAMを強いPCでうごかすのとよわいPC で動かすのでは全然違う)

rosserial_stm32っていうなにやら便利なもの

URDF

インベンターで質量などを計算してあとは手空きしているらしい

ソフトウェアライセンスについて

Apache, BSD, MITなどPermissibleなもの 危ない:L-GPL ダメに近い:GPL

ROSを使って製品を作るときに: * 使用されるソフトウェアライセンスを列挙

ライセンスを整理できるコマンド:sw_license

大体ROSのパッケージはライセンス問題ないらしい(危ないのはsystemパッケージ)

クラウドとROS Rapyuta Robotics

Cloud robotics platformについて

  • multimaster flakeっていうパッケージ
  • ROS2を使う
  • ロボット間通信を別途実装

wanでの課題: * securityの問題など

Rapyutaではマルチロボットの通信にAMQPっていうプロトコルを使っている

 

触覚センサの話

ロボットこわれてないよ♡って言いたい。

商品化したらロボコンでも使えそうではありますよね。

 

rosの耐障害性について

単一障害点の対策について

単一障害点であるroscore→問題(roscoreが死ぬと全部再起動しないといけない)

解決策:Docker Checkpointによって、roscore環境を丸ごとダンプする

dockerも勉強したほうがいいかもね

move it とindustrial ciを何かいろいろやる

launch testしようねっていう話

travis ciって何?

M5stackを使って電子工作した人

ディスプレイと音声が付いているので楽しい!!

Trouble Shooting ROS beyond ubuntu

ROSを使うだけじゃなく、PullRequestも送ろうっていう話

URDFをブラウザ上でリアルタイムに可視化しながら編集

これが個人的に一番すごいと思った。

書籍の電子化を注文(6/20)

ほとんど読んでいない参考書が邪魔だったので、本を電子化するサービスを利用してみること。ものは試しということで、早速スキャンピーに注文し、10冊ほどpdfにしてもらう予定。何冊か直接書き込んでしまったものもあるので、どうなるか不安ではある。

Jetsonのセットアップ

お家に眠っていたjetsonにubuntuをぶち込むなどした。とりあえず留学に行くまでに何かしらの学習モデルを走らせてなんか作りたい。そんな暇があるのか?

確率ロボティクス輪読会

一年生に発表してもらった。割と理解できていて驚きを隠せない。一年生にして非常に優秀な人材が今年は多いと感じている。多分これは偶然ではなく、今年の教育班が頑張ったからだと思っている。みんな本当に働き者。すごい。

研究室選びを迷っている。大森研究室か滑川研究室かで迷い中。どっちもやりたいことはできそう。とりあえず滑川研究室はまだ見学していないので、見学しに行きます。

6/16(機械学習交流会にてプレゼン)

インターン

空き時間にいろいろ調べた。ROSで何かシミュレーションしたことあらず。強化学習もやりたいんですがね、何でもかんでもやりたがる習性があるので。

機械学習交流会

機械学習交流会でプレゼンした。今日は少し人数が少なくて残念。

作成したスライド:

https://www.slideshare.net/keio_rogiken/ss-102493735

内容は制御工学とディープラーニングについて。自分の興味がある分野が制御工学であり、機械学習は割と趣味的にやっている側面が強い。周りの強い人に何かしら勝てる部分がほしいので、若干マイナーな制御工学で機械学習界隈ではいきりちらしたいところ。

割と大人数の前で発表するのは緊張する。少し早口になってしまったと思う。早口だがオタクではない。

MATLABをインストールした。教室で数人MATLABをいじっている人がいるので危機感を抱いたため。ただ、早くCoursera終わらせろってN回言ってる。

案外この大学は確率論をちゃんとやらないんですね。ダメだと思う(小並)

機械学習交流会でテンソル代数の話が出てきたので、ちゃんとやりたいところ。

がさっさと終わらせたいもの。確率ロボティクスは日常生活に組み込まれているべきなのでタスクではない。

6/7~6/14 (だれかURDFの簡単な生成方法教えて)

レポートを書いたり、機械学習交流会の準備をしたり、確率ロボティクス輪読会だったり、ビザの申し込みをしたり、めちゃくちゃだった。

ビザは終わったので一息つきたいところだけど、来週は課題が複数個増えているのでやばい。

友人から出されたサーバ周りについての課題もさっさとやらないといけないし、Courseraが一向に進まない。いつになったらVAEの課題を出せるんですかわたしは

ROSについてなんですが、誰かURDFを適当なCADファイルから簡単に生成する方法を教えていただけませんか?SolidworksのURDFアドインが何故か起動せず(そもそもそろそろライセンスが切れる)ので、できたらFusion360で実現したい。

明日の機械学習交流会は、「システム制御と機械学習について」っていう題材で話す予定。3日で論文を読み漁ってスライドを作りながら確率ロボティクスを読みビザを申し込んだ。めちゃくちゃ。

 

 

読んだ論文:

Modeling of nonlinear system based on deep learning framework

簡単に言うと

非線形モデルをDeepLearningで学習している

おおまかな流れとして、Restricted Bolzman Machineでfine-tuningして、Elman Neural Networkにつなげるみたい。

RBMを使ってエポック数を減らして実機の負担を減らすのが目的?

学習する対象として、非線形系であるD級アンプ(最終出力段でデジタル的にスイッチング動作するものらしい。アナログ信号->PWM信号->スイッチング->LPF->アナログ波へと変換?)と永久磁石同期モータについて行った。

今までのアプローチ(NNによるもの)は、初期値を適切に決めなければ局所解に陥る

使用しているENNは、部分的にRNNであり、入力の履歴にsensitive->非線形系のmemory effectを扱うことができる(memory effectってなに?)

memory effectとは、多分だけどバックラッシュやヒステリシスのように出力が現在の入力だけでなく、過去の入力にも依存するような非線形系をメモリー型っていうので、多分そのこと

RBMの重みをENNの層の一部の重みにそのまま使用する。

これらで作成したモデル(DRN)は、RBMとENN単体よりも良い性能を示した(シミュレーションと実際の機械のどちらでも)

わかんなかったところ

これ、比較対象おかしくない?(非線形系だからかな?) ENNを比較対象に使う理由はまあわかるけど、RBMを比較対象にしてるのはよくわからんかった。

 

On replacing PID controller with ANN controller for DC motor position control

簡単に言うと

PIDコントローラをNNで学習できたよって言う報告。

 

f:id:syuntoku14:20180614235346p:plain

コントローラをNNに置き換えた。 reference inputと制御対象からの出力を入力。reference modelと制御対象からの出力の差分を損失関数として学習。

ANNはPIDよりも比較的良い結果を示した(Unknown Dynamicsに対して)(ただ、これデータが載っていない)

Supervisedな学習なので、未知のシステムに対しての制御が期待出来そう。

 

On Replacing PID Controller with Deep Learning Controller for DC Motor System(さっきのとちょっと違う)

簡単に言うと

PIDコントローラの出力をDeepLearningで学習できたよって言う報告。

Deep Belief Networkによってコントローラを学習している。

2015年くらいまではDeepLearningを制御に使ったものが無いらしい(ほんまか?)

NeuralNetが使われたものはまあまああったみたい。(定義上の違いがわからん)

RBM(制限付きボルツマンマシン)でfine-tuningするのはよくある手法?

PID制御コントローラ(自分で作ったもの)の出力を教師データとして学習を行う

一般的なDCモータを対象としてMATLABでシミュレーションしたところ、DNNでPIDコントローラを置き換えることが出来た。

進捗(6/7) AWSインスタンスの作成など

非常に課題が多く参っている。現在は機械学習と制御工学、競技プログラミングとサーバー管理、あとROSの勉強(インターン)と留学の準備(一番大事)を同時並行して行っているので、まあもちろん無理ですよね。(あと追加でCourseraと確率ロボティクスもあるじゃん)

できるわけ無いだろ!!!死じゃ(千鳥)

 

今日はSSHについて学んだり、制御工学の中間試験の対策をしたりした。何かやっと鍵認証周りの知識がしっくり来た。何回も本を読むより一回実務やったら理解できるってそれ一番言われている。

 

競技プログラミングめちゃめちゃやりたいけどこれはちょっと置いとこうと思う。オレ カラダヒトツ タスク6コ ムリ

 

まあいろいろありますが、なんとなくCoursera終わっていないのが気がかりになってしまうのでさっさと終わらせようかと思う。

タスク管理が下手くそ。

優先順位:

1. 留学の準備

2. 機械学習交流会の準備, サーバー管理の勉強

3. Coursera

4. 確率ロボティクス

5. その他諸々

競プロ勉強会に参加しました (5/31)

 競技プログラミング勉強会に参加しました。

正直全然解けなかったけどこれから頑張る。忙しいので進捗が埋めるか全くわからん。大学辞めてサークルだけ参加したい。

今回は累乗の高速化とUnionFindツリーの解説。基本的な知識が足りておらず参っている。基本的に私は頭は良くないので、努力でなんとかしていきたいところ。

午前中はインターン先の作業を自宅にて行っていた。ROSの小技を身につけたりした。

あとはSolidworksでハード作ってた。

 

mt_caret君香港でも頑張れ(受け継がれしsweep)

 

 

ROS launchの引き数

引数の付与については以下のリンクを参照 http://www.g104robo.com/entry/ros-launch(これ、うまく行かないので注意。コマンドラインの引数を反映できない)

間違いポイントとして、

<param name="piyo" value="($arg hoge)"/> 
ではなく、正しくは
<param name="piyo" value="$(arg hoge)"/> 

詳しくは http://wiki.ros.org/ja/roslaunch/XML ここを参照

http://robonchu.hatenablog.com/entry/2017/05/28/173118

配信したrosparamは rosparam listで確認、pythonにて ```python param = rospy.get_param("/param", default_balue)

全然制御工学の勉強する時間なくて困る。時間が二倍ほしい。

確率ロボティクスの輪読会(5/29)

 

確率ロボティクスの輪読会(5/29)

慶應ロ技研で確率ロボティクスの輪読会を主催している。今のところ順調に進んでいるはず。一年生が参加しているうえ、内容に食らいついてきていることに驚いた。今年は一年生の質が高くて嬉しい。ロ技研の未来は明るい。

スライド https://www.slideshare.net/keio_rogiken/presentations

今のところカルマンフィルタ、情報フィルタをざっくり終え、Nonparametricな手法に突入している。新入生にも発表を体験して欲しいということで、F^3RCでのカルマンフィルタについて考察して発表しろっていう課題を出した。そのへんの講義よりよっぽどためになる気がする。この輪読会に対して単位を配布してほしい。

実験のTAの方に確率的制御について語った。案外今のポンコツみたいな知識でも通用することがわかった。嬉しい。確率的な思考を養うためのおすすめの本とサイトを教えたお礼に制御工学ガチプロの本Modern Control Engineering を教えてもらった。余裕があれば読んでいきたい(余裕がない)

全然関係ないが、気が向いた時にシェル芸を学んだりしている。本当に基礎の基礎からやっているが、頑張って継続していきたいところ。

自作ロボットのモデリング

ROSでは、URDFというXMLによる形式でロボットを表現する。

とにかくとても面倒くさいことがわかった。これはめんどくさい。

何かちゃんと動いた

<?xml version="1.0"?>
<robot name="tortoisebot">
  <link name="link_name">
     <visual>
          <geometry>
              <box size="0.6 0.3 0.3"/>
          </geometry>
          <material name="red">
              <color rgba="1.0 0.0 0.0 1"/>
          </material>
      </visual>
  </link>>
</robot>

追加のリンクとジョイントの作成

  <link name="front_caster">
     <visual>
          <geometry>
              <box size="0.1 0.1 0.3"/>
          </geometry>
          <material name="red">
              <color rgba="1.0 0.0 0.0 1"/>
          </material>
      </visual>
  </link>
  <joint name="front_caster_joint" type="continuous">
      <origin xyz="0.3 0.0 0.0" rpy="1.1 0.0 0.0"/>
      <parent link="base_link"/>
      <child link="front_caster"/>
      <axis xyz="0.0 0.0 1.0"/>
  </joint>

タイヤの追加

<link name="left_wheel">
      <visual>
          <geometry>
              <cylinder length="0.05" radius="0.035"/>
          </geometry>
          <material name="black"/>
      </visual>
  </link>
  <joint name="left_wheel_joint" type="continuous">
      <origin xyz="-0.2825 0.125 -0.15" rpy="-1.5708 0.0 0.0"/>
      <parent link="base_link"/>
      <child link="left_wheel"/>
      <axis xyz="0.0 0.0 1.0"/>
</joint>

基本的な設計方法として * linkを作成(位相情報不要。外形情報のみ) * jointの作成(親link、子linkの定義、位相情報を定義)

Gazeboでのシミュレーション

シミュレーションを行うには、全てのリンクにの二つのタグを追加する必要がある。普通ならcollistionはvisualのgeometryと同じになるはずだが、多くの場合は複雑な形状を無視して箱で近似したりする。 inertialには慣性モーメントを記述する。

Gazeboで慣性モーメントのデバッグができる

View-> Center of Mass

Gazeboで読み込むには 1. URDFモデルをパラメータサーバにロードする 2. Gazeboを起動する 3. ROSのサービスコールを利用して、Gazeboの中にロボットのインスタンスを作成する。

小ネタ:

URDFにdifferential_drive_controllerプラグインを追加すると、cmd_velへのメッセージでロボットを操作できるぞ

座標変換情報を配信する

URDFコードにjoint_state_publisherプラグインを追加すれば良い。詳しくはプログラミングROSp.314参照

Baysian Week5

基本的にCourseraの画像勝手に使っちゃいけない気がするので画像はないよ

Why model p(x)

  • Generate new data
  • Detect anomalies and outliers
  • Work with missing data
  • Represent your data in a nice way

How to model p(x)

  • \(\log \hat p(x)=CNN(x)\)

However, in this case we have to compute \(p(x)=\frac{\exp (CNN(x))}{Z}\)

which is expensive to compute when x is really high dimention. So this is infeasible.

  • Use the chain rule

\[p(x_1,...,x_d)=p(x_1)p(x_2\mid x_1)...p(x_d \mid x_1, ....., x_{d-1})\\ =RNN(x_1,...,x_{k-1})\]

Reference: "Pixel recurrent neural networks"(2016)

It is more easier to compute because now we have to consider the normalization constant which is based on one dimentional distribution.

However, this is very slow.

  • \(p(x_1,...,x_d)=p(x_1)...p(x_d)\)

But this assumption is too restrictive. Each pixel must have something to do with each other.

  • Mixture of several Gaussians(GMM)

Still too restrictive

  • Mixture of infinitely many Gaussians

\[p(x)=\int p(x\mid t)p(t)dt\]

The idea is that the image x has a corresponding latent variable t, and the image x is caused by the t. The conditianl distribution of \(p(x \mid t)\)is Gaussian.

Using CNNs with a mixture of Gaussians

  • Continuous mixture of Gaussians

\[p(x)=\int p(x\mid t)p(t)dt\]

\[p(t)=N(0,I)\]

\[p(x\mid t)=N(\mu (t), \Sigma(t))\]

if $ (t) = Wt+b, (t) =_0$ get PPCA

But if x is image, why not \[\mu(t) = CNN_1(t)\]

\[\Sigma(t) = CNN_2(t)\]

However, if our image is 100x100, our covariance matrixes is 10000 x 10000. This is really large.

To avoid this, let's say our covariance will be diagonal.

Learning

\[\max_w p(X\mid w)=\int p(X\mid T,w)p(T)dt\]

This is Latent Variable model... But we can't use normal EM algorithm.

Need to compute \(p(T\mid X,w)\)

\[\log p(X\mid w)\geq L(w,q)\]

\[maximize_{w,q} L(w,q)\]

In this step, we have to compute the integral and the integral conains CNN so this hard to do analitically.

How about MCMC?

\[\mathbb{E}_q \log p(X,T\mid w)\approx \frac{1}{M}\sum^M_{s=1}\log p(X,T_s\mid w)\\ T_s\sim q(T)\]

In this method, we have to wait the MCMC conversion every time of update. This is very slow.

We can try variational inference.

\[log p(X\mid w)\geq L(w,q)\]

\[maximize_{w,q} L(x,q)\]

subject to \(q_i(t_i)=\hat q(t_{i1})...\hat q(t_{im})\)

But again intractable.

Scaling up Variational EM

Variational Inference

Let's use factorized Gaussian.

But this way ~100 parameters of each training object. And is not clear what is m, s for test objects.

This way the Gaussians is not connected each other.

By using the functions m and \(s^2\), we can train them easily and estimate test data.

And exploiting CNN to predict the m and s is good way because our datasets are images.

Then \[\hat t_i \sim N(m(x_i,\Phi),diag(s^2(x_i,\Phi))\]

The overall workflow:

The second CNN try to return an image that is as close to the input as possible.

This looks similar to Auto Encoder. But in contrast to the normal Auto Encoder, this has some assembly inside and has some variational approximations.

When s is 0, there is no stochastic variables inside the VAE. So it is same as usual Auto Encoder.

Variational Lower Bound

The first part is really close to the usual Auto Encoder, but second part makes the difference.

The second pard, KL Divergence, will not allow \(q_i\) to be very deterministic because if the variance of \(q_i\) is zero, the KL Divergence goes to infinity.

This reguralization force the structure to have some noize inside.