2012年10月31日水曜日

Raspberry Pi をオーバクロックしたら起動しなくなった。

 Raspberry Pi を sudo apt-get update & apt-get upgrade でアップデートしたら、いつのまにか raspi-config に "Orerclock"の項目が増えていました。せっかくなので、1000MHzを選択して(不安定になったら、700MHzに戻せばいいやって思って)起動しなおしたところ、Raspberry Pi (OS)が起動しなくなってしまいました...。VNCでGUIどころか、ターミナルでも接続できません。これじゃ元にも戻せないじゃん・・・。あきらめて、最新のディスクイメージを落としてきてSDカードを作り直すことに決めて、SDカードをWindowsマシンに挿したところFATディスクとして中のファイルが見えて


 その中に config.txt という、それっぽいファイル名のテキストファイルがあったので開いてみたところ、


#uncomment to overclock the arm. 700 MHz is the default.
arm_freq=1000

という記述があったので、上記の arm_freq=1000 をコメントアウトして、再度Raspberry Piに挿したところ、元通り起動しました。よかった、よかった。これで、この arm_freq の値を直接書き換えれば塩梅をみながらクロックを調整することができそうです。←懲りてない。

 もじ、自分と同じく、何も考えずに軽はずみで...、同じ状態になった人がいたら試してみてください。

2012年10月27日土曜日

Interface 12月号にRaspberry Piが載ってます

 Interfaceの今月号(2012年12月号)のARMコンピュータ特集に Raspberry Piの記事が載っていました。LinuxのSDカードイメージの作り方からGPIOへのアクセスまで解説された記事が載っています。日本語でのRaspbery Piのマイコンボードとしての使い方指南としては現状貴重な資料じゃないでしょうか。



2012年10月21日日曜日

KMR多脚ロボットに専用Bluetoothモジュールを載せた

 以前に組み立てた近藤科学のKMR多脚ロボットに純正のBluetoothモジュールKBT-1を載せました。値段は高めですが、純正オプションだけあって、固定や接続は簡単に出来ます。


 ちょっと、余った配線が汚いですが、とりあえず、設置完了。


 PCとペアリングして、コントロールソフトから制御。


 次にAndroid用のソフトがダウンロードできたので(有料だけど)、試してみました。


 純正なので、当然問題なく動きます。

 これで、リモートブレイン的にPC側で制御を行い、ロボットを自律で動かしてみたい。Arduinoを載せてセンサー情報をやはりBluetoothかXBeeで飛ばせば・・・と妄想は広がりますが、具体的なアイデアはまだありません。


2012年10月16日火曜日

Raspberry Pi + OpenCV で顔検出してみたけど・・・

 ミサイルランチャーの内蔵カメラは玉砕中ですが、とりあえず、動作確認できているELECOMのUVCカメラで顔検出を試してみました。OpenCV.jpなどにあったサンプルを元にカメラ取得画像に対して顔検出するようにしました。
 最近は、まずPCのVMWare Workstation上にインストールしたDebian上で一度プログラムを作成・動作させてから、Raspberry Piへソースを持って行ってコンパイルして動作確認、という開発スタイルになっています。やはり、Raspberry Pi上でのコンパイルは時間がかかるので回数を減らしたいというのがあります。ただ、VMのDebian上では快適あるいは正常に動くのにRaspberry Piに持って行くとパフォーマンスやドライバ(アーキテクチャ)の違いでダメというのは往々にしてあります。
 今回の顔検出もVMのDebian上では快適に動作しましたが、Raspberyy Pi 上だと、動くは動くんですが、画像フレームの更新が3秒に1回くらいで、(処理されて)画面に表示されるまで10秒くらいの遅延があります。


 これだと、ミサイルランチャーにカメラを載せて(本当は内蔵カメラを使いたい)、カメラで顔検出することでミサイルランチャーをフェイストラッキングさせて、ミサイル発射(って、おいおい・・・)させる目論見は難しそうです。相手が静止していればいいですが、普通に動いていたら、数秒前のあさっての方向にミサイルが飛んでいくことになります。となると、Raspberry Piは諦めて、リモートブレイン的なPCと無線でやり取りする方法に切り替えるか・・・。あるいは小型のノートPCで試してみるか。(っていうか、Raspberry Piでミサイルランチャーを遊ぶのが目的だったので、ちょっと脱線だけど。)
 とりあえず、顔検出のソース。実行フォルダにOpenCVに含まれている正面顔検出用のテンプレート haarcascade_frontalface_default.xml を置いておく必要があります。

