2016年11月13日日曜日

つくばチャレンジ2016




















つくばチャレンジに参加してきました!!
自分が初めて参加したのは2014年にTurtlebotというロボットを使ったときにになります。そのときは1人チームでしたが、今回は他のメンバーのROSのプログラミングをサポートしたり、プログラムのROS化をサポートしたり、ソフトウエアのバグや障害が発生したときに対処する係でした!。
今年の記録は110mでした!


つくばチャレンジとは
ロボットが町を歩ける技術を確立することを目的としたチャレンジです。
ロボットが人間と同じように、自律で公園を走行させ、横断歩道などを渡らせます。
2kmのコースをロボットに走行させます。

つくばチャレンジでは色々な研究者と技術交換ができます。自分のチームは学生だけでなく、NVIDIAやパーソナルモビリティの会社の技術者などとも交流しました。

つくばチャレンジが研究からベンチャーにつながっていくような流れになってきているのを今回感じました。

今回使ったロボット:UNiMO

UNiMO AI



UNiMOはUNiMO社が開発したおしゃれな電動車いすです!
http://newatlas.com/unimo-continuous-track-electric-wheelchair/29748/
駆動部にはクローラーが付いており、雪道・雨道・坂道も気にすることなく走破できます。充電無しで20km走破できます!
 
今回はUNiMOのジョイスティックの信号をArduinoで制御し、LAN通信でArduinoとPCを通信しました。
自律走行のための科学計算はノートPCを使用し、PCとArduinoを通信させて制御しました。
自律制御の安定化のために駆動制御部のArduinoでPID Controllerを実装しています。
なお、ロボットミドルウエアはROSを使用しています。

 
制御システム

測域センサ/ジャイロセンサ -> SLAMプログラム(gmapping) -> move_base関連の自作プログラム -> geometry_msgs/Twist -> Arduino PID Controller -> 駆動部



ROSとは


ROSは世界で最も使用されているロボットのミドルウエアです。
シリコンバレーのロボットベンチャーのWillow Garageが開発し、現在はオープンソースです。
ROSはパッケージシステム, microservicesを採用したプログラミングモデル, 高度なプログラム解析システムがあります。
ROSのコアシステムはTCP/IPとXML-RPCによる通信で実装されているので、通信をさせるプログラムさえ書けばどんなプログラミング言語でもROSプログラムとして使用することが可能です。ROSは主にC++とPythonでプログラミングします。

ROSでプログラミングするイメージとしてはROSはNode.jsのエコシステムに近いです。
(npmパッケージによるプログラムの再利用、Node.jsのモジュール = ROSのmicroservicesプログラミング(Pub/Subモデルとトピック通信) )
必要な部分だけをプログラミングして、他の部分は既存のパッケージを使用することによって高速にロボットソフトウエアを開発することができます。
バグ解析なども、プログラミングフローグラフ可視化(rqt_graph)、2次元グラフ可視化(rqt_plot)、3D可視化(rviz)、CUI可視化ツール(rostopic)、ロボット制御データの保存・再現(rosbag)機能などを使用してスピーディーに行うことができます。

SLAMとは
Octomap

ロボットの自律走行に重要な技術としてSLAM(Simultaneous Localization and Mapping)があります。
これはロボットが各種センサを使用して、ロボットが走行中に地図を作成し、そしてロボット自身が自己位置を推定する技術です。 自律走行自動車もSLAMを使っています。

なぜ「自己位置を測定」ではなく、「自己位置を推定」であるかというと、SLAMのアルゴリズムはほとんどが確率ベースだからです。
「地点Aである」ではなく、「地点Aである確率がX%, 地点Bである確率がY%, よって地点Aである確率が最も高いので地点Aと推定する」です。


gmapping


つくばチャレンジ2016で採用したUNiMOのSLAMアルゴリズムはgmapping + amclです。
gmapping+amclは2DのSLAMアルゴリズムで、ROSでSLAMを使うのにあたって最も利用するのが便利なSLAMパッケージです。

昨年のつくばチャレンジはOctomap + humanoid_navigation(簡単な3D自己位置推定アルゴリズム)でSLAMをしたのですが、humanoid_navigationプログラムを使用するにあたって今年のPCは使用するのに必要なRAMのメモリが足りず動かなかったため、2D SLAMのgmapping + amclになりました。(ROSのプログラムの構造上Octomapで生成されている地図のメモリを2回RAMに読み込む必要があるため) Octomapとhumanoid_navigationを両方nodelet化してnodelet_managerで管理すればメモリ容量的に3D SLAMができたかもしれません。
大体3D SLAMの方が正確な自己位置推定ができます。(ランドマークの特徴量が多いため) 

