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

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

makeの理解

makefile

all: install.hoge

install.hoge:

  wget 〜

  touch install.hoge

参考:

トリビアなmakefile入門

shin.hateblo.jp

automake

./configure;make;make installにはどんな意味がある? - ITmedia エンタープライズ

Linuxコマンド集 - 【configure】Makefileを生成する:ITpro

自分でソフトウェアをビルド・インストールするときに/usrや/usr/localへインストールしない - Qiita

debパッケージ作成方法をステップバイステップでまとめました

autoconf and automake

md5

ダウンロードしたファイルが正常かどうかをチェックする方法 | アットマークテクノ ユーザーズサイト

deb

独自のDebパッケージやaptリポジトリを作ってみよう | OSDN Magazine

debパッケージ作成方法をステップバイステップでまとめました

debパッケージ作成方法をステップバイステップでまとめました

Linuxのお勉強

プロンプト

[robonchu@localhost~]$

ユーザ名 ホスト名

コマンドラインの編集

コマンド 内容
Ctrl+b 1back
Ctrl+f 1go
Ctrl+a text first
Ctrl+e text end
Ctrl+h 1back delete
Ctrl+k cut from text first to end
Ctrl+u cut from text end to first
Ctrl+y yank

コマンド履歴

コマンド 内容
Ctrl+p 1back command
Ctrl+n 1go command
Ctrl+r search back command
Ctrl+r ↑search back command next
Enter ↑search back command execute
Ctrl+g ↑search back command end

文字コード変更

iconv -f EUC-JP -t UTF-8

ファイルとディレクト

コマンド 内容
pwd current directory display
ls -l detail
ls -a all
ls -F file type
mkdir [dir name] make dir
mkdir -p [dir name] / [dir name] / [dir name] ↑search back command end
touch [file name] create file
rm [file name] delete file
rm -r [dir name] delete dir
rm -i [file name] check delete
cat [file name] display file
cat -n [file name] display file with num
less [file name] display file & can scroll
space ↑ down scroll
b ↑ up scroll
q ↑ exit
\ [word] ↑ search down
? [word] ↑ search up
n ↑↑ next
N ↑↑ pre
cp [file name] [file name] copy file
cp -r [dir name] [dir name] copy dir
mv [file name] [file name] file name change
mv [file name] [dir name] file location change
ln -s [file name] [file or dir name] symbolic link

探す

コマンド 内容
find [start dir] [search type] [action] find location (ex: find . -name test.txt a -type f -print)
updatedb & locate [file name] find location
locate -b [file name] find file name only location

調べる

コマンド 内容
[command] –help display how to use command
man [command] mannual display
man -k [key word] find man including keyword (ex: man -k copy)
which [command] find command path

bashの設定

コマンド 内容
alias [new command name]=‘[command name]’ new name touch
type [command] check origin or alias

シェル変数と環境変数

コマンド 内容
printenv display env
env display env
export [env name]=[setting name] set env

パーミッション

ls -l [dir]
-rrrwwwxxx. ~

-:通常ファイル , d:ディレクトリ , l:シンボリックリンク

rrr(read): オーナー

www(write): グループ

xxx(execute): その他

に対するパーミッション

qiita.com

コマンド 内容
chmod [ex: u+x] or [ex: 777] file mode chane
su - [user name] init env & user switch
su [user name] keep env & user switch
sudo -u [user name] [command] execute command on user name

プロセスとジョブ

コマンド 内容
ps aux display process detail
Ctrl + z stop job
jobs -l display jobs with PID
fg %[job num] to for ground
bg %[job num] to back ground
kill %[job num] kill job
kill [PID] kill process
kill -KILL [PID] kill process

フィルタ

コマンド 内容
head -n [num] display file top
tail -n [num] display file end
grep [pattern] [file name] pick up word
ws output line num

テキスト処理

コマンド 内容
diff [origin file] [file] display diff
diff -u [origin file] [file] display diff on unified format
diff -ur [origin dir] [dir] display diff on unified format

アーカイブと圧縮

コマンド 内容
tar czf [file name].tar.gz [file name] tar + gz make
tar xzf [file name].tar.gz tar + gz open

パッケージ

コマンド 内容
sudo apt-get install [pkg name] install pkg
sudo apt-get remove [pkg name] remove pkg
sudo apt-get purge [pkg name] remove pkg with setting
sudo apt-cache search (–name-only) [key word] search pkg
sudo apt-cache policy [pkg name] display version

リモート

コマンド 内容
ssh [username]@[IP or name] remote login