// OpenCV カメラ画像顔検出のテスト。
// gcc -Wall -o "%e" "%f" -g -L/usr/local/lib 
//     -lopencv_core -lopencv_imgproc -lopencv_highgui 
//     -lopencv_ml -lopencv_video -lopencv_features2d 
//     -lopencv_calib3d -lopencv_objdetect -lopencv_contrib 
//     -lopencv_legacy -lopencv_flann -lusb
// 実行フォルダに haarcascade_frontalface_default.xml を置く。
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

#include <opencv/cv.h>
#include <opencv/highgui.h>

int main(int argc, char **argv)
{
 CvCapture *capture = 0;
 IplImage *frame = 0, *src_gray = 0;
 int max_detect, min_detect;
 int c ,i;
 
 double width = 320, height = 240;
 //double width = 640, height = 480;
 
 // 正面顔検出のための検出器を読み込む。
 CvHaarClassifierCascade *cvHCC =
  (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml", 0, 0, 0);
 // 検出用のメモリストレージの用意。
 CvMemStorage *cvMStr = cvCreateMemStorage(0);
 // 検出情報格納用シーケンスの用意。
 CvSeq *detectFace;
 // 検出最小及び最大サイズ設定。
 max_detect = (int)height;
 min_detect = (int)(height / 5);
 
 
 // カメラに対するキャプチャ構造体を作成。
 if (argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
  capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0);
 
 // キャプチャサイズの設定。
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);
 
 // ウィンドウ作成。
 cvNamedWindow("face_detect", CV_WINDOW_AUTOSIZE);
 
 while(1)
 {
  // 画像キャプチャ。
  frame = cvQueryFrame(capture);
  
  // グレイスケールイメージに変換。
  src_gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
  
  // 顔検出処理。
  detectFace = cvHaarDetectObjects(frame, // 対象イメージ。 
      cvHCC,  // Haar分類器カスケード。
      cvMStr, // メモリストレージ。
      1.1,  // スケーリングファクタ。
      3,   // 近接矩形グループ化。
      CV_HAAR_DO_CANNY_PRUNING,   // 処理モード。
      cvSize(min_detect, min_detect),  // 最小窓サイズ。
      cvSize(max_detect, max_detect)); // 最大窓サイズ。  
  // 検出結果を矩形&クロス表示。
  for (i = 0; i < detectFace->total; i++)
  {
   CvRect *faceRect = (CvRect*)cvGetSeqElem(detectFace, i);
   cvRectangle(frame,
      cvPoint(faceRect->x, faceRect->y),
      cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
      CV_RGB(255, 0, 0),
      3,
      CV_AA,
      0);
   cvLine(frame,
    cvPoint(faceRect->x + (int)(faceRect->width / 2) -10,
     faceRect->y + (int)(faceRect->height / 2)),
    cvPoint(faceRect->x + (int)(faceRect->width /2) + 10,
     faceRect->y + (int)(faceRect->height /2)),
     CV_RGB(255, 0, 0),
     3,
     CV_AA,
     0);
   cvLine(frame,
    cvPoint(faceRect->x + (int)(faceRect->width / 2) ,
     faceRect->y + (int)(faceRect->height / 2) - 10),
    cvPoint(faceRect->x + (int)(faceRect->width /2),
     faceRect->y + (int)(faceRect->height /2) + 10),
     CV_RGB(255, 0, 0),
     3,
     CV_AA,
     0);
  }
  
  cvShowImage("face_detect", frame);
  
  c = cvWaitKey(10);
  if(c != -1) break;
  //sleep(2);
 }
 
 // 後片付け。
 cvReleaseMemStorage(&cvMStr);
 cvReleaseHaarClassifierCascade(&cvHCC);
 cvReleaseCapture(&capture);
 cvDestroyWindow("face_detect");
 
 return 0;
}

2012年10月14日日曜日

