2023年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

カテゴリー

ブログパーツ

無料ブログはココログ

« 2016年1月 | トップページ | 2016年3月 »

2016年2月

2016年2月27日 (土)

ラズパイROSにroomba500ノードを入れてわかったこと

試作ラズパイROSにはすでにturtlebotがインストールされroombaをコントロールしていますが、細々した実験にはもっと軽いドライバがあった方がよいです。

そこで、最初の頃の実験に使っていたroomba500_light_nodeを持ち込むことにしました。

これはソースコードで提供され、rosbuildでビルドしてインストールするのですが、その作業でメモリ不足(Cannot allocate memory)が出てしまい、うまく行きません。よくよく考えてみると、作成したマイクロSDにはswap領域がなく、そのためのようです。ここに来てマイクロSDのパーティションをいじるのは、しくじるととてもがっかりすることになるので、ファイルを作成してswap領域として使うことにしました。

やり方はこうです。swapfileという256MBの領域をrootに確保し、それをスワップ領域として定義します。

$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=256k # スワップ用のファイル作成
$ sudo mkswap /swapfile # 作成したファイルをスワップとして初期化
$ sudo swapon /swapfile # スワップを有効化

下記コマンドで確認します。swapfileがリストされればOKです。
$ swapon -s

このままだと再起動すると設定が無効になります。そこで下記のコマンドで /etc/fstabに記載しておきます。
$ sudo sh -c "echo '/swapfile swap swap defaults 0 0' >> /etc/fstab"

本題のroomba500ノードのインストールはこの投稿の手順で行います。ただし、メモリ不足にはなりませんが、これでも最終的にFAILがでます。しかし、ログを読むとドライバのビルドはできているようなので気にしないことにします。もちろん動作もOKです。

turtlebotコンパチ機2号の設計コンセプト