ダウンロード

コマンド 内容
wget [URL] download file

その他のコマンド

コマンド 内容
du [file or dir] display file size

参考:

シェルにおけるシングルクォート、ダブルクォート、バッククォートで囲った場合の挙動の違い

`apt-get install`するまえに`apt-cache` でバージョンを調べる方法 - Qiita

音声認識のいろいろ

N-gram

N-gramモデルを利用したテキスト分析 ―インデックスページ―

第5回 N-gramのしくみ:検索エンジンを作る|gihyo.jp … 技術評論社

形態素解析

第6回 N-gramと形態素解析との比較:検索エンジンを作る|gihyo.jp … 技術評論社

Ngram(N-gram)とは何か & 形態素解析との比較

ツール

MeCab - 日本語形態素解析システム

MeCab (和布蕪-めかぶ)を使ってみる

Python3で形態素解析エンジンMeCabを使えるようにする(2016年3月版) - Qiita

音源定位

HARK をインストールする - Qiita

MainPage - HARK Wiki - Open Source Robot Audition Software

HARK Document Version 2.3.0. (Revision: 8561)

HARK クックブック

dnn

Deep Learningと音声認識 | Preferred Research

deep learning

はじめるDeep learning - Qiita

OpenJTalk

Open JTalkで音声合成 - 人工知能に関する断創録

OpenJTalkを使ってみる。

Ubuntu 14.04+julius+OpenJTalkで音声アシスタントを作ろうとした素人がハマった点と解決方法 - Qiita

パラチュン用dynamic_reconfigureの使い方

dynamic_reconfigureの使い方

  • Tutorial.cfgファイルの作成
#!/usr/bin/env python
PACKAGE = "dynamic_tutorials" # package name

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()

gen.add("int_param", int_t, 0, "An Integer parameter", 50, 0, 100) # name , type , level ,description , default ,min ,max
gen.add("double_param", double_t, 0, "A double parameter", .5, 0, 1)
gen.add("str_param", str_t, 0, "A string parameter", "Hello World")
gen.add("bool_param", bool_t, 0, "A Boolean parameter", True)

size_enum = gen.enum([ gen.const("Small", int_t, 0, "A small constant"),
                  gen.const("Medium", int_t, 1, "A medium constant"),
                  gen.const("Large", int_t, 2, "A large constant"),
                  gen.const("ExtraLarge", int_t, 3, "An extra large constant") ],
                  "An enum to set size")

gen.add("size", int_t, 0, "A size parameter which is edited via an enum", 1, 0, 3, edit_method=size_enum)

exit(gen.generate(PACKAGE, "dynamic_tutorials", "Tutorials")) # 2:package_name 3:cfg_file_name
  • 実行可能な状態に
chmod a+x cfg/Tutorials.cfg
  • CmakeLists.txtに以下を追加
#add dynamic reconfigure api
find_package(catkin REQUIRED dynamic_reconfigure)
generate_dynamic_reconfigure_options(relative_path_to_file1 relative_path_to_file2 ...)
# make sure configure headers are build before node using them
add_dependencies(example_node dynamic_tutorials_gencfg) 
  • package.xmlにもgenerate_dynamic_reconfigureを追記

nodeの作り方

python

#!/usr/bin/env python

import rospy

from dynamic_reconfigure.server import Server
from dynamic_tutorials.cfg import TutorialsConfig

def callback(config, level):
    rospy.loginfo("""Reconfigure Request: {int_param}, {double_param},\ 
          {str_param}, {bool_param}, {size}""".format(**config))
    return config

if __name__ == "__main__":
    rospy.init_node("dynamic_tutorials", anonymous = True)

    srv = Server(TutorialsConfig, callback)
    rospy.spin()

参考

# ディクショナリで指定する場合はアンパックすればよい
>>> d = {"name": "John", "age": 20}
>>> "My name is {name}. I'm {age} years old.".format(**d) #アンパックしてキーワード引数に
"My name is John. I'm 20 years old."
  • configは辞書?
dict = {"yamada":75, "endou":82}
value =  dict["yamada"]

C++

#include <ros/ros.h>

#include <dynamic_reconfigure/server.h>
#include <dynamic_tutorials/TutorialsConfig.h>

void callback(dynamic_tutorials::TutorialsConfig &config, uint32_t level) {
  ROS_INFO("Reconfigure Request: %d %f %s %s %d", 
            config.int_param, config.double_param, 
            config.str_param.c_str(), 
            config.bool_param?"True":"False", 
            config.size);
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "dynamic_tutorials");

  dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig> server;
  dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig>::CallbackType f;

  f = boost::bind(&callback, _1, _2);
  server.setCallback(f);

  ROS_INFO("Spinning node");
  ros::spin();
  return 0;
}
  • 実行
