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

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

RPLIDAR A1をROSで動かしてみる

f:id:robonchu:20180915082912p:plain

やりたいこと

低価格Lidar RPLIDAR A1を授かったので、ROSで動かしてみる

教科書

実行手順

びっくりするくらいシンプル。素晴らしい。

  1. git clone https://github.com/Slamtec/rplidar_ros.git

  2. catkin_make

  3. source devel/setup.bash

  4. ポートに権限付与

    1. ls -l /dev | grep ttyUSB

    2. sudo chmod 666 /dev/ttyUSB0

  5. roslaunch rplidar_ros view_rplidar.launch

このlaunchを立ち上げると、こんな感じ ↓

f:id:robonchu:20180915091225p:plain

ノードだけ立ち上げるときは

  1. roslaunch rplidar_ros rplidar.launch

出力されているTopicは

  • scan (sensor_msgs/LaserScan) : it publishes scan topic from the laser.

How to install rplidar to your robot

rplidar rotate with clockwise direction . The first range come from the front ( the tail with the line).

f:id:robonchu:20180915091416p:plain

所感

とてもシンプル!ありがたい!!

次はルンバで自律移動にチャレンジ。どのSLAMの手法を使おう!?

gmappingかKarto SLAMがよさげかな。。。

参考 :

GPD pocketにUbuntu16.04 & ROS install

f:id:robonchu:20180912232540p:plain

超小型でなかなかスペックが良い♪

やりたいこと

Windows10が入っているGPDにUbuntu16.04とROSをインストール。

ざっくりまとめ。

Ubuntuインストールのための準備

以下はすべてGPD上で実施

  1. BIOSの変更

    1. 2017/06/28版のZipファイルをGPD Pocket/BIOS - GPD Wikiから取得。2017/06/28版でないとUbuntuは動かないらしい。

    2. Zipを解答し、update_win.batをGPD上で管理者権限で実行。詳細は以下を参考。

    3. msinfoでBIOSバージョンが正しくかわっているか確認。

  2. ISOファイルのダウンロード

    1. 第3版 ubuntu-16.04.1-desktop-amd_0809_2.iso をGPD Pocket/OS/Ubuntu - GPD Wikiから取得
  3. UltraISOのインストール

    1. ダウンロード UltraISO 9.7.1.3519 日本語 – Vessoft
  4. 2017/06/28版のZip内のUbuntu安装说明.pdfGoogle翻訳のファイルから翻訳を利用して翻訳しておく

ISOイメージの作り方

Ubuntu安装说明.pdfを参考。中国語なので、Google翻訳したものを見るとわかりやすい。

  1. ブート用USBをさす。

  2. UltraISOを開き、ファイルを開くからISOファイルを選択、読み込み。

  3. 上部タブのブートを選択し、イメージの書き込みをクリック。

  4. 書き込み設定がUSB-HDD+になっていることを確認し、USBに書き込み実行。

Ubuntuのインストール

  1. ブータブルUSBをさして、再起動し、Fn + F7を複数回打ち込む。

  2. f:id:robonchu:20180912233938p:plainのような画面がでてくるので、UEFIを選択。

  3. Try Ubuntu without installingを選択。

  4. Gpartedでパーティションを作成。ルートとswap。

    1. Ubuntu 16.04 インストール(UEFI) その2 - UEFIのPCにUbuntu 16.04をインストールする(パーティションの作成 〜 ブートローダーの設定) - kledgebを参考
  5. Ubuntu install アイコンを選択。

  6. ドライバを入れる項目はチェック無しで実行。インストールはそれ以外を選択し、上記作成パーティションにインストール。

  7. 終了したら再起動!

画面が90度回転している時

Ubuntuのシステム設定のディスプレイで回転させる。

ROSのインストール

以下の手順をコピペで完了!

これでGPD pocketでROS KINETICが動いた〜↓

f:id:robonchu:20180912235727j:plain

所感

小さい割にスペックいいし、Ubuntu動くし、これからいろいろ試したい! 小さいロボットにもギリ載せれそう。

中国語の資料つらかった。。。

Linux(Ubuntu16.04)でのプリンタの設定方法&コマンドラインでの印刷の仕方

f:id:robonchu:20180826104622p:plain

実験用のために小型フォトプリンタCP710を1000円で購入。安かった。

このシリーズは外付けバッテリで動くのが個人的には魅力的。

f:id:robonchu:20180826153703p:plain

外付けバッテリ: Amazon CAPTCHA

やりたいこと

Linux PCでプリンタを使いたい。

