ロボットを作る

子供のころ、映画「STARWARS」 を観てワクワクし、ガンプラにドキドキしていた。時間が経つのも忘れてしまう、そんな時間をもう一度、取り戻すために、Raspberry pi を使って、オヤジがロボット作りに挑戦する!

やり始めてみると、なかなか思い通りに行かない。時間の経つのも忘れて悪戦苦闘中。 「こんなちっちゃな Raspberry Pi で、こんなことができるんだ」を日々実感している今日この頃。

2017年04月

Raspberry Pi2 で、物体追跡 の続き。

適当に動かしてると物理的にぶつかり、サーボが悲鳴を上げていた。このままだと壊れる。そのため、
そもそも思い通りにカメラを動かせるのかを試すために、サーボ SG90 の動かし方を調べる。

以下のpythonサンプルを読み解きながら進める。
https://github.com/adafruit/Adafruit_Python_PCA9685

以下の データシートの Example1 を見て、計算方法を理解できた。
PCA9685データシート



カメラマウントで、2つのサーボを使うのだが、実際に動かして

 pwm.set_pwm(channel, on, off)

の off を実測する。縦廻旋の許容範囲は、物理的に横廻旋サーボにぶつかるところや配線でぶつかるところを考慮して許容範囲を狭くすると、以下のようになった。
同じ SG90 だが基本の値が違っていたのは愛嬌か、何かミスってるか?

channel 0 横廻旋(左右) 104 - 296 - 491
channel 1 縦廻旋(上下) 116 - 309 - 500 ⇒ 165 - 309 - 447

この値(min - center - max)を使えば、壊れないだろう。(と信じる)


Installing ROS Indigo on the Raspberry Pi

 OS:Raspbian GNU/Linux 8 (jessie)
 ROS:indigo
 python:2.7.9



Ros-comm を入れる。(Desktopを入れればよかった。と後で反省)

基本は ROS のページどおりだが、いくつか地雷を踏んだ。(後で反省)

◆empy で落ちる
 $sudo apt-get install python-empy

◆cpp-comm あたりで落ちる
 $sudo apt-get install libconsole-bridge0.2 libconsole-bridge-dev

◆rospack で落ちる。Could NOT find TinyXML
 $sudo apt-get install libtinyxml-dev

◆roslz4 で落ちる。lz4 includes not found
 $sudo apt-get install liblz4-1 liblz4-dev

◆rosbag_storage で落ちる
gtest not found, C++ tests can not be built.
$sudo apt-get install libgtest-dev

Could NOT find BZip2
$sudo apt-get install libbz2-dev

◆roscpp

warning: unused parameter /// serializedLength

超超時間がかかった上にエラーが出てとまる。

make[1]: *** [CMakeFiles/roscpp.dir/all] Error 2
Makefile: 138: recipe for target 'all' failed
make: *** [all] Error 2
<== Failed to process package 'roscpp':

どうも swap が足りないらしい。swap増やす。defaut 100M から 1Gへ。

sudo vi /etc/dphys-swapfile

CONF_SWAPSIZEを1024MB(1GB)
CONF_SWAPSIZE=1024

$ sudo systemctl stop dphys-swapfile
$ sudo systemctl start dphys-swapfile
$ free -h  増えたのを確かめる。

インストールはできた。

$ roscore で落ちる。

$ sudo apt-get install python-netifaces

これでやっとインストールできた。振り返ると 3.2 Resolve Dependencies を飛ばしてた自分のせいでこんな面倒になっていただけだった。


で、なにか動かしてみたい。チュートリアルに出てくる tutlesim を動かす。

余計な環境変数を消して(unset)から
$ source /opt/ros/indigo/setup.bash
をしてから rosコマンドを実行する。

ROSのノードを理解する
ROSトピックの理解

いきなり、rosdep install turtlesim で、「turtlesim なんてパッケージない!」と。

$ rosinstall_generator turtlesim --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-custom_ros.rosinstall
$ wstool merge -t src indigo-custom_ros.rosinstall
$ wstool update -t src
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie

ーーーーーーー
rpt がない。どうも ROS-comm を入れたあとに Desktop 部分を入れるのは苦行のような。
いちから入れなおそうか。

http://flow-developers.hatenablog.com/entry/2016/06/05/172041

$ sudo apt-get install libblkid-dev e2fslibs-dev libaudit-dev

いくつか本が出てた。悩まずにこのとおりにやれば早いかも


Raspberry Pi2 で、サーボを使って、物体追跡をする。このサイトを見て、

Raspberry Pi サーボモーターとOpen CVで物体追跡カメラ(Meanshift)
ArduinoとAdafruit 16-channel Servo Driverでサーボモーター多数制御

ブツを揃える、


これらを Amazon で Getした。この Qiita のサイトとは異なるブツだが、とりあえず安かったので買ってみた。
カメラは手持ちのヤツを使う。

◆サーボモータを動かす
i2c を有効にする

$ sudo apt-get install i2c-tools
$ sudo raspi-conifig

 > 5. interfacing options
     > P5 I2C

以下のように結線する。サーバを動かすために、Servo Driver基板中央に別途電源をつなぐ(6Vまでらしい)

   RaspPi2   16ch Servo Driver (PCA9685)
  -------------------------------------------------------------
    3.3V○   ○ GND
   I2C SDA○   ○
   I2C SCL○   ○ SCL
           ○   ○ SDA
     GND○   ○ VCC
        ○   ○


結線して、servo_test.py を動かすとちゃんと動いた。
# いかん! サーボモータが、動作電圧:4.8V(~5V) なので、乾電池は3つにしておこう。

PCA9685 16-channel 12bit PWM Fm + I2C-bus LED controller


◆カメラを動かす
$ sudo apt-get install libopencv-dev python-opencv


USBカメラと OpenCV で画像を表示させるサンプルプログラムはググると沢山でてくる。
ただ、最近のサンプルでないと遠回りする。
結局、
import cv2.cv  や CaptureFromCAM ではなく、以下に落ち着いた。(ターミナル上で、ctrl + c で終了)
これを camera.py に保存して、実行
import cv2

cv2.namedWindow("monitor")
vc=cv2.VideoCapture(0)

if vc.isOpened():
   rval, frame = vc.read()
else:
   rval = False

while rval:
   cv2.imshow("monitor", frame)
   rval, frame = vc.read()
   key = cv2.waitKey(10)
   if key == 27:
      break
cv2.destroyWindow("monitor")     

【追記 4/22】
自分の環境で、TightVNCで Raspiを動かしていた。 2行目の namedWindow で以下が出てこけた。

GdkGLExt-WARNING **: Window system doesn't support OpenGL.

で、ググったら、対処方法があったので試してみた。

$ sudo apt-get install libgl1-mesa-dri 
$ sudo reboot

で、これでもダメで、workaround(1) として

$ sudo apt-get install guvcview

をした。workaround(2) は、VNC をTightvnc をやめて、X11vnc 変えるとできるらしい。がやってない。
workaround(3) は、元に戻して、VNCやめて Raspi にモニター直結したら、もちろんOK。

↑このページのトップヘ