2017年6月
        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年7月 | トップページ | 2016年9月 »

2016年8月

2016年8月27日 (土)

raspberry Pi3でubuntu14.04のまとめ

だいぶドタバタしましたが、ようやく現時点でのturtlebot学習用のubuntu 14.04環境をラズパイ3に載せることができました。もっとも参考になったのはこちらのサイトです。

基本的にはこの一連の投稿をなぞっていますが、参考にしたサイトにしたがい、apt-get upgradeできるようにしてあります。ただ、前の投稿と違うのは、ラズパイ3用の起動ファイルを抜き出すのをUbuntuMateではなく、こちらのサイトにあるラズパイ3用の16.04からやりました。ラズパイ2に入れた14.04と同じ系列(?)なので、いままでいろいろやってきた経験が生きるのではないかとおもいます。インストール方法は、下記のメモにまとめました。

「rp3ubuntu1404memo.txt」をダウンロード

このブログの以前の投稿や参考サイトを読みながらみてもらえば分かると思います。

また、参考までに製作したイメージを公開します。上記のメモで作成したモノです。モニタとキーボードをつなぎ、ユーザー名ubuntuパスワードubuntuでログインできます。ddファイルなのでhome直下におけば下記のようなコマンドでsdカードに展開できるとおもいます。(ubuntuでです)hanaokacyan,sdbなどは自分の環境にあわせてください。イメージは2GBになってますのでSDカードに合わせgPartedで拡大して使ってください。

$ sudo dd if=/home/hanaokacyan/rp3ubuntu1404.dd of=/dev/sdb

ddファイルのダウンロード

Hanabot2をラズパイ2から3に換装し、今後はこれで実験を進めるつもりです。写真ではわからないですけどね。

Dscn3498

2016年8月25日 (木)

sudoなしで最新のWiringPi-Pythonを使うには

前回、インチキをしてpythonで書いたROSのノードからWiringPi-Pythonを使わずにGPIOにアクセスしてみました。「電子計算機の仕事としてはめちゃくちゃ遅い」という点を除けば、まあナントカなるという結論でした。でも、どうもモヤモヤします。以前はWiringPi-Pythonからちゃんとsudoなしでできてたのになんでだろ、ということですね。

不通だったWiringPiのHPが復活したので、WiringPi-Pythonでエラーになっているあたりをチェックしたところ、初期化関数にヒントがありました。このページでは初期化関数として、wiringPiSetup (void) ;wiringPiSetupGpio (void) ;wiringPiSetupPhys (void) ;wiringPiSetupSys (void) ;という4種類をあげています。先の3つはルート権限で実行する必要があると書いてありますが、wiringPiSetupSys (void) ;だけはルートでないユーザーが実行できるとあります。ただ、gpioコマンドも併用してシェルから使用するピンを設定する必要があるとのこと、これは今まで僕がやってきた方法と同じです。その他いろいろと制約もあるみたいですが、これをラップしているWiringPi-Pythonの関数を探せば良さそうです。

ということでWiringPi-PythonのGitHubを改めて読み直してみて、愁眉を開くことになりました。なるほど使い方が変わっています。インストール方法が変わっていることには気がついていたのですが、そっちはノーチェックでした。以前はこの投稿でやっているように、初期化関数にパラメータを与えて、インスタンスを生成するようになっていたのですが、ごくシンプルに関数を呼ぶだけになっています。これでは以前のコードが動くはずもありません。WiringPi-Pythonの仕様変更が今回のドタバタの原因だったみたいです。というわけで動作したROSでLチカのコードです。

#!/usr/bin/env python
import roslib
import rospy
import time
import subprocess
import wiringpi

#main
if __name__ == '__main__':
    ### init io port ###
    subprocess.check_call('gpio export 17 out',shell=True)
    ###
    rospy.init_node('iotest')
    wiringpi.wiringPiSetupSys()
    wiringpi.pinMode(17,1)  # Setup pin 17 to OUT

    while not rospy.is_shutdown():
        wiringpi.digitalWrite(17,1)
        time.sleep(0.5)
        wiringpi.digitalWrite(17,0)
        time.sleep(0.5)
    print('\rStopped')

GPIO 17につないだLEDを1秒周期で点滅させます。sudoの必要はありませんからROSで普通にノードとして実行できます。sleepをコメントアウトしてコマンドの実効速度をオシロで計測したところ、ポートの書き換えにはわずか3usほどしかかかっていません。古いバージョンをラズパイ2で実行させたときより早いです。ラズパイ3のせいでしょうか。