それほど大げさな訳ではないですが、ラズパイ2で制御する2号機の設計コンセプトを明確にしておきます。下の写真は仮組みした2号機と1号機の集合写真です。左がこれから作り方を説明する2号機です。(1号機の製作記事はこちら

Dscn3219

1・工作はなるべく簡単に

例によってボディは木工で作ります。切るのはまっすぐ、組み立ては主に木工ボンドです。ただ、運搬しやすく分解することも出来るようにしておきます。
roombaの改造も必要ですが、基板をいじったりするのはやめておきます。
搭載する充電機能付きの電源基板は、部品点数が少なく、かつ安全な設計にしてあります。ただし、基板の製作にはハンダ付けが必要です。

2・バッテリーは1個、使いながら充電可能に

今回はraspberry pi2、kinect、さらにはroombaまで一つの12Vバッテリーで駆動します。roombaのバッテリーは14.4Vなので少々低めの電圧ですが、テストしてみると問題なく使えています。バッテリーをまとめたことで充電管理がとても楽になりました。
また、動作中でも充電プラグを差し込めば充電できるようになっています。ノートパソコンなどでは当たり前の機能ですが、そもそもroombaが外部制御になっている間は充電機能が働かない仕様なので、1号機では充電するためにプログラムを中断する必要がありました。これで電池切れの心配なくプログラム開発ができます。

3・roombaの緊急停止が出来るように

開発中のプログラムが、roombaを走行させるコマンドを送ったところでクラッシュすると、roombaはそのまま走り続けます。fullモードだと停止コマンドを送る以外、どうやっても止まりません。今回はバッテリーを共用にしたので、電源スイッチを切れば確実に止まります。

4・入門用に徹する

本機はROS入門用実機としての位置づけです。raspberry pi2はなかなかの高性能とはいえ、最近のi5やi7搭載のラップトップとは比較になりません。これをベースに音声認識や画像認識なんかを追加するのは、あまり現実的ではないと思います。そのかわり、ROSを理解するための実験がしやすいように、raspberry pi2のI/O機能もサポートし、簡単なセンサを利用したロボット実験などが出来るようにします。

2016年2月21日 (日)

新しいturtlebotコンパチ機

raspberry piでROSを動かそうと思ったのは、以前作ったturtlebotのコンパチ機に使えないかと思ったからです。

初心者がROSに入門するのに必要なのは、日本語のテキストと安く入手できるROS対応のロボットでしょう。日本語のテキストは以前の投稿にあるように質の良いものが手に入るようになりました。こちらはPDF版のかなり本格的な解説書です。

一方、入門用ロボットは相変わらずの状況です。最もポピュラーなturtlebot2は現在でも15万円以上もします。さらにこの価格にはkinectとラップトップパソコンは含まれていません。
ロボットに搭載できる小型のラップトップは、中古でも結構なお値段です。これが5k円くらいで新品が手に入るraspberry pi 2を使ってみようと思った理由の一つです。

安さばかりではなく、使い勝手も大切です。まずはサイズの問題です。以前試作したroombaベースのturtlrbotは、手持ちのラップトップを乗せる関係で、デッキ部分を大きくする必要がありました。roombaを使う以上、ある程度の大きさにはなってしまうのですが、なるべく小さくした方が取り扱いが楽になります。raspberry pi 2を使う理由の二つ目はこれです。カードサイズのrasberry piならもっと小さくできそうです。
下の写真は古いturtlebotです。デッキ部分がroombaからだいぶはみ出しているのがわかるでしょう。

Dscn2932

バッテリーの問題もあります。以前の試作機はroomba、ラップトップ、kinect用と3種類のバッテリーを搭載していました。重量もさることながら、充電管理も大変です。また、ロボットにありがちな、ソフトを作りながらテストするプラクティカルな開発作業を考えると、電源を入れっぱなしで数時間使えるようなバッテリマネジメントも重要です。

今回のモデルはこの辺に気をつけて開発しようと考えています。
これが仮組みをした新tutlebotコンパチ機の骨組みです。前の写真に比べると本体部分がだいぶコンパクトになっていると思います。kinectが取り付けられている部分は、ビス4本でそっくり取り外すことが出来、輸送に便利な構造になっています。
ある程度まとまったら、製作記を投稿する予定です。

Dscn3134

2016年2月14日 (日)

Raspberry pi 2でROS(indigo)を使う(おしまい)

今回はubuntu 14.04でRaspberry Pi 2のGPIOとI2Cを使えるようにします。ROSでLEDランプやモーターなどのアクセサリの制御や、i2c接続のセンサやADコンバータを使ったデータ収集などが出来るようなります。

まずGPIOです。pipでRPi.GPIOをインストールするだけです。

$ sudo pip install RPi.GPIO

写真のようにGPIO11にLEDを接続してLED点滅プログラムでテストします。

Dscn3163

テストに使ったコードはこれです。

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(11, GPIO.OUT)
while True:
    GPIO.output(11, True)
    time.sleep(0.1)
    GPIO.output(11, False)
    time.sleep(0.1)
GPIO.cleanup()

一般的なLチカコードですが、注意するのはGPIO.setmodeです。Raspianで良く見かけるコードはGPIO.setmode(GPIO.BOARD)となっていますが、ubuntuではGPIO.setmode(GPIO.BCM)にしないとダメです。もちろん実行時にはsudoが必要です。


次はI2Cです。
最初に/etc/modulesを開いて編集します。

$ sudo nano /etc/modules

コメントが入っているダケですので、下記2行を追加します。

i2c-bcm2708
i2c-dev

次にi2cの状態チェックなどができるi2c-toolsをインストールします。

$ sudo apt-get install i2c-tools

さらに自分(hanaokacyan)をi2cデバイスにアクセスできるグループに追加します。

$ sudo adduser hanaokacyan i2c

仕上げに、pythonでi2cを使うためのライブラリを下記でインストールします。

$ sudo apt-get install python-smbus

これで準備OK。rebootします。

再ログイン後、手持ちのi2cデバイスがあれば、接続テストをしてみます。特に今使う予定がなければやらなくてもよいです。
写真のようにRaspberry Piにi2cデバイスを接続します。今回は秋月の小型LCDを使いました。(なお、このデバイスを使ったもっと詳しいテスト法はスイッチサイエンスのこのページを見てください)

Dscn3166

下記コマンドでデバイスが見つかるかどうか調べます。i2cグループに入っているのでsudoなしでいけるはずです。

$ i2cdetect -y 1

これは接続されているi2cデバイスのアドレスを表示するものです。このモジュールの場合は下記のように表示されます。

I2c

これはi2cアドレス3eにデバイスがあるということです。これでI/Oの設定もおしまい、めでたくRaspberry Pi 2でROSが使えるようになりました。ROSのテストは改めて投稿します。

2016年2月10日 (水)

Raspberry pi 2でROS(indigo)を使う(その7)

今回はシリアルポート、ビルド関連のパッケージ、ROSのワークスペースをインストールします。ここまででROSで開発が出来る環境が出来上がります。


まずpyserialをインストールしてpythonからシリアルポートを使えるようにします。

pyserialは、pythonのパッケージ管理システム"pip"を使ってインストールするので、最初にpipをインストールします。

$ sudo apt-get install python-pip

インストールしたらpip -Vコマンドでバージョンを確認しておきます。僕の場合は下記のようになりました。

$ pip -V
pip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)