$ rosrun rqt_reconfigure rqt_reconfigure

参考

ja/dynamic_reconfigure/Tutorials/HowToWriteYourFirstCfgFile - ROS Wiki

qiita.com

catkin_make徹底理解

catkinワークスペース

STEP1

  1. ROS_PACKAGE_PATHの確認、設定
  2. $ mkdir ~/test_catkin_ws/src
  3. $ cd ~/test_catkin_ws/src
  4. $ catkin_init_workspace

ここで、~/test_catkin_ws/src にCMakeKist.txtが作成される

STEP2

  1. cd ~/test_catkin_ws
  2. catkin_make

ここで、buildとdevelができる

  • buildとは

    • catkinパッケージを構成するためにCMakeを呼び出し、さまざまな処理を行う場所でビルドスペースと呼ばれる
  • develとは

    • 生成される目的コードをインストールする前に作業を行うスペースであり、開発スペースと呼ばれる

develや/opt/ros/indigoの中に設定ファイル.bashがある

  • /opt/ros/indigo設定読み込み

    • コアパッケージへのパスが反映
  • devel設定読み込み

パッケージ作成

ROSパッケージをビルドするには

  1. CMakeList.txt
  2. package.xml

が必要

$ catkin_create_pkg <package_name> [depend1] [depend2] ...
ex: catkin_create_pkg test_package roscpp rospy std_msgs

こうすることで、依存関係がpackage.xmlに追加される

  • 同じパッケージがある場合は$ROS_PACKAGE_PATHに記載の順番で呼ばれる

コードの変更、修正時

  1. package.xml
  2. CMakeLists.txt

を修正

package.xml

  • 現在のパッケージの名前や、ほかのパッケージとの依存関係、コンパイル時のフラグなどの基本情報が定義

  • 大事なタグ

<build_depend>
現在のパッケージをインストールする前に、先にインストールする必要のあるパッケージの名前を指定する
<run_depend>
現在のパッケージを実行する際に必要とするほかのパッケージの名前や現在のパッケージが依存するランタイムライブラリ名などを指定する
<test_depend>
現在のパッケージの機能テストを行う際に依存するパッケージ名を指定する
<buildtool_depend>
現在のパッケージを構築する際に使用されるシステムツールを指定する
一般的にはcatkin
<export>
現在のパッケージをコンパイルする際に必要となるフラグやヘッダファイル、ライブラリなどのパス情報を指定する

CMakeLists.txt

  • CMakeビルドシステムに使われる設定ファイル
  • このファイルの中にはターゲットを生成する際に必要なツールや関連するライブラリおよび生成方法などを記述する。CMakeでビルドするときに、このファイルを参照してターゲットを生成する

記述する内容

  1. . 関連するほかのcatkinパッケージ名

    ex: find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs)
    
  2. . メッセージ・サービス・アクションジェネレータ

    ex: add_message_files(
        FILE Message1.msg)
    
  3. . メッセージ・サービス・アクションのデータタイプの生成

    ex: generate_message(DEPENDENCIES std_msgs)
    
  4. . パッケージの構築情報

    ex: catkin_package(~)
    
  5. . 構築するターゲットの指定

    ex: add_executable(~)
    
  6. . インストール方法

    ex: install(~)
    
  7. . テスト項目

    ex: catkin_add_gtest(~)
    
  8. . メタパッケージの記述

単一のパッケージのみビルドしたい場合

catkin_make --pkg <package name>

myenigma.hatenablog.com

ROSを勉強している方々のブログまとめ

お世話になっております。

大感謝。全部目を通したい。

rosとは

参考

ROSの概念

[ROSロボットプログラミング] ROSで使われる専門用語 - Qiita

わかりやすいチュートリアル

ROS Tutorials — ROS Tutorials 0.5.1 documentation

ブログまとめ

ros-robot.blogspot.jp

myenigma.hatenablog.com

karaage.hatenadiary.jp

www.youtalk.jp

BRILLIANTSERVICE TECHNICAL BLOG: ROS

cryborg.hatenablog.com

crafty-as-a-fox.tumblr.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

ロボットとお話しよう2(音声でラジコン操作)

robonchu.hatenablog.com

の続き