Autoware
Autoware

humanoid_navigationをするのに必要なRAMのメモリが足りなかったため、採用候補の一つに入った3D SLAMアルゴリズムがAutowareのndt_mapping + ndt_localizationでした。
Autowareは名古屋大学, 長崎大学と産総研が開発した自律走行自動車のための開発キットです。オープンソースです。自律走行に必要な制御が色々とそろっていて、GUIツールでプログラムを動作できるので初心者も簡単に使用できます。

自律走行自動車に興味のある方はAutowareを動かしてみると楽しいと思います。シミュレータ + rosbag付きです。自律自動車の会社であるZMPが一部Autowareのプログラムを採用しているらしいです。
https://github.com/CPFL/Autoware

そのndt_mapping + ndt_localizationを以前つくばで走行させたデータのrosbag(過去のロボットの動作を再現するROS用ツール)を動かして試したのですが、角のカーブで地図生成が発散して使いものにならなかったのでAutowareの採用は断念しました。走行する道に直線が多い場合はndt_mapping + ndt_localizationは利用できるかもしれません。

つくばチャレンジ2016




















つくばチャレンジに参加してきました!!
今年の記録は110mでした!
僕は他のメンバーのROSのプログラミングをサポートしたり、プログラムのROS化をサポートしたり、ソフトウエアのバグや障害が発生したときに対処する係でした!


つくばチャレンジとは
ロボットが町を歩ける技術を確立することを目的としたチャレンジです。
ロボットが人間と同じように、自律で公園を走行させ、横断歩道などを渡らせます。
2kmのコースをロボットに走行させます。


今回使ったロボット:UNiMO

UNiMO AI



UNiMO株式会社ナノオプトニクスエナジーが開発したおしゃれな電動車いすです!
http://newatlas.com/unimo-continuous-track-electric-wheelchair/29748/
駆動部にはキャタピラが付いており、雪道・雨道・坂道も気にすることなく走破できます。充電無しで20km走破できます!
 
今回はUNiMOのシリアルポートからUNiMOをArduinoで制御しました。
自律走行のための科学計算はノートPCを使用し、PCとArduinoを通信させて制御しました。
自律制御の安定化のために駆動制御部のArduinoでPID Controllerを実装しています。
なお、ロボットミドルウエアはROSを使用しています。

 
制御システム

測域センサ/ジャイロセンサ -> SLAMプログラム(gmapping) -> move_base関連の自作プログラム -> geometry_msgs/Twist -> Arduino PID Controller -> 駆動部



ROSとは


ROSは世界で最も使用されているロボットのミドルウエアです。
シリコンバレーのロボットベンチャーのWillow Garageが開発し、現在はオープンソースです。
ROSはパッケージシステム, microservicesを採用したプログラミングモデル, 高度なプログラム解析システムがあります。
ROSのコアシステムはTCP/IPとXML-RPCによる通信で実装されているので、通信をさせるプログラムさえ書けばどんなプログラミング言語でもROSプログラムとして使用することが可能です。ROSは主にC++とPythonでプログラミングします。

ROSでプログラミングするイメージとしてはROSはNode.jsのエコシステムに近いです。
(npmパッケージによるプログラムの再利用、Node.jsのモジュール = ROSのmicroservicesプログラミング(Pub/Subモデルとトピック通信) )
必要な部分だけをプログラミングして、他の部分は既存のパッケージを使用することによって高速にロボットソフトウエアを開発することができます。
バグ解析なども、プログラミングフローグラフ可視化(rqt_graph)、2次元グラフ可視化(rqt_plot)、3D可視化(rviz)、CUI可視化ツール(rostopic)、ロボット制御データの保存・再現(rosbag)機能などを使用してスピーディーに行うことができます。

SLAMとは
Octomap

ロボットの自律走行に重要な技術としてSLAM(Simultaneous Localization and Mapping)があります。
これはロボットが各種センサを使用して、ロボットが走行中に地図を作成し、そしてロボット自身が自己位置を推定する技術です。 自律走行自動車もSLAMを使っています。