最後にpyserialをこのコマンドでインストールします。

$ sudo pip install pyserial

これでpythonからシリアルポートが使えます。

さらにユーザー(この連載ではhanaokacyan)にシリアルポートにアクセスする権限を与えるため、ユーザーグループdialoutに参加させます。次のコマンドです。

$ sudo adduser hanaokacyan dialout

ここまでで一度rebootしておきます。


次にビルド関係のパッケージをインストールします。これは次のコマンドを実行するだけです。

sudo apt-get install build-essential


最後にROSのワークスペースを作成します。ROSのチュートリアルにあるのと同じくcatkin_wsを作成します。手順はチュートリアルのセクション4の通りです。

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

作成したら次の手順で空ビルドして、エラーがないことを確認します。

$ cd ~/catkin_ws/
$ catkin_make

下記コマンドを~/.bashrcの最後に追加しておしまいです。
 source ~/catkin_ws/devel/setup.bash

これでROSのパッケージを開発する環境が整いました。次回はRaspberry Pi 2のI/Oポートを使えるようにします。

2016年2月 9日 (火)

Raspberry pi 2でROS(indigo)を使う(その6)

今回はいよいよROS indigoをインストールします。

インストールはROS.orgのこのインストールページの手順で行います。ARM用のROS indigoでサポートリストにubuntu14.04LTSをインストールしたRaspberry Pi 2が入っています。(後日追加:インストールはこのページを参考に上記リンクでオリジナルのインストールページの操作にしたがってください。下記訂正箇所のように内容が変更になっている場合があります。)

インストールページのセクション2.1ではubuntuのソースリポジトリを正しく設定するように書いてありますが、今回、何もしていません。以前いくつかのラップトップにインストールした場合もそうでした。僕はこれをいじったことはないので、おそらくデフォルトで良いのだろうと思います。

セクション2.2でロケールをセットします。

$ sudo update-locale LANG=C LANGUAGE=C LC_ALL=C LC_MESSAGES=POSIX

セクション2.3,2.4ではROS.orgからプログラムを読込む準備をします。下記二つのコマンドを実行します。

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'

$ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net --recv-key 0xB01FA116

セクション2.5でいよいよROSをインストールします。これで入るのはindigoのROS-Base、つまり最低限のパッケージです。

$ sudo apt-get update

$ sudo apt-get install ros-indigo-ros-base

ここはかなり時間がかかります。

セクション2.6はrosdepの初期化です。下記コマンドを実行します。

$ sudo apt-get install python-rosdep
$ sudo rosdep init
$ rosdep update

セクション2.7で環境設定の準備をします。

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

これでログインすると.bashrcに書かれたROSの環境を設定します。現在のターミナルで作業を続けるために、次のコマンドでROSの環境を設定しておきます。

$ source ~/.bashrc

セクション2.8ではrosinstallのインストールです。下記コマンドでOKです。

$ sudo apt-get install python-rosinstall

セクション2.9にubuntuのバージョン確認をし、必要ならば/etc/lsb-release を編集しろとありますが、今までの手順でインストールしたubuntuなら何もする必要はありません。

これでROSがインストールできました。次は開発環境などを整えます。

2016年2月 7日 (日)

Raspberry pi 2でROS(indigo)を使う(その5)

ここまででubuntu14.04がWiFiで使えるようになりました。ホストマシンからsshでログインして次の手順に進みます。xxxはraspberry pi 2のIPアドレスです。

$ ssh ubuntu@xxx.xxx.xxx.xxx

IPは固定してあるという前提でハナシを進めます。

まず、ubuntu以外のユーザーを追加します。ROSを使いたいなら他のubuntuマシンもあるはずですから、そこのユーザー名で登録しておくと便利です。ここではユーザー名hanaokacyanを追加します。

ユーザーを追加する前に、現在ubuntuとなっているホスト名を、わかりやすいものに変えておきます。これは下記二つのファイルのubuntuとなっている部分を、自分で決めたホスト名に変更します。今回はuPiにしました。

/etc/hostname
/etc/hosts

ここでrebootしホスト名がupiになっていることを確認します。

ユーザー、hanaokacyanを追加し、管理者権限を与えます。コマンドは下記です。

$ sudo adduser hanaokacyan

これを実行した結果は下記のようになります。赤字が打ち込む部分です。Full Name []:以降の部分はオプションです。そのままエンターキーでも問題ありません。