なおこれはROSで使うようになっているので、roscoreを起動しておくのを忘れないでください。ROSを使わないで試してみるには、roslibとrospyのimportをやめるのとrospy.init_node('iotest')を削除、while not rospy.is_shutdown():を普通のwhile(1):で無限ループさせればよいと思います。

2016年8月22日 (月)

ROSでラズパイのGPIOをちゃんと使うには

【後日追加】WiringPi-Pythonを使ってsudoなしで実行する方法がわかりました。こちらの投稿をみてください。

前回の続きです。このバージョンのWiringPi-PythonではsudoなしではGPIOが使えないのがはっきりしたので、WiringPiを入れるともれなく付いてくるgpioコマンドをpythonから使ってみました。入力ポートで押しボタンの状態を読んで、押されたらLEDを点灯するROSノードです。

#!/usr/bin/env python
import roslib
import rospy
import time
import subprocess

#main
if __name__ == '__main__':
    ### init io port ###
    subprocess.check_call('gpio export 17 out',shell=True)
    subprocess.check_call('gpio export 18 in',shell=True)
    ###
    rospy.init_node('swtest')

    while not rospy.is_shutdown():
        sens = subprocess.check_output('gpio -g read 18',shell=True) 
        if '0' in sens:
            subprocess.check_output('gpio -g write 17 1',shell=True)
        else:
            subprocess.check_output('gpio -g write 17 0',shell=True)
    print('\rStopped')

GPIO18にプルアップされたボタンSWを押すと0になるように接続、GPIO17にLEDを1で点灯するよう接続します。roscoreを起動しておくのを忘れないでください。ボタンを押すとLEDが点灯するはずです。

Dscn3486

これで一件落着と言いたいところですが、まだ問題が残ります。それは実行速度です。下の写真はポートに1を書いてすぐ0を書くという無限ループを走らせた時のポートの波形です。つまりポートに書く関数の実行速度を測定したものです。

これは以前ROSでWiringPi-Pythonを使った場合です。(クリックで拡大します)

Dscn3493 #ラズパイ2で実行

時間軸は5us、1回の入出力にかかる時間は8us程度です。これならモーターの回転数を読んだり、簡易的なPWMを行ったりすることも可能です。しかし、今回のgpioコマンドを使った方法ではそうはいきません。

Dscn3497 #ラズパイ3で実行

一見前の写真と変わりませんが、時間軸が違います。時間軸10ms、波形から読み取れる1回の入出力の時間はなんと16msです。まさに桁違いに遅くなっています。これはシェルコマンドを呼び出している関係でどうしてもしょうがありません。1回の読み書きにこれだけなので、例えば4個のボタンをチェックするには4倍の64mSかかる計算になります。

押しボタンでのUIとか、以前作った「光を追いかけるロボット」くらいのレスポンスなら充分ですが、積極的に制御に使うのはちょっと苦しいですね。前の投稿で書いたようにセンサやモーターが簡単に接続しやすいため、ROSが身近になるという効果は大きいので、この辺は我慢することにしましょう。

2016年8月21日 (日)

WiringPi-Pythonでつまづく

最近はラズパイ3のubutu14.04の再検討でいろいろやっています。ラズパイのI/OにアクセスするWiringPiとそのPythonのラッパー、WiringPi-Pythonでちょっとつまづいたので、投稿しておきます。

そもそもWiringPiを採用したのは、ルート権限での実行が難しいROSのノードからラズパイのGPIOを使いたいからでした。実際、以前の投稿()のようにROSからGPIOにアクセスできていたのですが、新たにインストールしたWiringPiとWiringPi-Pythonだとエラーが出て実行できませんでした。いろいろ調べた結果、定数の名前が変更になっているのと、pythonから呼び出したときに、基本root権限が必要になってしまったというのがわかりました。

これではなんにもなりません。「WiringPi-Pythonからならルート権限なしで使える」と書いてあった英文のサイトもなくなっています。いくつかそういう記事もありますが、いずれも古い内容のようです。それから本日(2016年8月21日)現在WireingPiのサイトhttp://wiringpi.com/に、なぜかアクセスできなくなっています。気がついたのが数日前で、長期メンテにでも入っているのでしょうか。【後日追加】復帰しました

