空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

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パラムの復習

利用可能なパラメータの表示

  1. set : パラメータを設定する
  2. get : パラメータを取得する
  3. load : ファイルからパラメータを取り込む
  4. dump : ファイルにパラメータを格納する
  5. delete : パラメータを削除する
  6. 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" />

参考:

rosparamの使い方メモ - Qiita

rospy/Overview/Parameter Server - ROS Wiki

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…

対策

  1. 実行時間の短縮
  2. 実行環境の強化
  3. 並列で実行する
  4. 実行するものを絞り込む
実行時間の短縮方法
  1. テストデータの共有化(*)
  2. モックに置換

(*)共有フィクスチャ:フィクスチャを共有し再利用すること。しかし、独立性↓メンテナンス性↓

これらはテストコードを大きく変更するため、最終手段と考えよう

実行環境の強化
  1. 良いパソコンをゲットしよう笑
並列で実行する
  1. 複数のマシンで並列処理
  2. クラウドの仮想環境利用

テストケースが独立している場合に有効だが、後から分割は難しい…

実行するものを絞り込む
  1. テスト時間や重要度に応じてテスト頻度を調整する

ex: テスト時間のかかるものは一日一回

スローテストが発生するケース

  1. データべステスト(DBの初期化やコネクションの作成/開放はリソース消費大)
  2. 通信処理が伴うテスト(ネットワークの状態に依存しやすい)
  3. GUIを伴うテスト(アプリケーションの起動や画面のレンダリングなど負荷大)

これらを分類(カテゴリ化)して、実行不可を下げたいときは別々に実行できるようにしよう

【参考】

[Python] 初中級者のためのpytest入門 - くろのて

Deep Learningの環境構築(Ubuntu14.04+GTX 950M+CUDA+cuDNN)

これから過酷な戦いが始まる…

ノートパソコンにDeep Learningの環境をつくってみる.

PC環境

目標

  1. Nvidia driver
  2. CUDA
  3. cuDNN
  4. chainer のインストー

Nvidia Driver

悪名高き?ドライバnouveau

nouveauをブラックリストに入れないとNvidiaのドライバが正しくインストールできない可能性がある

参考: UbuntuにCUDAを入れようとしたらハマった - Qiita

Nvidia Driverのインストー

  1. GPUにあったDriverをインストー
  2. 以下の参考の方法でインストー
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 GPUs | NVIDIA Developer

CUDAのドライバ

CUDA Toolkit Archive | NVIDIA Developer

CUDAのインストール方法

  1. CUDA driverのrunファイルをダウンロード
  2. 以下の参考の方法でインストー
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インストール - はぐれ大学院生つれづれ

098.wgetコマンド URLでファイルをダウンロードする LinuxコマンドLinuxコマンドU-Zネットワーク管理コマンド:UNIX/Linuxコマンド Topics Linux初心者のためのサイト

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を使う方法

  1. Variableオブジェクトをcupyから作る
  2. モデル設定後以下の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

GPU (GeForce 950M)

$ time python train_mnist.py -g 0

real 3m12.369s

user 2m50.749s

sys 0m5.305s

GPUを使用すると5倍くらいの速度が出る

chainerのバージョン確認方法

【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について

参考:Linuxサーバ運用マニュアル

/var/log/auth.log

グラフィック関係のログ

参考:Ubuntu システムログ その2 - 認証ログについて・ Xサーバーログについて - kledgeb

参考

kledgeb: フォルダー構造

人力ヘリコプターについて

大好きな空飛ぶ自転車のお話

シコルスキー賞

アメリカ・ヘリコプター協会が1980年に設立した賞で賞金2500万円。

受賞基準が以下の三点

  1. 人力で60秒間
  2. 10フィート(約3メートル)以上の高度を維持
  3. 1076平方フィート(約100平方メートル)以内の範囲を飛行

30年以上受賞者が現れなかったが、2013年に、カナダのトロント大学のチームが受賞

参考: シコルスキー人力ヘリコプター賞 - Wikipedia

人力ヘリコプター

ダビンチ3

  • 1989年
  • 機体を44kg
  • ブレード長は15.24 m
  • 回転速度は毎秒15.24 m

www.youtube.com

YURI-I

  • 1994年
  • 日本製
  • 4枚のローターを地面効果を利用するために、低い位置に配置

www.youtube.com

GameraⅡ

参考: 人力ヘリコプターGameraについて

Atlas

  • 2013年
  • 58m
  • 52kg
  • 滞空時間64.11秒
  • 最高高度3.3m

参考:全幅58mの人力ヘリコプターAtlas、33年間未踏のシコルスキー賞を獲得 (動画) - Engadget 日本版

youtu.be

乗ってみたい

あ〜空飛びたい