Adduser

ここでrebootし、もう一度ubuntuでログインします。次は次のコマンドでhanaokacyanに管理者権限を与えます。

$ sudo gpasswd -a hanaokacyan sudo

再度rebootし、今度はhanaokacyanでログインできることを確認。idコマンドで次のようにsudoが入っていればOKです。

hanaokacyan@uPi:~$ id
uid=1001(hanaokacyan) gid=1001(hanaokacyan) groups=1001(hanaokacyan),27(sudo)

これで準備が整いました。次回はROSをインストールします。

2016年2月 4日 (木)

Raspberry pi 2でROS(indigo)を使う(その4)

今回はubuntuのWiFi環境をセットアップします。

この時点では、この写真のような状態で動作するまでになりました。

Dscn3085

シリアルコンソール以外にLANケーブルが接続されています。これでDHCPでIPアドレスが割り当てられているはずです。

$ ifconfig

を実行するとeth0にIPが振られているのが確認できます。Macやubuntuのターミナルから ssh ubuntu@XXX.XXX.XXX.XXX(XXXはraspberry pi 2のIPアドレス)でログインできると思います。(後日追加:まだsshサーバがないので入れません。シリアルコンソールかキーボードから sudo apt-get install openssh-server でインストールする必要があります)

WiFi環境は未実装ですので、下記コマンドでインストールします。

$ sudo apt-get install wireless-tools

テストしたWiFiアダプターはplanexのGW-USNano2とBUFFALOのWLI-UC-GNM2です。どちらもすんなり使えました。この方法でubuntu14.041をインストールしたraspberry pi2ではBUFFALOのWLI-UC-GNM2は使えませんでした。rasbianだと使えます。

Dscn3090

アダプターを認識しているかどうかは下記コマンドで確認できます。

$ iwconfig

このような結果が帰ってくれば、アダプターが認識され、wlan0に割り当てられているのがわかります。

Wlan

次は無線LANネットワークの設定です。これはネット上に情報がたくさんあるので、わかりやすいサイトをご案内します。このサイトでは固定IPの設定まで簡潔にまとめられています。

【後日追加】このままではWPAでの接続ができません。こちらの投稿を読んでください。

【さらに後日追加】下記でlinux-firmwareとwpasupplicantもインストールすればWLI-UC-GNM2を含む他のwifiアダプターも使えるようになり、上のWPAの接続問題も解消します。
$ sudo apt-get install linux-firmware wireless-tools wpasupplicant

これが出来ればLANケーブルを外して運用できます。次は自分用のユーザーアカウントを追加します。

2016年2月 2日 (火)

Raspberry pi 2でROS(indigo)を使う(その3)

今回はマイクロSDの容量いっぱいまで使えるようにします。

実はこの方法でubuntuをインストールした16GのマイクロSDは、容量一杯まで使用する設定になっていません。ディスク内容を確認するdf -hコマンドで見るとこんな感じです。

Dflist1

rootが1.7G、どうやら2GのマイクロSDに書き込む設定になっているようです。このままではいくらなんでも容量不足ですから、16Gいっぱいに使えるよう設定し直します。
作業はraspberry pi 2にログインして行います。ログインはシリアルコンソールからでもキーボードとモニターからでもかまいません。

具体的な手順は下記のログの通りです。赤字の部分が入力する内容です。(画像なのでコピベはできません)

Fdisk

ここでリブートします。

$ sudo reboot

再起動後df -hを実行してディスク内容を確認してください。16Gのディスクの場合、rootが15Gになっていると思います。

次回はWiFi関係の設定をします。

2016年2月 1日 (月)

Raspberry pi 2でROS(indigo)を使う(その2)

今回はシリアルコンソールを有効にし、タイムゾーンを設定します。

インストールしたubuntuはコンソールがモニタとキーボードになっています。sshは有効なのでネットに接続できてIPがわかればsshではログインできます。従って普段はホストになるラップトップからsshすればモニタやキーボードは必要ありません。(インストールしたubutuには、デフォルトでsshは入っていません。sudo apt-get install openssh-serverでインストールしてください)
しかし、既知のネット環境がない場所、例えばraspberry pi 2を搭載したロボットをどこかに持ち出して、そこのネット環境でデモしたいときなど、接続設定のためだけにモニターやキーボードを用意しなければならないので不便です。
シリアルコンソールを有効にしておけば、USBシリアル変換ケーブルだけ用意しておけば、あとはホストのラップトップで事足ります。