なぜ「自己位置を測定」ではなく、「自己位置を推定」であるかというと、SLAMのアルゴリズムはほとんどが確率ベースだからです。
「地点Aである」ではなく、「地点Aである確率がX%, 地点Bである確率がY%, よって地点Aである確率が最も高いので地点Aと推定する」です。


gmapping


つくばチャレンジ2016で採用したUNiMOのSLAMアルゴリズムはgmapping + amclです。
gmapping+amclは2DのSLAMアルゴリズムで、ROSでSLAMを使うのにあたって最も利用するのが便利なSLAMパッケージです。

昨年のつくばチャレンジはOctomap + humanoid_navigation(簡単な3D自己位置推定アルゴリズム)でSLAMをしたのですが、humanoid_navigationプログラムを使用するにあたって今年のPCは使用するのに必要なRAMのメモリが足りず動かなかったため、2D SLAMのgmapping + amclになりました。(ROSのプログラムの構造上Octomapで生成されている地図のメモリを2回RAMに読み込む必要があるため) Octomapとhumanoid_navigationを両方nodelet化してnodelet_managerで管理すればメモリ容量的に3D SLAMができたかもしれません。
大体3D SLAMの方が正確な自己位置推定ができます。(ランドマークの特徴量が多いため) 

Autoware
Autoware

humanoid_navigationをするのに必要なRAMのメモリが足りなかったため、採用候補の一つに入った3D SLAMアルゴリズムがAutowareのndt_mapping + ndt_localizationでした。
Autowareは名古屋大学, 長崎大学と産総研が開発した自律走行自動車のための開発キットです。オープンソースです。自律走行に必要な制御が色々とそろっていて、GUIツールでプログラムを動作できるので初心者も簡単に使用できます。

自律走行自動車に興味のある方はAutowareを動かしてみると楽しいと思います。シミュレータ + rosbag付きです。自律自動車の会社であるZMPが一部Autowareのプログラムを採用しているらしいです。
https://github.com/CPFL/Autoware

そのndt_mapping + ndt_localizationを以前つくばで走行させたデータのrosbag(過去のロボットの動作を再現するROS用ツール)を動かして試したのですが、角のカーブで地図生成が発散して使いものにならなかったのでAutowareの採用は断念しました。走行する道に直線が多い場合はndt_mapping + ndt_localizationは利用できるかもしれません。

2016年10月26日水曜日

CODE BLUE 2016



CODE BLUE Tokyo2016の学生スタッフをしてきました!!

CODE BLUEは「世界トップクラスのセキュリティ専門家による日本発の情報セキュリティ国際会議」です。

1日目はスタッフ懇親会 & 会場設営、
2日目はフリーなので国内外のトップセキュリティ専門家による講演を聴講することができました。
3日目は学生スタッフとして活動。自分の担当は受付(通訳アシスタント)になりました。

CODE BLUEの開催日は2日間あるのですが、学生スタッフには1日は参加者と同様に講演などを自由に聴講させて頂けるなどの配慮があり、大変楽しかったです!

事前の打ち合わせで僕は英会話ができるということで、受付・通訳アシスタントの担当になりました。仕事内容としては今年初開催のCODE BLUEのハッカソン、コンテスト会場の受付です。コーヒー入れやお菓子の補充などが主な仕事でした。他にも、ハッカソンのBGMの設定(soundcloud)などをしました。peatixの方たちと一緒に受付業務をしました。

また、午後の休憩時間には、自動車のハッキングコンテストに参加しました。初めての自動車ハッキングがすごく楽しかったです!!

最後にはNetworking Partyがあります。お寿司等も振る舞われ、とても豪華です!僕は自動車ハッキングでとても仲良くなったフランス人のETASの企業の人たちと会話を楽しみました。

国際交流に関しては、学生でも技術があって、同じ研究テーマだったり、コンテストで仲良くなれば国籍関係なく楽しめます!

それでは、講演の内容やコンテスト内容についてです。

PowerShellの難読化


PowerShellスクリプトの難読化方法と難読化ツールについての講演を聞きました。
PowerShellとは
PowerShellは主にWindowsで使用される、.NET上で動くコマンドライン/シェルスクリプトです。オブジェクト指向のシェルスクリプトプログラミングができます。
 (Windowsだとコマンドラインはcmd、シェルスクリプトはbatchfileが結構有名だと思います。)
