スチールウールの活動記録

初心者に向けて(私もだけど)電子工作やプログラミングや関連することをいろいろ。

ROS(hydro)でTurtleBotを動かしてみた

タートルボットのサンプルを動かして地図を作ってみたので、メモメモ。

サンプルのチュートリアルは↓

ja/Robots/TurtleBot - ROS Wiki

インストール & 設定

以下のコマンドを実行

sudo apt-get install ros-hydro-turtlebot ros-hydro-turtlebot-apps ros-hydro-turtlebot-viz ros-hydro-turtlebot-simulator ros-hydro-kobuki-ftdi

以下がbashrcに書いてなかったら実行

echo "source /opt/ros/hydro/setup.bash" >> ~/.bashrc

タートルボットを動かすための環境変数を追加する

echo export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311 >> .bashrc
echo export ROS_HOSTNAME=IP_OF_TURTLEBOT >> .bashrc

タートルボット起動

タートルボットとPCをUSBで繋ぎ、電源スイッチをONにする

以下を実行

roslaunch turtlebot_bringup minimal.launch

センサー情報をRvizで見てみる

以下を実行

roslaunch turtlebot_bringup 3dsensor.launch

うまく起動しなかったら以下を実行

export TURTLEBOT_BASE=create
export TURTLEBOT_STACKS=circles  
export TURTLEBOT_3D_SENSOR=kinect

rvizを起動

roslaunch turtlebot_rviz_launchers view_robot.launch

右にあるチェックボックスにチェックを入れれば情報が視覚化されると思います

自分でタートルボットを移動させる

3dsensor.launchを起動している場合、Ctrl-Cなどで止めてください

ジョイスティックを接続して、以下を実行 (どれでも多分動きます)

Playstation 3

roslaunch turtlebot_teleop ps3_teleop.launch

Xbox360 (use the left stick while keeping the right stick pressed in)

roslaunch turtlebot_teleop xbox360_teleop.launch

Logitech joysticks (general configuration for all logitech joysticks)

roslaunch turtlebot_teleop logitech_teleop.launch

地図作り

では、目的の地図の作り方を (といっても、難しいことは何もしませんが…)

gmappingのでもアプリの実行

roslaunch turtlebot_navigation gmapping_demo.launch

rvizの立ち上げ

roslaunch turtlebot_rviz_launchers view_navigation.launch

すると下のように2次元の地図を作ることができます

f:id:bhjkkk:20151016054210j:plain

向いている方向がわかりやすいようにオドメトリのトピックを表示しています

最後に地図を生成している動画を (ぶれぶれですが)

youtu.be

gmappingについてはとりあえず以下のサイトを…

www43.atwiki.jp

caffeのサンプルを動かす

techblog.yahoo.co.jp

qiita.com

この2つのサイトを見ながらサンプルだけ動かしてみた。

caffeのトップディレクトリにいる想定で進めていく。

サンプルをコマンドで持ってくる

wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
tar zxvf 101_ObjectCategories.tar.gz

モデルファイルを持ってくる

cd models/bvlc_reference_caffenet/
wget http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

get_ilsvrc_aux.shを実行する

cd ../../data/ilsvrc12
./get_ilsvrc_aux/sh

classify.pyを実行

cd ../../python
python classify.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg ../result.npy

上記でエラーが起きたら caffe/python/caffe/io.pyの253-254行目の

if ms != self.inputs[in_][1:]:
    raise ValueError('Mean shape incompatible with input shape.')

if ms != self.inputs[in_][1:]:
    print(self.inputs[in_])
    in_shape = self.inputs[in_][1:]
    m_min, m_max = mean.min(), mean.max()
    normal_mean = (mean - m_min) / (m_max - m_min)
    mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min
    #raise ValueError('Mean shape incompatible with input shape.')

と書き換える。

show_result.pyを書いて、実行する

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys, numpy

categories = numpy.loadtxt(sys.argv[1], str, delimiter="\t")
scores = numpy.load(sys.argv[2])
top_k = 3
prediction = zip(scores[0].tolist(), categories)
prediction.sort(cmp=lambda x, y: cmp(x[0], y[0]), reverse=True)
for rank, (score, name) in enumerate(prediction[:top_k], start=1):
    print('#%d | %s | %4.1f%%' % (rank, name, score * 100))

実行すれば分類結果が表示される。

めんどくさいのでスクリプト