今回は持ち歩きを考えて、スイッチサイエンスで購入したこの変換基板を使いました。ロジックレベルの5V,3.3Vの切り替えが出来、接続ケーブルはスマホの充電によく使われるマイクロBなので、忘れても誰かから拝借しやすいのがメリットです。接続はこのようにします。電圧選択ジャンパーは3.3Vにします。(図はこちらからの無断拝借です)

Fcd30e770699d04b88f43e0085ed2dc3 Dscn3086

これで準備完了。次は設定ファイルの変更です。まだシリアルコンソールは使えません。モニターとキーボードで下記の作業をします。ファイル編集にはnanoを使っています。

$ sudo nano /boot/cmdline.txt

nanoで/boot/cmdline.txtの内容を次のように編集します。1行のコマンドです。

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

次に/etc/init/ttyAMA0.confを新規に作成します。

$ sudo nano /etc/init/ttyAMA0.conf

nanoで下記内容を入力し、保存します。

start on stopped rc or RUNLEVEL=[12345]
stop on runlevel [!12345]
respawn
exec /sbin/getty -L 115200 ttyAMA0 vt102

これで設定終了です。

rebootする前にシリアルターミナルと接続しておきます。僕はMacなのでターミナルを開いてscreenを実行しました。(これはMacのターミナルで実行します。raspberry piではありません。)ubuntuでも同じです。windowsならteraTermを使うのがよいでしょう。
 screen /dev/tty.usbserial-AI02RMYT 115200

ここでリブートします。

$sudo reboot

接続したパソコンのシリアルターミナルに起動メッセージが流れ、やがてログイン画面が表示されればOKです。これでシリアルコンソールが使えるようになりました。
デフォルトユーザー(ubuntu)でログインして確認します。

これからセットアップを続けるためにロケールとタイムゾーンを設定します。ロケールは日本語にしたいところですが‥試しにやってみたところ、コンソールの表示が日本語になったためか文字化けが発生しました。ここはデフォルト(英国英語)のままにしておくのが無難なようです。という訳でロケールの設定はしません。

タイムゾーンは下記で設定します。

$sudo dpkg-reconfigure tzdata

選択画面が表示されるので、カーソルキーとエンターキーでAsia Tokyoを選択します。決定後、下記のように表示されればOK。

Current default time zone: 'Asia/Tokyo'
Local time is now:      Mon Feb  1 02:01:16 JST 2016.
Universal Time is now:  Sun Jan 31 17:01:16 UTC 2016.

電源を切るには下記コマンドを実行します。しばらくするとraspberry pi 2はアイドル状態になりますがハード的に電源は切れません。USB電流計でモニターしたところ30mA程度にまで落ちるようです。電流計をつないでいればわかりますが、そうでない場合は、コマンド発行後10秒くらいしてから電源を切ってやるといいでしょう。

$ sudo shutdown -h now

次回はマイクロSDの容量を一杯まで使えるようにします。

Raspberry pi 2でROS(indigo)を使う(その1)

Raspberry pi 2でROS(indigo)を動かしてみます。

まずはubuntu14.04LTSを導入する訳ですが、出来ればシリアルコンソールだけで作業したいところです。色々調べてみましたが、シリアルコンソールは無効になっていてモニタとキーボードがないとインストール作業ができないようです。今回はHDMI-DVI変換ケーブルを買ってきてデスクトップのモニターと接続しました。

最初にマイクロSDの準備をします。今回は16Gのものを使いました。システムとROS、turtlebotのスタックを入れた状態でrootが3.4G程ですから、これで十分でしょう。パーティションが切ってある使い回し品の場合は、パーティションを削除する必要があります。

次に書き込むイメージファイル"2015-04-06-ubuntu-trusty.zip"をここからダウンロードします。あとはマイクロSDをマウントし、解凍して出来た"2015-04-06-ubuntu-trusty.bmap"をドラッグするだけです。 Macならこちらのサイト、Windowsならこちらのサイトを参考にして書き込みます。
僕は作業をMacでやりましたが、もちろんubuntuでも出来ます。

Dscn3089

ここから先は、モニターとUSBキーボードが必要です。
マイクロSD、モニター、キーボードをRaspberry pi 2に接続し電源を入れると、モニターに起動メッセージが流れ、しばらくするとログイン待ちになります。最初の起動にはちょっと時間が掛かるみたいです。
ここでデフォルトの設定
ユーザー:ubuntu
パスワード:ubuntu
で、ログインします。ここまで出来れば一安心です。次回はシリアルターミナルを有効にします。

« 2016年1月 | トップページ | 2016年3月 »