PowerShellが優れているところは、.NETベースのため、「.NETでできることはほぼPowerShellでできる」ようになることです。
これによって、3rd partyパッケージ無しでPowerShellのコマンドでネットワーク通信、XMLのパーシング、HTTPサーバー起動などが出来ます。bashより高機能です。
PowerShellはWindows Vistaからデフォルトでインストールされていて、また.NETもデフォルトでイン
ストールされている場合が多いです。
高機能なシェルを環境構築なしで使用できることが、大きな利点だと思います。

PowerShellとセキュリティ
PowerShell(スクリプト)は悪用するとcmd/batchfileと同じようにマルウエアのようなものや悪意のある動作をすることが可能です。

悪意のある動作を防ぐためには(セキュリティ対策)、その悪意のある動作を発動させるPowerShellコマンドを検知して防げば実現可能です。
PowerShellはほとんどの実行されたコマンドをロギングすることが可能で、これを利用することでPowerShellの悪意のあるコマンド検知ができるのではないかと思われます。

ここで、PowerShellのスクリプトを難読化することができれば、悪意のあるPowerShellスクリプトがシグネチャとして検知されないので、PowerShellの悪意のあるスクリプトに対するセキュリティ対策を突破することが可能です。
PowerShellの難読化は比較的簡単で、*-String cmdletsを使用して文字列置換/連結したり、コマンド引数をランダムに省略/省略しないことによって実現することが可能だそうです。

PowerShell難読化自動化ツール: https://github.com/danielbohannon/Invoke-Obfuscation

また、PowerShell Logに実行した悪意のあるコマンドを残さないためのテクニックなども発表していました。PowerShell Logに情報を残さなければ、PowerShell Logを活用したPowerShellのセキュリティソフトウエアを突破できます。
PowerShellの元となる.NETのSystem.Management.Automation.dllを直接叩いたりcmdからpowershellを引数指定で子プロセスとして実行することでPowerShell Logを残さずPowerShell Scriptを実行することができるそうです。

自動車のハッキング

自動車のハッキングに挑戦しました!!!
何とか全問解くことができ、景品のマグカップとタンブラーをゲット!!!

最近の自動車の仕組み

自動車にはエンジンを制御するためのコンピューターであるECUというものが最近の自動車には100個以上付いています。
前右の車輪を制御するためのECU, 前左の車輪を制御するためのECU, ステアリングのためのECUなど、ECUは自動車の制御のために色々な役割を持ちます。
自動車の制御は、このECU同士で通信しながら情報を共有してエンジンなどを制御することによって成り立っています。
そのための、ECU同士を通信させるためのネットワークが車載ネットワークです。

自動車のハッキング

車載ネットワーク、これが自動車のハッキングに最もつながるキーワードです。
車載ネットワーク上に、悪意のある情報をECUなどに送信することができれば、車の操縦を乗っ取ることができます。

車載ネットワークにはいくつか規格がありますが、標準規格になっているのがCANで、今回はCAN上で自動車のハッキング問題に挑戦しました。

今回はCANのパケット解析ツールを使って、自動車のハッキングに挑戦しました。
CANの上位プロトコルであるUDS(アプリケーション層)とISO-TP(トランスポート層(フロー制御付))のパケットを手作りして送信したり、UDS/ISO-TPのパケットを解析して問題を解きました。

1. パケットの重複を消去して、ID順にソートしてASCIIのデータ文字列を読んでフラグを見つける
2. フラグで指定されている通信のパケットを作ると、access denied errorを示す通信が帰ってきた
3. フラグで指定されている通信を通すには、認証を通す必要がある
4. seedとanswerが対応している過去の通信ログから、暗号化関数を導き出し(xor)、seed要求リクエストを送ってseed valueを手にいれ、アクセス解放リクエストとして計算したanswerをパケットとして送信
5. 管理者権限を取得(この時点で自動車のハッキングとしては完了)
6. フラグで指定されている通信のリスポンスが通信ストリームとして帰ってきた
7. 通信ストリームをpythonスクリプトで解析すると、1つのバイナリデータが出てきた
8. バイナリデータはPNG画像であることが判明し、ファイルを開くとQRコードが出てきた
9. QRコードを読み込むと、新たなフラグが出てきた
10. フラグで指定されているCAN上でのファイルアップロード・ファイルダウンロードをするためのパケットを作って送信すると、何かのバイナリデータを含む通信ストリームがかえってきた
11. pythonスクリプトでパケットを解析し、1つのバイナリデータにしたところ、ファイルフォーマットがPDFと判明
12. PDFを開いて自動車ハッキングのコンテストクリア!!!