コマンドラインで任意のタイミングで印刷したい!

参考HP

ドライバの入手先

  1. 公式HPをチェック。なければ↓

  2. Gutenprint Printer Driversをチェック。なければ↓

  3. openprinting:start [Linux Foundation Wiki]

openprintingでドライバインストール

上記から 5.2.7 (DEB for LSB 3.2) を選択し、ダンロード

openprinting:database:driverpackages [Linux Foundation Wiki]

に従って

  1. sudo apt-get install lsb

  2. $ dpkg -i "name of the .deb package"

でインストール完了

設定前のインストール

  1. sudo apt-get install cups

  2. sudo apt-get install smbclient

プリンタの追加・設定

CUPSでの設定

が参考になりました。ありがとうございます!

CUPSで印刷トライ

CUPSを使ったUbuntu16.04LTSでのプリンタの設定

上記に従って登録後、下記写真のMaintenance -> Test Print Pageを選択

f:id:robonchu:20180826143835p:plain

で印刷完了 ↓

f:id:robonchu:20180826144305j:plain

設定の確認

Test Printできたプリンタ設定がデフォルトのプリンタ設定になっているか(左上のチェックがついてるか)を確認。

なっていない場合は右クリック->デフォルトに設定で変更。

f:id:robonchu:20180826151843p:plain

コマンドラインで印刷

【Linux入門】しっかりわかる!プリンタ管理と印刷コマンドがわかりやすい。感謝です。

ここまでできていると、印刷したい写真ファイル名がtest.pngだとすると、以下lpコマンドで

$ sudo lp test.png

印刷ができる〜!

参考:

所感

はじめてLinuxでプリンタの設定や印刷をしてみた。コマンドラインで印刷できたし、いろいろな用途に使えそう♪

おまけ

以下のシステム設定で素直に設定した場合だと、プリンタがすぐ「一時停止」状態になり、印刷出来なかった。

参考: プリンタの「一時停止」状態を解除して印刷可能にする

システム設定

システム設定 -> プリンタ で以下のような画面になっていたらCP710が正しく認識されている。

f:id:robonchu:20180826104133p:plain

エラー時の対処

もし、追加時に"client-error-not-possible"がでたら...

  • sudo cp gutenprint52+usb gutenprint52usb

参考: 14.04 - Installing CP400 printer gives 'client-error-not-possible' error - Ask Ubuntu

Raspberry Pi Zero W で遊んでみる(3)~アクセスポイント化~

やりたいこと

WIFI環境がない場所でもひとつのraspi zero wをアクセスポイントとして通信がしたい

なので、raspi zero w をアクセスポイント化にトライ

教科書

MACアドレスを調べる

pi@raspberrypi:~$ iw dev

udev ruleを追加

ファイルを作成

$ sudo nano /etc/udev/rules.d/70-persistent-net.rules

以下の"b8:27:eb:ff:ff:ff"の部分を先に調べたMACアドレスに書き換えて上のファイルに記述

SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="b8:27:eb:ff:ff:ff", KERNEL=="phy0", \
  RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \
  RUN+="/bin/ip link set ap0 address b8:27:eb:ff:ff:ff"

Dnsmasq and Hostapdのインストール

$ sudo apt-get install dnsmasq hostapd

Dnsmasq and Hostapdのためのファイル設定

3つのファイルを書き換える

1. /etc/dnsmasq.conf

interface=lo,ap0
no-dhcp-interface=lo,wlan0
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=192.168.10.50,192.168.10.150,12h

2. /etc/hostapd/hostapd.conf

以下のssidとpassphraseを自分の好きな名前に設定する。" "で囲む必要はない。

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=ap0
driver=nl80211
ssid=YourApNameHere
hw_mode=g
channel=11
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=YourPassPhraseHere
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP

3. /etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

Interfaces Fileの修正

1. /etc/wpa_supplicant/wpa_supplicant.conf

使用できるWIFIがあればそのWIFISSIDとパスワードを設定

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="YourSSID1"
    psk="YourPassphrase1"
    id_str="AP1"
}

2. /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
auto ap0
auto wlan0
iface lo inet loopback

allow-hotplug ap0
iface ap0 inet static
    address 192.168.10.1
    netmask 255.255.255.0
    hostapd /etc/hostapd/hostapd.conf

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface AP1 inet dhcp

起動時の設定

/home/piに以下シェルスクリプトを作成