以前ブログで紹介したHanabot2では、現在も問題なく動いています。新たにインストールするとダメなようです。インストールしたバージョンによるようですが、おそらくルート権限なしでアクセスできるのが、そもそもバグだったのではないかと思います。でもこれでは困ります。

幸い、WiringPiをインストールすると使えるようになるgpioシェルコマンドは、新たにインストールしたモノでもsudoすることなしに使えます。こんな感じでポートに出力できます。

$ gpio export 11 out
$ gpio -g write 11 1  #ポート11に1を出力

これをpythonからsubprocessで呼び出せばできそうです。次回は実際にやってみます。

2016年8月18日 (木)

raspberry Pi3でubuntu14.04の新しい情報

ラズパイ3に入れたubuntu 14.04とROS(indigo)でturtlebotまわりの実験をぼちぼちやってきました。問題なく動くしラズパイ2より早いのでなかなか快適です。

ただしapt-get upgradeで更新できないので、組み込み用途としてはともかく、研究開発にはちょっと困った仕様で、あまりお進めできないシロモノでした。ともあれ、正式版のラズパイ3対応14.04が出るか、サポートしている16.04対応のROS(kinetic-kame)で動くturtlebotみたいなものが出るかまでのツナギと考えてそのまま使ってます。

最近、同じ元ネタで、しかももっとスマートに14.04をラズパイ3で使う方法を公開している方がいるので紹介します。「RaspberryPi3にUbuntu14.04をインストールする方法」というページで詳しく解説してくれてます。しかもupgradeも可能で大変使いやすいバイナリです。

僕のブログで説明した改造14.04のイメージを、sudo apt-mark hold raspberrypi-bootloader-nokernelというコマンドでブートローダーを更新しないよう設定し、apt-get upgradeしてみましたが、更新後でもちゃんと起動できました。これはありがたい情報です。

また、デフォルト以外のwifiドライバをインストールするには、sudo apt-get install linux-firmwareでできることがわかりました。ただ、残念ながら僕の環境では内蔵wifiを使えませんでした。これはlinux-firmwareを入れて内蔵wifiを認識させる前に、USBwifiアダプタをwlan0に割り当てられてしまったせいではないかと思います。ラズパイ3の内蔵wifiはwlan0にしか割り当てできないそうなので、これが悪さをしているのかもしれません。いまのところ再インストールしかなさそうですが。

さて、これで少し安心して使えそうです。

【追補】残念ながら新たにインストールしても内蔵wifiは使えませんでした。

【後日追加】紹介した方法で新たにラズパイ3を構築してみました。僕のやり方が悪いのか、更新ファイルがその時から変わっているのか分かりませんが、ハングアップがよく起こります。rebootなどsudoしたときに多いように思いますが、確実ではありません。2回試して見ましたがどちらも同じでした。

僕のブログで解説したupgradeできない方法ではそんなことはなかったので、ハードのせいではないと思います。imgファイルも公開されているようなので、それをDLして試してみようかと思います。

【↑の訂正】ハングアップの原因は/boot/から不要なファイルを削除するのを忘れていたためのようでした。これを行ったらハングアップしなくなりました。調子良いです。後ほどまとめてレポートします。→この投稿です。

2016年8月16日 (火)

レーザーレンジファインダーの効果は

ROSさんお手やわらかに:ROS青雲編

切り替えが済んだラズパイ2turtlebot、Hanabot2をテストした。搭載の状況はこの写真で。

Dscn3472

早速、gmappingとnavigationを試してみた。以前の印象だと、ラズパイ2+kinectだとマップの作成にちょっと時間がかかっていたが、かなりスムーズにマップが確定する。kinectのドライバがラズパイ2には重かったのか、あるいは視野が広がった(180度)せいなのかはわからないが、普通のラップトップ並みにサクサクと確定する。また、精度も良いのでできたマップは綺麗だ。

Brog_rviz_screenshot_2016_08_13

さすが本物だ。このセンサはヤフオクで見つけたもの。その時はとても安く買えたが、最近は中古屋も価値が分かったのか、50K円くらいからのスタートが多いようだ。

2016年8月14日 (日)

turtlebotのセンサをレーザーレンジファインダに切り替える

ROSさんお手やわらかに:ROS青雲編

このフォーマットで書くのは久しぶり。このカテゴリは僕のメモなので簡潔にまとめる。製作したturtlebotはkinectをセンサに使っているが、これを以前入手したURG-04LXに切り替える。turtlebotが入門用組み立てキットなら、その小改造と言ったところだ。O-V-2にプリセレクターを追加するみたいなものか。完全自作への最初のステップだ。