[Raspberry Pi]USBマイクと音声認識ソフトJuliusを使って音声認識を試す(2) : 工作と競馬

[Raspberry Pi]USBマイクと音声認識ソフトJuliusを使って音声認識を試す(3) ~ フルカラーLEDを音声で操作 ~ : 工作と競馬

をとても参考にさせていただきました。 感謝です。

目標

声を使ってラジコンを操作

準備

dictation-kit-v4.3.1-linuxからmodelファイルをコピーしてこれから作業するフォルダにおく

手順

  1. teleop.dic(utf-8で作成)ファイルの作成
    右   m i g i
    左   h i d a r i
    前   m a e
    後ろ    u sh i r o
    停止    t e i sh i
    
  2. juliusの設定ファイルのteleop.jconfの作成
    -w teleop.dic       #単語辞書ファイル
    #-v model/lang_m/bccwj.60k.htkdic  #N-gram、または文法用の単語辞書ファイルを指定$
    -h model/phone_m/jnas-tri-3k16-gid.binhmm #使用するHMM定義ファイル
    -hlist model/phone_m/logicalTri   #HMMlistファイルを指定する
    -n 5        #n個の文仮説数が見つかるまで検索を行う
    -output 1     #見つかったN-best候補のうち、結果として出力する個数
    -input mic #-demo     #マイク使用
    -zmeanframe
    -rejectshort 600  #検出された入力が閾値以下なら棄却
    #-charconv euc-jp utf8 #入出力エンコード指定(内部euc-jp, 出力utf-8)
    -lv 1000    #入力の振幅レベルの閾値(0~32767)
    
  3. juliusを起動するシェルスクリプトrun_teleop.shの作成
    #! /bin/sh
    export ALSADEV=“plughw:1,0”
    julius -C teleop.jconf -demo -input alsa -nostrip -module > /dev/null &
    echo $!
    sleep 3
    
  4. juliusから送られるコマンドを受け取りarduinoに送る

以下com_julius_arduino.pyを作成。 これを実行すると音声入力に対し、cmd_velがpubされる。

#!/usr/bin/python
# coding:utf-8

import rospy
from sensor_msgs.msg import Joy
from geometry_msgs.msg import Twist

import socket
import subprocess
import xml.etree.ElementTree as ET
 
HOST = "localhost"
PORT = 10500

teleop_cmd = [
    u"右" , \
    u"左" , \
    u"前" , \
    u"後ろ" , \
    u"停止" 
    ]

class RosSet(object):
    def __init__(self):
        rospy.init_node('voice_twist')
        self.twist_pub = rospy.Publisher('cmd_vel', Twist, queue_size=100)
        self.twist = Twist() 

    def sendCmd(self, cmdName):
        if cmdName==u"前":
            self.twist.linear.x = 10
            self.twist.angular.z = 0
        elif cmdName==u"後ろ":
            self.twist.linear.x = -10
            self.twist.angular.z = 0
        elif cmdName==u"右":
            self.twist.linear.x = 0
            self.twist.angular.z = -10
        elif cmdName==u"左":
            self.twist.linear.x = 0
            self.twist.angular.z = 10
        elif cmdName==u"停止":
            self.twist.linear.x = 0
            self.twist.angular.z = 0 
        rospy.loginfo(self.twist)
        self.twist_pub.publish(self.twist)

def main():
    rosset = RosSet()
    p = subprocess.Popen(["sh run_teleop.sh"], stdout=subprocess.PIPE, shell=True)
    pid = p.stdout.read() # juliusのプロセスIDを取得
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((HOST, PORT))
    try:
        data = ""
        while 1:
            if "</RECOGOUT>\n." in data:
                root = ET.fromstring('<?xml version="1.0"?>\n' + data[data.find("<RECOGOUT>"):].replace("\n.", ""))
                for whypo in root.findall("./SHYPO/WHYPO"):
                    if whypo.get("WORD") in teleop_cmd:
                        # 判別した言葉を表示する
                        print whypo.get("WORD")
                        rosset.sendCmd(whypo.get("WORD"))
                    else:
                        print "Unknown"
                data = ""
            else:
                try:
                    data = data + client.recv(1024)
                except:
                    print "ps kill."
                    p.kill() #
                    subprocess.call(["kill " + pid], shell=True) 
                    client.close()
                    break
    
    except KeyboardInterrupt:
        print "KeyboardInterrupt occured."
        p.kill() #
        subprocess.call(["kill " + pid], shell=True)
        client.close()
   
if __name__ == "__main__":
    main()

参考:

www.feijoa.jp