#!/bin/sh
cd $CAFFE_DIRECTORY/python
if [ $# != 1 ]; then 
    echo "Argument error"
else
    python classify.py --raw_scale 255 $1 ./result.npy
    python show_result.py ../data/ilsvrc12/synset_words.txt result.npy $1
fi

caffeのインストール

Deep Learningを使えるCaffeをインストールする手順。

CUDAをインストール

sudo apt-get install nvidia-cuda-toolkit

BLASをインストール

sudo apt-get install libatlas-base-dev

その他をインストール

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

FORTRANのインストール

sudo apt-get install gfortran

Caffeをgitからクローン

git clone https://github.com/BVLC/caffe.git

Caffeのディレクトリに移動し、Makefile.config.exampleMakefile.configに名前を変更

cp Makefile.config.example Makefile.config

Makefile.configの中を書き換える

# CPU_ONLY := 1 → CPU_ONLY := 1
# CUSTOM_CXX := g++ → CUSTOM_CXX := g++-
CUDA_DIR := /usr/local/cuda → CUDA_DIR := /usr/lib/nvidia-cuda-toolkit

makeする

make all
make test
make runtest

pip, numpy, skimageなどを入れる

sudo apt-get install python-dev python-pip python-numpy python-skimage

pipを実行

sudo pip install -r ~/caffe/python/requirements.txt

makeする

make pycaffe

パスを通す

vi ~/.bashrc  
export PYTHONPATH=~/caffe/python/:$PYTHONPATH
source ~/.bashrc

最後に

python
import caffe

が成功すれば完了(なはず)

oh-my-zshのagnosterの文字化けについて

何もせずにoh-my-zshのテーマのagnosterを使うと、文字化けしてしまっている。

私の環境での解決策

vim-powerline patched fonts · GitHub

ここにアクセスして、

  • Inconsolata-dz-Powerline.otf
  • Menlo-Powerline.otf
  • mensch-Powerline.otf

の上記3つをダウンロードする。

ダウンロードした3つのファイルを~/.fontsの中にコピーする。

これで解決するはず。

追記

別に~/.fontsにいれなくても、ダブルクリックしてインストールをすれば文字化けしないみたいです。

Ubuntu 14.04 で RS485C-U を使う

このサイトを参考にしたら認識したのでメモとして。

hirooka.pro

/etc/modules

lp
rtc
ftdi_sio

/etc/rc.local

modprobe ftdi-sio echo "1115 0008" > /sys/bus/usb-serial/drivers/ftdi_sio/new_id

exit 0

これらを追記する

とりあえずメモ

最近忙しかったり、記事にすることがないとかで更新するのを忘れてた。

とりあえず自分用のメモ書き程度のことを。

 

gitでリモートにあるブランチをローカルに持ってくる

git checkout -b ブランチ名 リモートのブランチ名

これでリモートのブランチをローカルに持ってきてブランチ移動

 

これから少しずつ更新を頑張るようにしてみようかな

 

fgetsの改行コード

久しぶりに更新。書くことなさすぎてつらいね。

 

C言語の勉強していたらgets関数が危険と書かれてて、代わりにfgets関数を使おうみたいなことをこないだ見たので、使ってみることにした。

 

gets関数はgets(str)のようにして文字を入力できる関数。しかし、この関数の問題は入力された文字列が、strの配列のサイズを超えるとき、バッファオーバーランが起こって危険。

fgets関数ではfgets(str,len,stdin)(stdinはキーボードからの入力)の用に使う。gets関数との違いは引数に"len"があり、これによって格納する文字数を決められる。単純にその配列をフルに使いたいなら、fgets(str, sizeof str, stdin)とすればいい。

 

だけど、このfgets関数を使っていたわけだけども、問題が発生した。それは…

改行コードまで入ってしまうということ。

文字列を比較するのに、<string.h>の中にあるstrcmp関数を使っていたわけなんだけど、改行コードが入ってしまうためにstrcmp関数がうまく機能しない!仕方なくstrncmp関数を使っていたけども、それだと初めから指定した文字数まで一致してれば良くなるのでだめ(´ε`;)ウーン…

 

じゃあ、どうすればいいか…なら、改行コードを消そう!

でも消し方なんて知りません^^;

 

問題なのは最後に改行コードが入ってしまうこと…

 

ならば、改行コードの場所を見つけてその場所を書き換えればいける!

 

と、いうことで、<string.h>の中のstrchr関数を使います。この関数は文字列の後ろから指定した文字を探し、その場所のポインタを返すというもの。これを使い、後ろから改行コードを見つけ出し、その場所を '\0' で書き換えればおk。それを関数化すればできる。

 

そこで関数を作ってみた。(出来の悪いプログラムかもしれんが…)

char* strget(char* str, int len);

char* strget(char* str, int len){
    char *nlstr;
    fgets(str, len, stdin);
    nlstr = strchr(str, '\n');
    if (nlstr != NULL) *nlstr = '\0';

    return str;
}

 

これでいいんじゃないかな。strget(str,sizeof str); みたいに使える。

 

これで自分のやりたかったことはちゃんとできた。(ホントは引数を1つだけにしたかったけど(-_-;))

誰かもっといい方法あったら教えて下さいm(_ _)m