USBスカッとミサイルランチャーを Raspberry Pi で動かしてみた。

 先週は仕事が忙しくて、家に帰ってからも疲れて酒のんで寝てしまって・・・、あんまり、本業の趣味の方に手が付けられませんでした。今週末は、親戚へのお墓参りも兼ねて 一泊でしたが 松之山温泉へ行って「ちとせ」さんにお世話になりました。部屋に源泉かけ流しの露天風呂がついていて、一日中好きなときにお酒片手に温泉につかれるという贅沢な体験ができました。朝日を浴びながら温泉に使って一杯は最高でした。お料理も美味しかったし、また行きたいと思います。ただし、周りには何もありません。自分はスキーもやらないので、ひたすら温泉に使って、お酒を飲むっていう・・・。でも、WiFiのFreeSpotが使えたのは意外でした。(以前に鬼怒川温泉に行ったときは携帯すら危うかった記憶がある。)


 で、温泉で(仕事の心の)疲れを癒して、今日は、久々に新しいキワモノをいじることにしました。今回のターゲットはセンチュリーの「USBスカッとミサイルランチャー」です。といってもセンチュリーがこういうものを開発しているわけはなく、ものとしてはDREAM CHEEKYのSTORM O.I.C というものです。以前にちょっと流行ったUSBミサイルランチャーですが、このモデルにはカメラもついています。となると、やっぱり、こいつを移動ロボットに載せて遠隔あるいは自立によって操作・制御したくなります。もちろんWindows用にはDREAM CHEEKYのサイトから制御アプリをダウンロードして利用することができます。このソフトもカメラに写った画面が表示され、砲台の制御・ミサイル発射ができるようになっていますが、独自に自作プログラムから操作しようとすると調査が必要です。また、ここはせっかくなので将来のロボット搭載も意識して Raspberry Pi での制御を実現したいと思います。

 まずは、Raspberry Pi のUSBにミサイルランチャーを接続して、接続情報を調べます。lsusb でUSBデバイスの認識情報を確認すると
   2123:1010 (空欄)
   0ac8:3450 Z-Star Microelectronics Corp.
というふうに表示されます。上の名前が空欄になっている方がミサイルランチャーでHIDデバイスとして認識されているようです。ミサイルランチャーをUSBに挿すと自分の環境ではそれぞれ "/dev/hidraw2"と"/dev/usb/hiddev0"が追加されました。HIDデバイスとして認識されているならもしかするとファイルデバイスとしてコマンドを書き込んでやれば動いてくれるかもしれません。また、下のZ-Star ・・・がカメラのようです。"/dev/video0"として認識され、"ls /dev/v4l/by-id"では
   usb-Vimicro_Corp._Altair_USB2.0_Camera-video-index0
と表示されます。OpenCVで画像取得してみたところ、320×240及び640×480で画像取得することができました。→ (訂正)当初、PC上のDebian環境では画像取得は問題なくできたんだけど、Raspberry Piに接続して確認したところ、画像取得時にtimeoutしてしまい、たまに取得できるんだけど、ほとんど黒画面という状態でした。

 とりあえず、内蔵カメラでの画像取得はできそうです →(訂正)厳しいかな?別途カメラを付けるのもなんか悔しいんだけど・・・。あとは とりあえず、ミサイルランチャーの制御です。ネットで色々調べてみたところ、この機種ではありませんが、過去に販売されていた同社のミサイルランチャーの制御をLinux上で行なっているサンプルがあったので、それらのコマンド記述を参考(というかコピー)にして "/dev/hidraw*"への書き込みスクリプトで操作しようとしたんですが、うまくいきませんでした。そこで、libusb というのを使うことにしました。使い方とかはこの辺とか、ネットで調べました。libusbのインストールは

   sudo apt-get install libusb-dev

で。


 Raspberry Pi のUSB端子に直接接続した状態だと砲台の駆動時に USB通信エラーになってしまい、途中で動かなくなってしまいました。これは、Raspberry PiのUSB駆動能力が140mA程度にポリスイッチで制限されているからだと思います。そこで、セルフパワー(ACアダプタ付き)のUSBハブを間に入れることで、ミサイル発射まで動かすことができるようになりました。ただし、数回に一度、ミサイル発射時にRaspberry Piのシステムが落ちます。発射時に突入電流やノイズのようなものがあるんでしょうか?でも、間にハブを入れているので、影響するんだろうか?この部分は今のところ原因不明です。
 以下、ソースです。

#include <stdio.h>
#include <unistd.h>

#include <usb.h>

#define HID_REPORT_SET (0x09)
#define BULK_OUT (0x02)

#define MISSILE_VENDOR_ID (0x2123)
#define MISSILE_PRODUCT_ID (0x1010)
#define MISSILE_CMD_HEADER (0x02)
#define MISSILE_CMD_DOWN (0x01)
#define MISSILE_CMD_UP (0x02)
#define MISSILE_CMD_LEFT (0x04)
#define MISSILE_CMD_RIGHT (0x08);
#define MISSILE_CMD_FIRE (0x10);
#define MISSILE_CMD_STOP (0x20);