pi@raspberrypi:~$ cat ./start-ap-managed-wifi.sh
#!/bin/bash
sleep 30
sudo ifdown --force wlan0 && sudo ifdown --force ap0 && sudo ifup ap0 && sudo ifup wlan0
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE
sudo systemctl restart dnsmasq

実行権限を付加

pi@raspberrypi:~$ chmod +x ./start-ap-managed-wifi.sh

起動時に実行するために、cronに設定

$ sudo crontab -e

以下を最終行に追加

@reboot /home/pi/start-ap-managed-wifi.sh

最後に...

リブート!

これで母艦PCのwifiを見ると設定したSSIDが見えるはず!!

コメント

wifi環境がない場所でsshで作業できるのは便利 ♪

おまけ

sshのホスト名を変更する方法

$ sudo -e /etc/hostname
変更する
$ reboot

再起動するとssh -X pi@変更後のホスト名.localで接続可能

udevについて

有線LANを接続する方法

USB OTG

名前解決

参考

Raspberry Pi Zero W で遊んでみる(0)~インストール・設定~

やりたいこと

raspberry pi zero w のインストールや設定方法をまとめる

f:id:robonchu:20180319195157j:plain

使っているバッテリーはこれ👇でとても小さい

ポータブル充電器02 通販 | au オンラインショップ | スマホ・携帯電話向けオプション品

もっと小さいバッテリーを知ってる方いたら教えてください> <

pin配置

f:id:robonchu:20180319165644p:plain

OSダウンロード

OSの書き込み

設定教科書

wifi設定

SDカード内のbootディレクトリを探し、以下のファイルをboot直下に作成

  • emacs -nw /Volumes/boot/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="your-SSID"
        psk="your-passphrase"
}

このSDを挿すとWIFIに接続される

USB経由でインターネット接続したいとき

参考: Raspberry Pi Zero(W)のセットアップ

bootドライブ内のcmdline.txtに "modules-load=dwc2,g_ether" を追加します。

rootwaitとquietの間です。エディタはvimを使っていますが、適宜変えてください。

次に、config.txtの末尾に"dtoverlay=dwc2"を追加します。

$ echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init=/usr/lib/raspi-config/init_resize.sh quiet splash plymouth.ignore-serial-consoles

SSH対応

設定

touch /Volumes/boot/ssh

ログイン

ssh -X pi@raspberrypi.local

初期ユーザーはpi、初期パスワードはraspberryになります。

wifi安定化

参考:

rfkillフラグのリセット問題が発動すると面倒なので、念のため。

$ sudo apt install rfkill

$ sudo vi /etc/rc.local

下記を追加。

#By default this script does nothing.

/usr/sbin/rfkill unblock wifi

 初期設定

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install tmux emacs
$ sudo raspi-config

スペースキーで選択

"4. Localization Options"から"11. Change Locale"を選択して、"ja_JP.UTF-8"を有効に。

同様に"4. Localization Options"から"12 Change Timezone"。"Asia"、"Tokyo"と順にたどっていく。

参考

Raspberry Pi Zero W で遊んでみる(2)~ROS KINETIC INSTALL~

やりたいこと

ラズパイゼロにROSを入れる

教科書

ROSではじめるホビーロボット#06がほしい。手に入る方法ないのかな。。。

インストール

$ sudo apt-get update
$ sudo apt-get install -y build-essential gdebi python-defusedxml libboost-all-dev liblog4cxx-dev libconsole-bridge-dev
$ sudo pip install netifaces
$ mkdir -p ~/tmp
$ cd ~/tmp
$ wget https://github.com/nomumu/Kinetic4RPiZero/releases/download/v_2017-10-15/rpi-zerow-kinetic_1.0.0-1_armhf.zip
$ unzip rpi-zerow-kinetic_1.0.0-1_armhf.zip
$ sudo gdebi rpi-zerow-kinetic_1.0.0-1_armhf.deb
$ sudo /opt/ros/kinetic/initialize.sh

設定

$ sudo rosdep init
$ rosdep update
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

roscore

f:id:robonchu:20180721094018p:plain

動いた〜!

コメント

のむむさんありがとうございますm( )m

数学のお勉強(1)~クオータニオン~

f:id:robonchu:20180715143240p:plain

参考:クォータニオンの回転補間:掲示板:シムダンス「四次元能」|Beach - ビーチ

やりたいこと

クオータニオンを理解する

教科書

↓ 素晴らしくわかりやすい。

回転行列の問題

  1. ジンバルロック特異点がある)

  2. 行列計算での処理負荷が重い

  3. 回転の補間が難しい