基本的な作業はこのページに従う。今回は元ページにあるように専用のcatkinワークスペースに主要ファイルのコピーは作らず、/opt/ros/indigo下の本体を改造する。なぜなら、将来roomba以外の移動ロボットをturtlebotスタックで制御するには、かなり広範囲に改造の必要があり、元ぺージで作るコピー環境では足りないからだ。本体を改造するテクニックを試すにはいい教材だ。下記に手順をメモする。

1:ロボットの構成を定義するturtlebot_library.urdf.xacroにレーザースキャナを追加
$ rorcd turtlebot_description/urdf/  #ディレクトリに移動
#末尾に.orgをつけてオリジナルをコピー(これはあとでもとに戻すときのためにオリジナルを保存するため)
$ sudo cp turtlebot_library.urdf.xacro turtlebot_library.urdf.xacro.org
#nanoで開いて
$ sudo nano turtlebot_library.urdf.xacro
#下記を</robot>の前に追加。origin xyzの部分は自分のロボに合わせて直してあるがコツあり。後ほど。
  <joint name=\"laser\" type=\"fixed\">
    <origin xyz=\"0.1 0.0 0.3\" rpy=\"0 0 0\" />
    <parent link=\"base_link\" />
    <child link=\"base_laser_link\" />
  </joint>

  <link name=\"base_laser_link\">
    <visual>
      <geometry>
        <box size=\"0.00 0.05 0.06\" />
      </geometry>
      <material name=\"Green\" />
    </visual>
    <inertial>
      <mass value=\"0.000001\" />
      <origin xyz=\"0 0 0\" />
      <inertia ixx=\"0.0001\" ixy=\"0.0\" ixz=\"0.0\"
        iyy=\"0.0001\" iyz=\"0.0\"
        izz=\"0.0001\" />
    </inertial>
  </link>

2:minimal.launchでレーザーを起動するよう改造(手順は上に同じ)
$ roscd turtlebot_bringup/launch/
$ sudo cp minimal.launch minimal.launch.org
$ sudo nano minimal.launch
#minimal.launchの最後にこれを追加
<node name=\"laser_driver\" pkg=\"hokuyo_node\" type=\"hokuyo_node\">
   <param name=\"frame_id\" value=\"base_laser_link\" />
</node>

3:turtlebot_navigationのマップ作成、自立移動のローンチファイルから3dsensor.launchを外し、kinectを使わない設定にする
$ roscd turtlebot_navigation/launch/
$ sudo cp gmapping_demo.launch gmapping_demo.launch.org
$ sudo nano gmapping_demo.launch
#nanoで下記のようにコメントアウトして無効にする。ただしコメントアウト部分に元々のコメントがあるので、それは削除する。そうしないとコメントアウトが面倒
<!--
  <include file=\"$(find turtlebot_bringup)/launch/3dsensor.launch\">
    <arg name=\"rgb_processing\" value=\"false\" />
    <arg name=\"depth_registration\" value=\"false\" />
    <arg name=\"depth_processing\" value=\"false\" />
    
    <arg name=\"scan_topic\" value=\"/scan\" />
  </include>
-->

#同じ作業を同じディレクトリにあるamcl_demo.launchにも行う。

レーザーレンジファインダのインストールは下記でできる。以前はちょっと苦労したが今はインストールするだけですんなり動くようだ。

$ sudo apt-get install ros-indigo-hokuyo-node

ポイントは、turtlebot_library.urdf.xacroに追加するレーザーの定義で、origin xyzの部分。水平オフセットと、回転オフセットを定義する。今回は上のように、ロボットのセンターから前に0.1m、中心軸上、高さ0.3m、傾きなしで設定した。元ページのデータだと逆さまにつけるよう、x成分の回転オフセットが180度(π)になっているので注意。

それと垂直方向のzオフセット、つまり高さは、元のデータでは0.36mになっている。これは実際の高さに合わせたいところだが、/opt/ros/indigo/share/turtlebot_navigation/params/costmap_common_params.yamlで高さ0.25〜0.35mの範囲のレーザー情報のみ障害物検出に使う設定になっているので、その範囲にないと地図は作れるが障害物回避ができない。これが分からなくて苦労した。高さがどうあれ、0.3mにしておく。ちゃんと設定するに前出のパラメータを修正する。これは後で。