const int USB_TIMEOUT = 3000;
const int BUF_SIZE = 8;

int main(int argc, char **argv)
{
 struct usb_bus *bus;
 struct usb_device *dev;
 usb_dev_handle *udh;
 struct usb_config_descriptor *config;
 struct usb_interface *interface;
 struct usb_interface_descriptor *altsetting;
 unsigned char buf[BUF_SIZE];
 int result = -1;
 int i = 0, j = 0;
 
 // 初期化。
 usb_init();
 usb_find_busses();
 usb_find_devices();
 
 // デバイスチェック。
 for(bus = usb_get_busses(); bus; bus = bus->next)
 {
  for(dev = bus->devices; dev; dev = dev->next)
  {
   if(dev->descriptor.idVendor == MISSILE_VENDOR_ID &&
    dev->descriptor.idProduct == MISSILE_PRODUCT_ID)
   {
    // デバイスオープン。
    if((udh = usb_open(dev)) == NULL)
    {
     // オープンに失敗。
     printf("usb_open Error.(%s)\n", usb_strerror());
     exit(-1);
    }
    
    printf("found usb missile launcher\n");

    config = &dev->config[0];
    interface = &config->interface[0];
    altsetting = &interface->altsetting[0];
    
    if (usb_set_configuration(udh, config->bConfigurationValue) < 0)
    {
     if (usb_detach_kernel_driver_np(udh,
              altsetting->bInterfaceNumber) < 0)
     {
      printf("usb_set_configration() error.\n");
      usb_close(udh);
      return -1;
     }
    }
    
    // インタフェースの使用をシステムに通知。
    if (usb_claim_interface(udh, altsetting->bInterfaceNumber) < 0)
    {
     // インタフェース使用要求でエラー。
     printf("claiming interface error\n");
    }
    else
    {
     for (j = 0; j < 6; j++)
     {
      // 送信データ構成。
      buf[0] = MISSILE_CMD_HEADER;
      switch (j)
      {
       case 0:
        buf[1] = MISSILE_CMD_RIGHT;
        break;
       case 1:
        buf[1] = MISSILE_CMD_LEFT;
        break;
       case 2:
        buf[1] = MISSILE_CMD_UP;
        break;
       case 3:
        buf[1] = MISSILE_CMD_DOWN;
        break;
       case 4:
        buf[1] = MISSILE_CMD_STOP;
        break;
       case 5:
        buf[1] = MISSILE_CMD_FIRE;
        break;
       default:
        break;
      }
      for (i = 2; i < 8; i++)
      {
       buf[i] = 0x00;
      }
      
      // 送信。
      result = usb_control_msg(
       udh,
       USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
       HID_REPORT_SET,
       0,
       0,
       (char*)buf,
       sizeof(buf),
       USB_TIMEOUT); 
      if (result < 0)
      {
       // 送信エラー。
       printf("usb write error.\n");
      }
      else
      {
       printf("send data.\n");
      }
      
      sleep(1);
     }
     
     // インタフェースの解放。
     usb_release_interface(udh, 0);
    }
    
    // デバイスクローズ。
    usb_close(udh);
    
    return 0;
   }
  }
 }

 return -1;
}

2012年10月8日月曜日

Raspberry Pi への OpenCV インストール

こちらに改めてセットアップに関して記述しています。

 相変わらず、GR-SAKURA のI2Cが上手く扱えず、Arduinoを主力で行くか悶々としている日々が続いているのですが、気分転換に Raspberry Pi へ OpenCV のインストールを行なってみました。Raspberry Piで画像処理が出来れば、センサやサーボ制御周りはロボット上のArduinoにやらせて、コントローラまでロボットに載せてしまいたいときはRaspberry Piを一緒に載せて、リモートブレイン的にいくときはBluetooth等の無線経由でパソコンで処理といった選択肢が広がります。そうなると、自分の知識ではI2C(のライブラリが他のArduinoやRaspberry Piと同じようにやっても)を思ったように動かせないGR-SAKURAの出番はますますなくなっていくわけですが・・・。

 当初、日本語で解説されているこちらのページを参考にさせていただいて、
   OpenCV-2.4.2.tar.bz2