クオータニオンの利点

  1. ジンバルロックがない

  2. 計算負荷が低い

  3. 2つの回転同士のスムーズな補間が表現できる

  4. x,y,z軸に限らない任意の回転軸での回転が簡単にできる

複素数について

虚数単位

i ** 2 = -1

複素数

a + b * i

複素平面

f:id:robonchu:20180715143555p:plain

参考: 複素平面 - Wikipedia

複素数の行列表現

I = numpy.array([[0, -1], [1, 0]])

E = numpy.array([[1, 0], [0, 1]])

I ** 2 = - E

Z = a*E + b*I = numpy.array([[a, -b], [b, a]])

Z = numpy.array([[numpy.cos(theta), -numpy.sin(theta)], [numpy.siN(theta), numpy.cos(theta)]]) * numpy.array([[r, 0], [0, r]])

複素数の場合、乗法の交換法則・結合法則・分配法則を満たす

共役

z' = a - b * i

z * z' = || z || ** 2

複素数のすごさ

複素数平面における点の回転」は「複素数のかけ算」に対応している。

「回転を足す」と「複素数を掛ける」は同じ意味!

たとえば、単位円でiを掛けていくと90度ずつ回転する。めちゃ便利。

参考:

二重数について

冪零元

epsilon**n = 0

二重数

z = a + b*epsilon

epsilon = numpy.array([[0, 1], [0, 0]])

Z = a + b*epsilon = numpy.array([[a, b], [0, a]])

bを二重部という

複素数の場合、乗法の交換法則・結合法則・分配法則を満たす

クオータニオン

複素数の拡張として考えることができる

q = w + x*i + y*j + z*k  # i,j,kは虚軸 
  • 複素数は1とiという2つの線形独立な基底ベクトルで平面を表現

  • クオータニオンは1,i,j,kという4つの線形独立な基底ベクトルによる4次元空間を表す

基底i,j,kの関係

i**2 = j**2 = k**2 = -i*j*k = -1

i*j = k

j*i = -k

j * k = i

k * j = -i

k * i = j

i * k = -j

交換法則はなりたたない

クオータニオンはw,x,y,zの組として、

q = [w, x, y, z]

と表記されることがおおい

クオータニオンの演算

共役

q' = [w, -x, -y, -z]

大きさ

v = (x, y, z)

|q| = sqrt(w**2 + |v|**2)

乗算

ベクトル部の内積外積をもちいて以下のように表される

q0q1 = [w0 * w1 - v0 * v1 ,  w0 * v1 + w1 * v0 + v0 ✕ v1]

内積

q0 * q1 = w0 * w1 + v0 * v1

逆数

q**-1 = q' / |q|**2

単位クオータニオンでは、共役を求めれば逆数が求まることがわかる

行列表現

i = numpy.array([[0, 0, 0, 1], [0, 0, -1, 0],[0, 1, 0, 0],[-1, 0, 0, 0]])

j = numpy.array([[0, 0, 1, 0], [0, 0, 0, 1],[-1, 0, 0, 0],[0, -1, 0, 0]])

k = numpy.array([[0, -1, 0, 0], [1, 0, 0, 0],[0, 0, 0, 1],[0, 0, -1, 0]])

3D回転

回転

あるベクトルpを単位クオータニオンを用いて3次元空間で回転を表現する方法

p' = q * p * q**-1

p' = [0, v]

q = [qw, qv]  # qv:回転軸

p = [0, pv]

qw = +- numpy.cos(theta/2.0)

qv = +- numpy.sin(theta/2)*u  # u:qvと同じ方向の単位ベクトル

上記をまとめると、3次元の回転はクオータニオンを使って以下の式で表される

p' = q * p * q**-1

q = [numpy.cos(theta/2.0)  numpy.sin(theta/2.0)*u]

pを単位クオータニオンqで回転したあと、rをつかって回転させる場合、

r*(q*p*q**-1)*r**-1=(rq)*p*(q`r`)=(rq)*p*(rq)`

となり、あらかじめクオータニオンrqを計算してクオータニオンsとして合成しておけば、回転の合成を行うことができる

クオータニオンを使えばどんな回転も一発で表現可能

デュアルクオータニオン

定義

回転のみならず、剛体変換(回転と平行移動)を表現できる。

クオータニオンの二重数である

q^ = r + d * epsilon  # r,d: クオータニオン、epsilon:零冪元

所感

わかったようなわからないような。。。とりあえずハミルトン大先生すごい笑

まだ正直、理解しきれてない気がする。追記していこう : )