ただし、このように本体のファイルを改造すると、apt-get upgradeでの更新で元に戻ってしまうことがあるようだ。別の実験でturtlebotをオリジナルの移動台車に切り替えてみたとき、制御に使っていたラップトップで更新を実行したら、いくつかのファイルが元に戻ってしまい、突然動かなくなってしまったことがあった。恒久的につかうなら、改造したファイルを別のディレクトリにまとめて置き、起動時にシェルスクリプトでイッキに置き換えるといった対策が必要だろう。まあ実験程度なら更新しないよう気をつければよい。

改造したのはラズパイ2を使ったHanabot2。kinectは取り外し、レーザースキャナーは外部電源タイプなのでモバイルバッテリーから給電した。一時的な実験なのでこんな感じに組み立てた。

Dscn3470

2016年8月 7日 (日)

タミヤのギアボックスで連続回転サーボを作る

久しぶりのウィークエンドです。今回は、サーボ信号でスピードをコントロールできる連続回転サーボを、タミヤの工作用ギアボックスを利用して作ります。

連続回転サーボはサーボ信号でモーターのパワーをコントロールするもので、ラジコンカーのアンプと同じものです。以前は入手しにくかったので、普通のサーボを改造する方法を投稿しましたが、最近のメイカームーブメントのせいか、GWSのS35などが国内でも入手できるようになり、わざわざ改造しなくとも良くなりました。こういったサーボはArduinoのサーボシールドとかで回せるので、走行するロボットやワイヤを巻き取るウインチなんかを簡単に作ることができます。

サーボーモーターのギアボックスをそのまま使っているので、トルクは十分なのですが、反面、回転速度が遅く、スピードの点ではものたりません。下の動画は以前実験したものですが、70mmくらいの車輪でだいたいこんなものです。(このロボットの正体は2011/4からのバックナンバーにあるので興味がある方は見てください)

今回の工作では、サーボの基板とタミヤの4速ギアボックスを使ってもっと早い連続回転サーボを作ってみます。

工作は簡単です。まずサーボを分解して基板を取り出します。使ったのはGWSのS03Nですが、一般のサーボならなんでも構いません。底の4本のビスを外すとバラバラになります。基板からモーターに行っているリード線は、後で継ぎ足すので、適当なところで切ってしまえばOKです。基板はこんなものでした。単体での写真を撮るのを忘れてしまったので、試作機に組み込んだ状態です。

Dscn3451_2

ギアの減速比を変えると出力軸の回転方向が変わるので、モーターリードは写真のようにピンソケットで差し替えられるようにしました。この基板の場合は、赤と白がモーターで、黒はモーターボディへのアースです。モーターノイズ抑圧のためだと思いますが、あまり効果がなかったので今回は使っていません。

ただし!ギアボックス付属のモーターは使えません。そのままではサーボの電圧が高いのでモーターが過熱してしまいます。この投稿にあるモーターに取り替える必要があります。また、元々のマイクロモーターに比べて電気ノイズが多いので、下の写真のように端子間に0.1uFくらいのコンデンサー(セラミックコンデンサがベスト)を入れるのと、どちらかの端子をモーターボディに接続する必要があります。これをしないと他のサーボがガタガタしたり、ひどい時にはマイコンがリセットしたりすることがあります。

Dscn3453

最終的に接続したのがこの写真です。基板の真ん中にあるのがポテンショメーターの軸です。サーボにニュートラルの信号を送ってモーター停止するよう調整します。結構シビアです。調整したら軸が回らないよう合成ゴム系の接着剤で固定します。このサーボは4.8Vで使うのが良いでしょう。ニッケル水素かエネループ4本がおすすめです。

Dscn3452

今回テストした実験用ロボット(高速色認識カメラとサブサンプションを使って生物的な動きの実験中です。いずれ紹介したいと思っています)にこんな風に組み込みました。車輪はタミヤのナロータイヤです。

Dscn3456

ロボットの重量は850g、114.7:1のギア比だとこのくらいのスピードです。早いですがボールのスピードには追いついていません。

ギア比を38.2:1にかえるとスピードはだいぶ早くなります。ボールに追いつけそうですが、トルクが小さくなるので、低速での俊敏な制御には向きません。そもそも130モータークラスでは力不足です。

ともあれ、サーボの基板で普通のモーターも制御できるのは実証できたと思います。いずれ他のモーターでも試してみたいと思っています。

« 2016年7月 | トップページ | 2016年9月 »