のインストールを行ったんですがmakeで 3~4件のErrorが出てしまい、数日かけて色々試してみたんですが、結局サンプルも動かせない状態でした。
 そこで、こちらのページを参考にして、マイナーバージョンの一つ古い
   OpenCV-2.3.1a.tar.bz2
というのを試したら、あっさりインストールできてしまいました。おそらく、Raspberry Pi の Rapbian "wheezy" が古いバージョンを使っていることに起因しているんじゃないかと思います。う~ん、インストールするだけで数日かかってしまった。Windows ならこのへんのバージョン(まして、マイナーバージョン)なんてほとんど問題にならない、っていうか、何も考えずにダブルクリックだけで済んじゃうわけで、そういうところはやっぱり便利です(というか、それが当たり前だと思ってしまっていますが)。
 で、とりあえず、pythonのサンプルを動かしてみる。



 動くようです。これで、なんとか環境だけは準備できたかな?でも、ロボットで使うとなると大事なのはカメラが使えるかというところだと思います。Windowsなら、何も考えずにUSBに挿せば勝手にドライバーが入って(あるいは簡単なインストールで)動いてしまうわけですが、Linuxだとそうも行かないことは予想がつきます。カメラ側にLinux対応と買いて売っているものもまずありません。この辺りに有志の方の動作確認済み情報もありますが、日本で手に入りにくかったり、ロボットに載せるのに向いていなさそうなタイプのものだったりで、リストにあるLogitechのものを一つ買ってみようとは思っていますが、とりあえず、手元に在庫として転がっている(過去に使っていて今使っていないような)古いWebCamを試しに挿して動作を確認して見ることにしました。Logitechの昔のものなら、それなりに動く期待はもてるんじゃないかと・・・。
 で、カメラ自体の動作確認にはまずOpenCVとは別に guvcview というソフトを
     sudo apt-get install guvcview
でインストールして、行いました。

Logitech V-UM27 (100mA)
   lsusb では 046d:08f0 Logitech, Inc. QuickCam Messenger とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-046d_Camera-video-index0 としてリスト
   guvcview では 1fps, 160×120res, YU12 で動作。
   形的には目玉っぽくてロボットにいいかも。下部にネジ穴もあるので固定しやすそう。

Logitech V-US20 (100mA)
   lsusb では 046d:0870 Logitech, Inc. QuickCam Express とリストされる。
   ls /dev 以下に vidio0 としてリストされず。
   使えず。


Logitech V-UJ15 (100mA)
   lsusb では 046d:08b1 Logitech, Inc. QuickCam Notobuook Pro とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-0464_08b1-video-index0 としてリスト
   guvcview では 9.5fps, 160×120res, YU12 で動作。
   解像度も低く、ロボットに載せにくい形状。



Logitech V-UBU48 (500mA)
   lsusb では 046d:0991 Logitech, Inc. QuickCam Pro for Notebooks とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-046d_030E2026-video-index0 としてリスト
   guvcview では MJPEG, YUYV等で 160×120res, 3fps ~ 320×240 ~640×480 ~ 800×600, 1fps 等で動作。
   画質もクリアで使えそうだが、Rating:500mAって記述が気になる。Raspberry Pi のUSBは140mAくらいのポリスイッチ(リセッタブルヒューズ)が入っているらしい。


ELECOM UCAM-DLK130T (詳細不明、UVC)
   lsusb では 056e:700f Elecom Co. Ltd とリストされる。
   ls /dev 以下に vidio0 としてリスト。
   ls /dev/v4l/by-id/ では usb-ELECOM_ELECOM_UCAM-DLK130T-video-index0 としてリスト
   guvcview では YUYVで 160×120res,7fpsと320×240.5fpsと800×600,0.5fpsで動作。
   なぜかVGA解像度で動かなかった。ロボットに載せるのには加工が大変そう。



とりあえず、認識されてv4lで画像が取得できた、Logitech V-UM27、V-UJ15、V-UBU48、ELECOM UCAM-DLK130Tで OpenCVのカメラ画像取得を試してみました。といっても、OpenCVをいじるのは初めてなので、ネットでサンプルコードなどを拾ってきてお試ししました。

// OpenCV カメラ画像取得テスト。
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>

#include <opencv/highgui.h>

