ROSランチのお勉強
rosランチの復習
node
<launch> <node pkg="turtlesim" name="sim" type="turtlesim_node" output="screen" required="true" /> </launch>
include
他のランチファイルの立ち上げる時
<launch> <include file="$(find beginner_tutorials)/launch/turtlemimic.launch" /> </launch>
param
<launch> <param name="/background_r" type="int" value="255" /> <param name="/background_g" type="int" value="255" /> <param name="/background_b" type="int" value="0" /> </launch>
arg
<launch> <arg name="update_color" default="10" /> <param name="/background_r" value="$(arg update_color)" /> </launch>
実行時に以下のように変更することもできる ↓
$ roslaunch color.launch /background_r:=30
remap,group
<launch> <group ns="turtlesim1"> <node pkg="turtlesim" name="sim" type="turtlesim_node"/> <node pkg="turtlesim" name="teleop" type="turtle_teleop_key"/> </group> <group ns="turtlesim2"> <node pkg="turtlesim" name="sim" type="turtlesim_node"/> </group> <node pkg="turtlesim" name="mimic" type="mimic"> <remap from="input" to="turtlesim1/turtle1"/> <remap from="output" to="turtlesim2/turtle1"/> </node> </launch>
ROSパラムのお勉強
rosパラムの復習
利用可能なパラメータの表示
- set : パラメータを設定する
- get : パラメータを取得する
- load : ファイルからパラメータを取り込む
- dump : ファイルにパラメータを格納する
- delete : パラメータを削除する
- list : 使用可能なパラメータを表示する
list
$ rosparam list ros /background_b /background_g /background_r /rosdistro /roslaunch/uris/host_192_168_3_15__59236 /rosversion /run_id
get
$ rosparam get /background_b 255
すべてのパラメータを取得
$ rosparam get / background_b: 255 background_g: 86 background_r: 69
プログラム内では
vel_x = rospy.get_param('~vel_x',0.5)
global_name = rospy.get_param("/global_name") relative_name = rospy.get_param("relative_name") private_param = rospy.get_param('~private_name') default_param = rospy.get_param('default_param', 'default_value') # fetch a group (dictionary) of parameters gains = rospy.get_param('gains') p, i, d = gains['P'], gains['I'], gains['D']
set
$ rosparam set /hogehoge 100 $ rosparam get / background_b: 255 background_g: 86 background_r: 69 hogehoge: 100
delete
$ rosparam delete /hogehoge
launch
<param name="base_frame" value="base_link" /> <rosparam command="load" file="$(find rosparam)/example.yaml" /> <rosparam command="delete" param="my/param" />
参考:
ROSサービスのお勉強
rosサービスの復習
全サービスを調べる
$ rosservice list
あるノードが提供してるサービスを調べる
以下turtlesimを例に考える↓
$ rosndoe info turtlesim
あるサービスを提供するnodeを探したいとき
$ rosservice info /spawn
サービスの情報を調べる
アクティブになっているノードが提供している動的なインスタンスを扱うもの
$ rosservice info /spawn
サービスデータタイプの定義ファイルの中身などの静的な定義情報を扱うもの
$ rossrv show turtlesim/Spawn float32 x float32 y float32 theta string name --- string name
上はサービス要求
下はサービス応答
サービスの利用
$ rosservice call /spawn 2.0 2.0 0.0 Indigo
サービスの作成
サービスのmsgの作成
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv $ rossrv show beginner_tutorials/AddTwoInts int64 a int64 b --- int64 sum
上が入力、下が出力
package.xmlに以下を追加
<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend>
CMakeLists.txtに以下を追加
find_package(catkin REQUIRED COMPONENTS rospy std_msgs message_generation #add )
add_service_files( FILES AddTwoInts.srv )
generate_messages( DEPENDENCIES std_msgs )
サービスサーバーの作成
#!/usr/bin/env python from beginner_tutorials.srv import AddTwoInts from beginner_tutorials.srv import AddTwoIntsResponse import rospy def handle_add_two_ints(req): print "Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b)) return AddTwoIntsResponse(req.a + req.b) def add_two_ints_server(): rospy.init_node('add_two_ints_server') s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints) print "Ready to add two ints." rospy.spin() if __name__ == "__main__": add_two_ints_server()
サービスクライアントの作成
#!/usr/bin/env python import sys import rospy from beginner_tutorials.srv import AddTwoInts def add_two_ints_client(x, y): rospy.wait_for_service('add_two_ints') try: add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts) resp1 = add_two_ints(x, y) return resp1.sum except rospy.ServiceException, e: print "Service call failed: %s"%e def usage(): return "%s [x y]"%sys.argv[0] if __name__ == "__main__": if len(sys.argv) == 3: x = int(sys.argv[1]) y = int(sys.argv[2]) else: print usage() sys.exit(1) print "Requesting %s+%s"%(x, y) print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))
実行方法
$ rosrun beginner_tutorials add_two_ints_server.py $ rosrun beginner_tutorials add_two_ints_client.py 4 5 Requesting 4+5 4 + 5 = 9
もしくは
$ rosservice call /add_two_ints 4 5
rosserviceを使えばクライアントがなくても直接serviceが呼び出せる
参考: ja/ROS/Tutorials/WritingServiceClient(python) - ROS Wiki
テストを学ぼう(2)!~スローテスト問題~
スローテスト問題
スローテスト問題とは?
テストの実行に時間がかかること
ex: 全ユニットテストの実行に10分以上かかる etc…
対策
- 実行時間の短縮
- 実行環境の強化
- 並列で実行する
- 実行するものを絞り込む
実行時間の短縮方法
- テストデータの共有化(*)
- モックに置換
(*)共有フィクスチャ:フィクスチャを共有し再利用すること。しかし、独立性↓メンテナンス性↓
これらはテストコードを大きく変更するため、最終手段と考えよう
実行環境の強化
- 良いパソコンをゲットしよう笑
並列で実行する
- 複数のマシンで並列処理
- クラウドの仮想環境利用
テストケースが独立している場合に有効だが、後から分割は難しい…
実行するものを絞り込む
- テスト時間や重要度に応じてテスト頻度を調整する
ex: テスト時間のかかるものは一日一回
スローテストが発生するケース
- データべステスト(DBの初期化やコネクションの作成/開放はリソース消費大)
- 通信処理が伴うテスト(ネットワークの状態に依存しやすい)
- GUIを伴うテスト(アプリケーションの起動や画面のレンダリングなど負荷大)
これらを分類(カテゴリ化)して、実行不可を下げたいときは別々に実行できるようにしよう
【参考】
Deep Learningの環境構築(Ubuntu14.04+GTX 950M+CUDA+cuDNN)
これから過酷な戦いが始まる…
ノートパソコンにDeep Learningの環境をつくってみる.
PC環境
目標
Nvidia Driver
悪名高き?ドライバnouveau
nouveauをブラックリストに入れないとNvidiaのドライバが正しくインストールできない可能性がある
参考: UbuntuにCUDAを入れようとしたらハマった - Qiita
Nvidia Driverのインストール
sudo ./NVIDIA-Linux-x86_64-367.44.run --no-opengl-files
参考: NVIDIAドライバダウンロード Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話 - Qiita https://devtalk.nvidia.com/default/topic/878117/-solved-titan-x-for-cuda-7-5-login-loop-error-ubuntu-14-04-/
nvidia-smiについて
GPUの設定等が見れる
参考:nvidia-smiコマンドの詳細ついて - Qiita nvidia-smi: Control Your GPUs | Microway
CUDA
CUDA対応GPU
CUDAのドライバ
CUDA Toolkit Archive | NVIDIA Developer
CUDAのインストール方法
- CUDA driverのrunファイルをダウンロード
- 以下の参考の方法でインストール
sudo ./cuda_7.5.18_linux.run --silent --no-opengl-libs --toolkit
参考: Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話 - Qiita https://devtalk.nvidia.com/default/topic/878117/-solved-titan-x-for-cuda-7-5-login-loop-error-ubuntu-14-04-/
CUDA環境変数設定
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_ PATH' >> ~/.bashrc echo 'export CUDA_PATH=/usr/local/cuda' >> ~/.bashrc source ~/.bashrc
CUDAのバージョン確認方法
nvcc -V
Tips1: wgetとは
wget (URL)
URLはリンクを右クリックしてコピーしたもの
参考:wget コマンド | コマンドの使い方(Linux) | hydroculのメモ NVIDIA Driverおよび CUDA のインストール - Qiita
Tips2: PPAとは
参考:Proprietary GPU Drivers : “Graphics Drivers” team UbuntuのPPAて何? [Linuxの使い方] All About Personal Package Archives : Ubuntu
CUDAインストール参考資料
http://developer.download.nvidia.com/compute/cuda/7_0/Prod/doc/CUDA_Getting_Started_Linux.pdf
Installation Guide Linux :: CUDA Toolkit Documentation
UbuntuにNvidia GPUのDriver + CUDAをInstallする(GTX1080対応版) - Qiita
Pascal世代GPUでのUbuntu14.04へのCUDAインストール - はぐれ大学院生つれづれ
NVIDIA Driverおよび CUDA のインストール - Qiita
cuDNN
cuDNNのダウンロード
ダウンロードするには登録が必要
https://developer.nvidia.com/rdp/cudnn-download
ファイルをコピー
tar xvfz cudnn-<version>.tgz sudo cp cuda/include/cudnn.h /usr/local/cuda/include sudo cp cuda/lib64/* /usr/local/cuda/lib64
Chainer
Chainerのインストール方法
pip install chainer
うまく行かない時は
Releases · chainer/chainer · GitHub
から落としてきて
python setup.py install
アップグレードの方法
pip install -U chainer
ChainerでGPUを使う方法
- Variableオブジェクトをcupyから作る
- モデル設定後以下の2つを追加
xp = cuda.cupy
cuda.get_device(0).use() model.to_gpu()
Chainerのサンプルダウンロード
$ git clone [https://github.com/pfnet/chainer:title]
GPUのパフォーマンス確認
上記サンプルの実行
CPU only (core i7)
$ time python train_mnist.py
real 16m27.166s
user 16m26.425s
sys 0m0.168s
$ time python train_mnist.py -g 0
real 3m12.369s
user 2m50.749s
sys 0m5.305s
GPUを使用すると5倍くらいの速度が出る
chainerのバージョン確認方法
chainerの参考資料
Chainer: A flexible framework for neural networks
Ohmsha 書籍連動/ダウンロードサービス『Chainerによる実践深層学習』 これのiris0.py , iris1.py , iris3.py が概要をつかむのに良いかも。
DeepLearningライブラリのChainerがすごい、らしい - cvl-robot's diary
Qiita_Contents/chainer-MNIST_forPubs.ipynb at master · matsuken92/Qiita_Contents · GitHub
Chainerで3層パーセプトロンの誤差逆伝播を実装してみた - TadaoYamaokaの日記
DeepLearning系ライブラリ、Kerasがあまりにも便利だったので使い方メモ - プロクラシスト
chainerで点が円に内包されているか判定してみた ~~入門~~ - gasin’s blog
Chainerでニューラルネットワーク及び畳み込みニューラルネットワークを実装してみた – データ分析エンジニアが気まぐれに更新するブログ
Deep Learningを使っていろいろ試してみたい♪
Ubuntuのお勉強1~フォルダ構成~
問題が起こった時にログから問題を特定できるようになりたい
/sys、/tmp、/usr、/varについて
参考: Ubuntu システムログ その1 - /var/log以下に生成されるログファイルについて・ カーネルログについて・カーネルリングバッファーログについて - kledgeb
/var/logについて
参考:Ubuntu システムログ その1 - /var/log以下に生成されるログファイルについて・ カーネルログについて・カーネルリングバッファーログについて - kledgeb
/var/log/syslogについて
/var/log/auth.log
グラフィック関係のログ
参考:Ubuntu システムログ その2 - 認証ログについて・ Xサーバーログについて - kledgeb
参考
人力ヘリコプターについて
大好きな空飛ぶ自転車のお話
シコルスキー賞
アメリカ・ヘリコプター協会が1980年に設立した賞で賞金2500万円。
受賞基準が以下の三点
- 人力で60秒間
- 10フィート(約3メートル)以上の高度を維持
- 1076平方フィート(約100平方メートル)以内の範囲を飛行
30年以上受賞者が現れなかったが、2013年に、カナダのトロント大学のチームが受賞
参考: シコルスキー人力ヘリコプター賞 - Wikipedia
人力ヘリコプター
ダビンチ3
- 1989年
- 機体を44kg
- ブレード長は15.24 m
- 回転速度は毎秒15.24 m
YURI-I
- 1994年
- 日本製
- 4枚のローターを地面効果を利用するために、低い位置に配置
GameraⅡ
Atlas
- 2013年
- 58m
- 52kg
- 滞空時間64.11秒
- 最高高度3.3m
参考:全幅58mの人力ヘリコプターAtlas、33年間未踏のシコルスキー賞を獲得 (動画) - Engadget 日本版
乗ってみたい
あ〜空飛びたい