int main(int argc, char **argv)
{
 CvCapture *capture = 0;
 IplImage *frame = 0;
 int c;
 
 //double width = 160, height = 120;
 double width = 320, height = 240;
 //double width = 640, height = 480;
 //double width = 800, height = 600;
 
 // カメラに対するキャプチャ構造体を作成。
 if (argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
  capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0);
 
 // キャプチャサイズの設定。
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);
 
 // ウィンドウ作成。
 cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);
 
 while(1)
 {
  // 画像キャプチャ。
  frame = cvQueryFrame(capture);
  cvShowImage("Capture", frame);
  
  c = cvWaitKey(2);
  if(c == '\x1b') break;
  //sleep(2);
 }
 
 // 後片付け。
 cvReleaseCapture(&capture);
 cvDestroyWindow("Capture");
 
 return 0;
}

 とりあえず、それぞれのカメラで(対応している解像度で)の画像取得を確認できました。


 ただ、実際にOpenCVを使っての画像処理に関しては、全くこれからの初心者状態ですので、すこしずつ調べながら進めていきたいと思っています。

2012年10月2日火曜日

LSM03DLHディジタル・コンパス

 今回は SparkfunのLSM303DLH搭載傾き補償付きデジタルコンパス・加速度センサモジュール を試してみました。といっても、既にArduinoでお試しされている方はたくさんいて、ライブラリまで作ってくださっている方もおります。今回は、こちらのライブラリを流用して、お試しさせてもらいました。
 Arduino-IDEのバージョンが違うのと、ライブラリ内でどんな処理をしているのか知りたたかったので、あえて、ライブラリの中身をメインの処理にコピペして使わせてもらいました。元のライブラリはこちらのサイトで公開して下さっています。


 真ん中の小さい赤い基板がデジタルコンパス・加速度センサモジュールです。左側の赤いユニバーサルボードにタイヤがついているのは、この辺で使っていた差動二輪の台車が手狭に感じてきたので、一回り大きい板で用意したものです。といっても、モータは以前と同じく模型用の一番小ぶりのおもちゃのモータなので、ペイロードは期待できません。
 この週末というか日曜日は、前述のコンパスの動作確認と、台車の組立、もうひとつ、市販の多脚ロボットを台車とあわせて移動プラットフォームに今後使いたいと思い、組み立てていました。


 ビールを飲みながら、一日、ロボットを組み立て、ああ、なんか幸せ・・・。ところで、自分は普段は殆どビールは飲みません。主にワインを飲みますが、夏場暑くなると、唯一ギネスを一杯目として飲んだりという程度なんですが、今日はロボットを肴にビール祭りです。
 まず、ギネス


 実はビールの炭酸があまり得意じゃなかったりするんですが、クリーミィな泡立ちと苦すぎず、香りがいいので、ギネスは大好きです。
 ビールにあわせて、組立も進みます。


 それらしい形になってきました。
 ビールの方は二本目、サンクトガーレンのインペリアルチョコレートスタウトです。


 「チョコビール」ってチョコの入ったビールってどんな味だろうって思ったんですが、チョコが入っているわけではなくて、麦芽をチョコやコーヒー豆のような色になるくらい強く焙煎して、風味もチョコ的な風味がするビールっていうことらしいです。たしかに、口に含んだ瞬間ビターチョコのような感じを受けます。ただ、同じスタウトなら、自分はギネスのほうが飲みやすくて合っているなという感想でした。
 さて、ロボットの方はCPUボードなども実装して、一応、組みあがりました。


 なかなか、メカメカ?していて良い感じです。二足もかっこいいんですが、自分はこの手の多脚ロボット、虫とか蜘蛛とかムカデ系のがガシャガシャ動く様子を見るとなんだか嬉しくなってしまいます。(ちなみに本物の虫、蜘蛛、ムカデは苦手です。)
 で、完成を祝して、三本目、サンクトガーレンのその名も el Diablo です。


 バーレイワイン(麦のワイン)と言われるタイプのビールだそうです。これは・・・くせになります。とても濃厚で、苦味も強いですが、他の甘みや色々な味がはっきりとするので、強い苦味も嫌味でなく、美味しいです。ギネスを飲んだ以来の衝撃のビール(大げさ?)かも?でも、値段もかなりのもので、しかも、2011年ものは6000本しか作られていないらしく、晩酌で毎日・・・というわけには行かないです。秋には今年のものが発売されると思うので、今から楽しみです。

 さて、今後、今回組み立てた移動プラットフォームと今までに調べたセンサ類を使ってなにかやろうと思っているんですが・・・、具体的には、まだ、考えていません・・・