デベロッパーズガイド(Armadillo-200シリーズ編)

series_a240_w300px.jpg

概要

このドキュメントは、アットマークテクノ社から発売されている、ARMベースの小型汎用CPU ボードArmadillo-200シリーズ(このドキュメントでは 220, 240 を対象とし、USBポートの無いArmadillo-210, 230を除きます)上でRTコンポーネントを動作させる方法について解説します。

Armadillo-200シリーズ

Armadillo-200シリーズは、ARM9を搭載した小型CPUボードです。

アットマークテクノからは、さまざまなドキュメントが提供されていますので、RTCをArmadilloに移植する前にこれらをよく読んで理解してください。

Armadillo-220ドキュメント
スタートアップガイド v1.1.6 PDF, HTML
製品マニュアル
ハードウェアマニュアル v2.1.4 PDF, HTML
ソフトウェアマニュアル v2.2.2 PDF, HTML
製品ドキュメント
Atmark Dist 開発者ガイド v1.0.9 PDF, HTML
ATDE2 インストールガイド v2.0.5 PDF, HTML
開発ガイドブック
Armadillo実践開発ガイド 第1部 v2.2.0 PDF, HTML
Armadillo実践開発ガイド 第2部 v2.2.0 PDF, HTML
Armadillo実践開発ガイド 第3部 v2.1.0 PDF, HTML

これらのドキュメントは公式サイトで更新されているかどうか確認し、できるだけ最新のものを参照するようにしてください。

ATDE2 for OpenRTM-aistを用いた開発手順

Armadillo-200シリーズは組み込みCPUボードのため、PC上のクロスコンパイル環境上でRTコンポーネント開発し、それをUSBメモリなどにコピーして起動させる必要があります。RTコンポーネントを動作させるまでの手順はおおよそ以下のようになります。

  1. コンポーネントのクロスコンパイル
  2. コンポーネントの実行のための準備(USBメモリへコピー)
  3. Armadilloの起動とRTコンポーネントの実行


crossdevel_process.png
Armadillo用RTコンポーネント開発プロセス

では、まずはじめにOpenRTM-aistに付属のサンプルを動かして、Armadillo上でRTコンポーネントを動かす手順を確認して行きましょう。

ATDE2 for OpenRTM-aist

開発環境 ATDE2 のセットアップ で必要となるATDE2 for OpenRTM-aist のVMwareイメージを以下からダウンロードできます。

説明 ファイル名 MD5 サイズ
ATDE2 for OpenRTM-aist atde2_for_openrtm_20121005.zip cd22a133c1d77a8e8c87c36aad5e6886 1776 MB

サンプルコンポーネントの実行

サンプルコンポーネントの実行

Armadillo-200シリーズ

Armadillo-200シリーズはARM9を搭載したLinuxが動作可能な組込みCPUボードです。Armadillo-210, 220, 230, 240 があり、それぞれ以下の様な仕様となっています。

Armadillo-210 Armadillo-220 Armadillo-230 Armadiilo-240
プロセッサ Cirrus Logic EP9307
CPUコア ARM920T
CPUコアクロック 200MHz
バスクロック 100MHz
RAM 32MB (SDRAM) 64MB (SDRAM)
フラッシュメモリ 4MB (NOR型) 8MB (NOR型), 拡張可能
LAN(Ethernet) RJ45×1 (100BASE-TX/10BASE-T) RJ45×2 (100BASE-TX/10BASE-T) RJ45×1 (100BASE-TX/10BASE-T)
シリアル(UART) RS232C×1, 3.3V CMOS×1 RS232C×1, 3.3V CMOS×2 3.3V CMOS×2
GPIO 8bit (コネクタ非搭載) 16bit (コネクタ非搭載)
USB - USB 2.0(Host)×2 (Full Speed) - USB 2.0(Host)×2 (Full Speed)
電源電圧 DC9~48V または
PoE(Type B) 対応
DC5V±5% または PoE(Type A/B)対応
消費電力 1.2W (Typ.) 1.5W (Typ.) 1.7W (Typ.) 1.5W (Typ.)

210は他とは基板サイズが異なりかなり小型のボードです。220が最もベーシックなタイプで、230はUSBの代わりに、もう一つのネットワークアダプタがついているタイプ、240はシリアルコネクタの代わりにVGAがついており、モニタへの出力ができます。(ただし、このVGAは通常コンソールとしては利用できずフレームバファデバイス経由でのみアクセス可能です。)

詳細な仕様については、アットマークテクノのサイトを参照してください。

外部とのインターフェース

小型の組込みCPUですので、キーボードやマウス、モニタ等は接続できず、センサを接続したり、特定のデバイスやロボットなどを制御するために使用するのが一般的な使用方法です。 外部とのインターフェースはシリアル (RS232C) と Ethernet (LAN) があります。 運用時などは、ネットワーク経由でコマンドを送ったり、モニタリングします。あるいは、Armadillo側が自発的に外部に接続してデータのやり取りを行うかもしれません。

開発時には、PCとシリアルケーブルで接続して、シリアルコンソールからLinuxにログインしてデバッグなどを行います。 X-Windowなども動作しませんので、GUIでの操作は通常出来ません。

コマンドラインでの操作やviエディタの使用に慣れておくことをおすすめします。

クロス開発

Armadilloは特定の用途向けのアプリケーションのみを実行することを前提としているため、一般的なPCとは異なり十分な容量のハードディスクやメモリを搭載していません。 したがって、アプリケーション・プログラムの開発もArmadillo上で行うのではなく、PC上の開発環境内で行い、コンパイルしたバイナリを何らかの方法でArmadilloに転送して実行します。 一般的なPCのCPUはIntelのx86系アーキテクチャのものですが、ArmadilloはARMという異なるアーキテクチャのCPUを搭載しています。x86用のバイナリはARM上では実行できませんし、その逆も不可能です。 PC上の開発環境ではARM用の実行ファイルをコンパイルできるコンパイラを動作させ、アプリケーションを開発することになります。 こうした開発方法をクロス開発と呼びます(下図)。

crosscompile_nativecompile.png
クロスコンパイルとネイティブコンパイル

Armadilloを組み立てる

Armadilloは開封すると、ベースとなる基板とピンヘッダや各種コネクタ (USB、シリアル、VGA、DC、Ehternet等) 、LEDなどが同梱されています。 必要な部品類を半田付けして組み立てましょう。 詳細は、Armadilloのハードウエアマニュアルを参照してください。

Armadilloの起動

PCとArmadilloの接続

開発時には Armadillo はPCからシリアルコンソールで操作しますので、下図のように Armadillo と PC をシリアルケーブルで接続します。

a220_connection.png
Armadillo-220とPCの接続

a240_connection.png
Armadillo-240とPCの接続

PC側のシリアルポートとArmadilloのシリアルポートを接続してください。 Armadillo-220では基板上にD-SUBのRS232Cコネクタがありますので、Armadilloに付属のクロスケーブルでPCと接続します。 Armadillo-240の場合は、D-SUBコネクタがありませんので、Armadilloに付属しているシリアルポート変換ケーブルを基板上のピンヘッダへ接続して、反対側のD-SUBコネクタをシリアルケーブルにつなぎこれをPCに接続します。

最近のPCやノートPCではシリアルポートが無いことがあります。その場合はUSBシリアル変換 (ケーブルタイプのものやコネクタタイプのものなどがあります) を使用してください。

また、LANケーブルをLANコネクタに接続します。Armadilloは通常DHCPでIPアドレスを取得しますので、DHCPが利用できるネットワーク環境を用意してください。

ターミナルソフトのインストール

PCとArmadilloをシリアルケーブルで接続したら、シリアルコンソールを利用するためのターミナルアプリケーションをインストールします。 様々な種類のターミナルソフトがありますが、おすすめはTeraTermです。 以降TeraTermの利用を前提として説明します

電源を入れる

TeratTermを起動します。

teraterm00.png
TeraTermの起動

はじめにSSHおよびシリアル接続を選択するダイアログが表示されます。 利用可能なシリアルポートがあれば、ダイアログの下部のシリアルポートが選択できます。この場合COM2がArmadilloに接続されているシリアルポートなので、COM2を選択します。

Armadilloに接続可能なシリアルポートがどれかわからない場合は、デバイスマネージャなどで調べることができます。 Windows7の場合、「コントロールパネル」->「システムとセキュリティー」->「システム」->「デバイスマネージャ」からアクセスできます。

device_manager.png
デバイスマネージャでシリアルポートを調べる

Armadilloに電源を入れると、以下のように起動します。

teraterm01.png
Armadilloの起動

ログインプロンプトが出たら起動完了です。アカウント名 root, パスワード rootでログインしてみてください。 ほぼ通常のLinuxのように利用できます。

teraterm02.png
Armadilloへのログイン

ifconfigコマンドを入力してArmadilloのIPアドレスを調べます。

  [root@a240-0 (ttyAM0) ~]# ifconfig
  eth0      Link encap:Ethernet  HWaddr 00:11:0C:05:07:60
            inet addr:192.168.0.12  Bcast:192.168.0.255  Mask:255.255.255.0
            inet6 addr: fe80::211:cff:fe05:760/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:5760 errors:0 dropped:0 overruns:0 frame:0
            TX packets:53 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
            Interrupt:39
  
  lo        Link encap:Local Loopback
            inet addr:127.0.0.1  Mask:255.0.0.0
            inet6 addr: ::1/128 Scope:Host
            UP LOOPBACK RUNNING  MTU:16436  Metric:1
            RX packets:9 errors:0 dropped:0 overruns:0 frame:0
            TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:0
            RX bytes:480 (480.0 B)  TX bytes:480 (480.0 B)

eth0がLANのインターフェースです。192.168.0.12 というのがこのArmadilloのIPアドレスです。 ブラウザでこのアドレスにアクセスしてみてください。

directaccess_to_armadillo.png
ブラウザからArmadilloへアクセス

AT AdminというArmadilloの管理ページが表示されるはずです。 Systemメニューを表示するには以下のIDとパスワードが必要です。

ID パスワード
admin admin

AT Adminのページが表示されない場合、ArmadilloにインストールされているromfsイメージがAT Adminに対応していない可能性がありますので、後述の「イメージの書き換え(Hermit-At)」で、デフォルトのイメージ (BaseではなくRecover) に書き換えてください。

Bonjourのインストール

AT AdminはブラウザからArmadilloの各種設定を行えて便利なのですが、ArmadilloのIPアドレスを毎回調べなければなりません。そこで、これを解決するために Bonjour (およびAvahi) を利用します。

BonjourはAppleが提唱するネットワーク上のサービスを自動的に検索して利用できるようにするためのサービスです。 Armadilloでは通常、AT-AdminというブラウザからArmadilloをリモート管理するためのサービスがBonjourから利用できるようになっています。 Bonjourのサービスを検索するためには、PCにBonjourがインストールされている必要があります。

Mac OS XではデフォルトでBonjourが利用できるようになっています。 LinuxではAvahiというBonjour互換サービス (Avahi) が利用できます。詳細な利用方法はディストリビューションごとのマニュアルを参照してください。

Windowsではデフォルトではインストールされていません。最も簡単にBonjourを導入する方法は iTunes をインストールすることです。

どうしてもiTunesをインストールしたくない場合は、アーカイバアプリケーションなどで、ダウンロードした iTunesSetup.exe を展開すると BonjourSetup.exe を抽出することもできます。

参考 (上記の方法でBonjourをインストールした場合は不要)

また、以下のApple Bonjour印刷サービスにもBonjourが同梱されています。(iTunesに同梱されているものよりバージョンが若干古いようです。)

現在ApplieではBonjour for Windows単体としては配布は行なっていませんが、かつて配布していたものを再配布しているサイトも幾つかあります。(ただし、古いバージョンしか入手できないようです。) 以下はAppleサイト以外のBonjourダウンロードサイトです。自己責任でご利用ください。

Firefox アドオンのインストール

FirefoxにはBonjourサービスを検索するアドオンが用意されています。

Firefoxで上記サイトをアクセスし、「+Firefoxに追加」をクリックしインストールしてください。 インストールするとアドレスバーの左側に、図のようなアイコンが現れます。

firefox_dnssd_addon_mark.png
Firefox DNSSD (Bonjour) アドオンのインストール

このアイコンをクリックすると

firefox_dnssd_services.png
Bonjourサービス一覧

同一ネットワークでArmadilloが動作している場合、AT Admin on axxx... といったメニューが表示されるかもしれません。これをクリックすると図のような AT Adminのサービス画面が表示されます。

firefox_dnssd_atadmin.png
BonjourからAT Adminへアクセス

ここから、Armadilloの様々な設定をブラウザから行うことができます。

Bonjourが正しくインストールさていない場合、以下のように No servicesと表示されます。

firefox_dnssd_noservices.png
Bonjourがインストールされていない場合

Internet Explorerによる検索

古いバージョンのBonjour (v1.0系) をインストールすると、Internet Explorer (IE) のエクスプローラバーにBonjourサービスを表示するアドオンがインストールされます。 (これはBonjour v1.0.6.2とIE9 (64bit) の組み合わせで動作しました。他のバージョンでも動作する可能性はありますが未検証です。)

ie_bonjour_exbar.png
メニューからBonjourを選択

図のようにメニューから「表示(V)」->「エクスプローラーバー(E)」->「Bonjour」を選択すると、Bonjourのサービス一覧を表示するペインが左側に現れます。 メニューが表示されない場合、メニューが非表示になっている可能性があります。Altキーを押してメニューを表示してください。 (メニューにBonjourがない場合、BonjourとIEのバージョンがそれぞれ動作しない組み合わせである可能性があります。Firefoxを利用することをおすすめします。)

ie_bonjour_services.png
IEによりBonjourサービスの表示

同一ネットワークでArmadilloが動作している場合、AT Admin on axxx... といったメニューが表示されるかもしれません。これをクリックすると、Armadillono管理サービスAT Adminの画面がブラウザに表示されます。

Bonjourがうまく機能しない場合

ファイヤウォールが動作している場合、Bonjourがうまく機能しないことがあります。 その場合、UDPポート5353を開放するかファイヤウォールをOFFにしてください。

イメージの書き換え

AT Adminが使えない場合、もしくは独自のシステムに入れ替える場合、Armadillo上のLinuxシステムを書き換える必要があります。 ArmadilloのFlashメモリには

  • ブートローダ (bootloader): ブートローダは起動時に一番始めに動き出すプログラム。LinuxのカーネルやユーザランドをFlashメモリからRAMに展開・ロードします。
  • Linuxカーネル (kernel): Linux のOS自身。ブートローダによりロードされたあと動き出します。
  • ユーザランド (romfs): ファイルシステムが格納されています。
  • コンフィギュレーション (config): 設定ファイルを保存する領域。

といった領域があり、それぞれ必要に応じて入れ替えることができます。 各領域は、メモリ上で実際に動作する際の状態(あるいはそれを圧縮した状態)で格納されており、これを通常イメージと呼びます。 ブートローダが他の領域をメインメモリ(RAM)利用域にコピーまたは展開して、システムが動き出します。 bootloaderおよびconfigは通常入れ替える必要はほとんどなく、システムの構成を変更する際は主にLinuxカーネルとユーザランドを入れ替えます。

LinuxカーネルはLinuxのOSそのものであり、すべてのアプリケーション・プログラムはLinuxカーネルの制御下で動作します。 アプリケーション・プログラムが利用するファイル、メモリやデバイスの管理・リソース割り当て等を行います。 Linuxのカーネルの書き換えは、主にカーネルにデバイスドライバを追加(または削除)したい場合、Linuxカーネルの機能を有効(または無効)にしたい場合などに行います。

一方、ユーザランドはシステムが利用するプログラム等を含むLinuxのファイルシステムです。 新しいコマンドやライブラリ、アプリケーション・プログラムを追加したい場合はユーザランドをコンパイルしなおして、ArmadilloのFlashメモリ内のユーザランドイメージを書き換える必要があります。

Armadilloでは主に以下の2種類のイメージの書き換え方法があります。

Hermit-Atを利用した書き換え

最も基本的な書き換え方法です。 PC上で動作するHermit-Atというアプリケーションからシリアルポート経由でFlashメモリを書き換えます。 シリアルポートを利用するため、後述のnetflashより遅いという欠点がありますが、Armadillo上のLinuxシステムが動作していなくても、イメージを書き換えることができます。

システムのイメージが不正な状態で起動しない場合などはこの方法で書き換えて復活させるしか方法がありません。

Hermit-AtはアットマークテクノのWebサイトからダウンロードできます。

また、デフォルトのカーネルイメージとユーザランドイメージに書き換える場合は、以下の2つのイメージもダウンロードしてください。

ジャンパピンの変更

ArmadilloのDCコネクタ付近に4本(2x2)のピンヘッダが出ています。 このうち、逆サイドのLANコネクタやUSBコネクタに近い2ピンをジャンパでショートさせます。 これで、hermitによるROM書き込みモードになります。 この段階ではまだArmadilloに電源を入れないでください。

Hermit-At Win32 の起動

hermit.exe を起動するとこのようなウインドウが現れます。

hermit_win32_start.png
Hermit-At Win32 起動画面

まず、使用するシリアルポートを選択します。 ここでは、COM2がArmadilloに接続されているシリアルポートです。

Memmapボタンを押してみてください。PCとArmadilloが正しく接続されており、ArmadilloがHermitのダウンロードモードになっていれば、メモリマップが表示されます。

hermit_win32_memmap.png
Hermit-At Win32 Memmap画面

表示を見てみると、RAMとFLASH領域があり、さらにFLASH領域は
  • config
  • userland
  • kernel
  • bootloader に分かれていることがわかります。

これから書き換えようとしているのは、kernel のカーネル領域と、userlandのユーザランド領域です。

カーネルの書き換え

まず、カーネルの書き換えを行います。 Erase ボタンを押し、Regionのプルダウンで kernelを選択し、実行ボタンを押します。

hermit_win32_erase_kernel.png
Hermit-At Win32 Erase画面

ダイアログが表示されカーネル領域が削除されます。

次にダウンロードボタンを押し、
  • Image: 上でダウンロードしたカーネルイメージ linux-a2XX-x.yz.bin.gz
  • Region: kernel を選択します。(カーネルイメージのファイル名は使用しているArmadilloの種類、イメージのバージョンに応じて適宜読み替えてください。)
    hermit_win32_download.png
    Hermit-At Win32 Download画面

hermit_win32_download_filadialog.png
Hermit-At Win32 ファイル選択画面

linux.bin.gz (拡張子が見えず linux.bin と表示されますが、種類がGZファイルとなっているほう) を選択します。以上が終わったら実行ボタンをクリックします。 書き込みダイアログが表示され、数分でカーネルの書き込みは終了します。

ユーザランドの書き換え

次にユーザランドを書き換えます。 カーネル同様、Erase メニューで userland を削除してからDownloadメニューで、

  • Image: 上でダウンロードした romfs-a2XX-recover-x.yz.img.gz
  • Regioin: userland

を選択し、書き込みを行います。 ユーザランドはファイルサイズが大きいため、書き換えには十数分かかります。

以上で、カーネルとユーザランドの書き換えは終了です。

Netflashを利用した書き換え

NetflashはローカルのファイルまたはインターネットからイメージファイルをダウンロードしFlashメモリを直接書き換えるツールです。 シリアルコンソールからArmadilloにログインしnetflashコマンドを利用する方法と、AT Adminから利用する2通りの方法があります。

コンソールから書き換え

netflashは以下の様なオプションを取ります。

 usage: netflash [-bCfFhijklntuv?] [-c console-device] [-d delay] [-o offset] [-r flash-device] [net-server] file-name

  • r オプションで指定するFlashデバイスには以下の様な種類があります。

 [root@a240-0 (ttyAM0) ~]# ls /dev/flash/
 bootloader  config      kernel      nand        nandblock   userland

デバイスファイル名 意味
/dev/flash/bootloader ブートローダ領域
/dev/flash/config config領域
/dev/flash/kernel カーネル領域
/dev/flash/nand ---
/dev/flash/nandblock ---
/dev/flash/userland ユーザランド領域

利用するのは主に /dev/flash/kernel と /dev/flash/userland です。

カーネルを書き換える場合は以下のように入力します。

 [root@a240-0 (ttyAM0) ~]# netflash -k -n -r /dev/flash/kernel http://armadillo.atmark-techno.com/files/downloads/armadillo-240/images/linux-a240-1.10.bin.gz
  : (中略)
 netflash: programming FLASH device /dev/flash/kernel
 .......................
 Restarting system.

書き換えが終わると再起動します。 ユーザランドを書き換える場合は以下のように入力します。

 [root@a240-0 (ttyAM0) ~]# netflash -k -n -r /dev/flash/userland http://armadillo.atmark-techno.com/files/downloads/armadillo-240/images/romfs-a240-recover-1.11.img.gz
  : (中略)
 netflash: programming FLASH device /dev/flash/userland
 .......................................................................................................
 Restarting system.

こちらも書き換えが終わるとシステムが再起動されます。 ユーザランドの書き換えも2分程度で終わります。シリアル経由で書き換えた場合に比べ非常に早く書き換えが可能です。

AT Adminから書き換え

ArmadilloでAT Adminが動作していれば、Systemメニューから書き換えを行うことができます。

AT AdminのSystemメニューをクリックし、Frimwareサブメニューに入ります。

atadmin_firmware00.png
AT Admin firmware書き換え画面

「Get firmware options」をクリックすると、利用可能なユーザランドイメージとカーネルイメージが自動的に取得され、プルダウンメニューから選択可能になります。

通常、最も新しいバージョンのイメージを選択します。

atadmin_firmware01.png
プルダウンメニューから書き換えるイメージを選択 (ユーザランド)

Allow all image types にチェックを入れ、「Update userland」を押すと、イメージの書き換えが始まります。

atadmin_firmware02.png
イメージ書き換えの開始

atadmin_firmware03.png
イメージ書き換え

カーネルで1分程度、ユーザランドで2-3分程度で書き替えが終わります。書き換えが終わると、元のFirmware画面に戻ります。

コンポーネントの起動

サンプルのRTコンポーネントをArmadillo上で起動し、PC上のコンポーネントと通信させてみます。 PC上にOpenRTM-aist C++ (の最新版) をインストールしてください。 以下ではPCのOSがWindowsであることを前提として話を進めます。

OpenRTM-aist用イメージへの書き換え

OpenRTM-aistのコンポーネントをUSBメモリから自動起動するためのカーネルとユーザランドイメージへ書き換えを行います。

AT Admin の「System」->「Firmware」メニューにアクセスします。

atadmin_firmware04.png
Firmware ダウンロードサイトの変更

上図のように、ページ下部

 Current firmware download location: http://download.atmark-techno.com/armadillo-2x0/images/ change

change をクリックします。 下図のように、Firmwareのダウンロードサイトを入力する画面になりますので、

 http://openrtm.org/pub/Armadillo/images/Armadillo-240

と入力しUpdateボタンを押します。

atadmin_firmware05.png
OpenRTM-aist 用 Firmware ダウンロードサイトの入力

先ほどのFirmwareページに戻りますので、「Get firmware options」 ボタンを押すと、上記サイトのFirmwareオプションが選択できるようになります。

atadmin_firmware06.png
OpenRTM-aist 用 Firmware の選択

幾つかあるイメージのうち、以下のイメージを使用します。

  • ユーザランド (Userland): romfs-a240-openrtm-x.y.img.gz
  • カーネル (Kernel): linux-a240-openrtm-x.y.bin.gz

x.y は最新のバージョンに読み替えてください。

上記で説明したように、ユーザランドとカーネルをそれぞれ書き換えてください。 (ユーザランドを書き換えるときはAllow all image types をチェックしてください。)

flatfsdによるconfigファイルの更新

Armadilloは設定を恒久的に保存できるようにフラッシュメモリの一部にconfig領域を持っています。 以前に使用されたことがあるArmadilloの基盤の場合、config保存領域 (/etc/config 以下) に古い設定ファイルが残っているケースがあります。 romfsを更新したので、それにあわせてconfigファイル群も更新する必要があります。Armadilloを起動、ログインしシェルから

 # flatfsd -w

と入力すると、romfsの /etc/default のファイルが config 領域に書き込まれます。 flatfsdコマンドの主なオプションは以下の通りです。

  • -r: config領域から /etc/config に設定ファイルをロードする
  • -s: /etc/config のファイルを config領域に保存する
  • -w: /etc/default のデフォルトconfigファイルをconfig領域に書き込み設定を初期化する。

USBメモリの準備

空のUSBフラッシュメモリを用意してください。 以下のZIPファイルをダウンロードし、USBメモリ上に展開してください。 USBメモリのルートディレクトリに boot.sh が配置されるようにします。

このファイルにはOpenRTM-aistのサンプル SeqInComp が含まれています。ArmadilloにUSBメモリを挿入すると、自動的にSeqOutCompが起動します。 このSeqInCompと、PC上のSeqOutCompを接続してみます。

PC上でネームサーバを起動しこれを利用するので、USBメモリ上のrtc.confのネームサーバ位の設定を書き換えます。PCのアドレスが仮に 192.168.0.10 であるばあい、rtc.confの corba.nameservers の設定を以下のように書き換えます。

 corba.nameservers: 192.168.0.10

ネームサーバの起動

PC上でネームサーバを起動します。Windowsの場合は、スタートメニューからOpenRTM-aistのtoolフォルダ内にある「Start Naming Service」から起動します。

「OpenRTM-aist」->「C++」->「」 PCに複数のネットワークインターフェースが存在する場合は注意が必要で、 rtm-naming.bat 内の

OMNIORB_HOST

の値をArmadillo が接続されているネットワークに接続されているインターフェースのIPアドレスにセットする必要があるかもしれません。

SeqInCompの起動

OpenRTM-aistのサンプルフォルダ内のSeqInCompを起動します。 ネームサービス同様、PCにネットワークインターフェースが複数ある場合は、SeqInComp.exeと同じフォルダにあるrtc.confを書き換える必要があるかもしれません。

 corba.nameservers: 192.168.0.10
 corba.endpoints: 192.168.0.10:

USBメモリの挿入

ArmadilloにUSBメモリを挿入します。もしくは、USBメモリを挿した状態でArmadilloを起動します。 うまく行けば、Armadillo上でSeqOutCompが起動します。シリアルコンソールをつないでいる場合はPCからArmadilloにログインし、mountコマンドやpsコマンドで状態を確認します。

[root@a240-0 (ttyp0) /home/openrtm]# mount

   :中略
 /dev/sda1 on /home/openrtm type vfat (rw,nodiratime,fmask=0000,dmask=0022,codepage=cp932,iocharset=euc-jp)
 [root@a240-0 (ttyp0) /home/openrtm]# ps
  : 中略
  854 root       7396 S < /home/openrtm/rtc/SeqOutComp -f /home/openrtm/rtc.con
  855 root       7396 S < /home/openrtm/rtc/SeqOutComp -f /home/openrtm/rtc.con
  856 root       7396 S < /home/openrtm/rtc/SeqOutComp -f /home/openrtm/rtc.con
  857 root       7396 S < /home/openrtm/rtc/SeqOutComp -f /home/openrtm/rtc.con
  858 root       7396 S < /home/openrtm/rtc/SeqOutComp -f /home/openrtm/rtc.con

USBメモリがマウントされ、SeqOutCompが起動していることがわかります。

コンポーネントの接続

RTSystemEditorを起動します。「OpenRTM-aist」→「C++」→「tools」->「RTSystemEditor」から起動します。 ネームサービスビューの上部のコンセントのアイコンのボタンをクリックし、上記のPCアドレス (192.168.0.10) を入力しネームサーバいへ接続します。

正常であれば、図のようにSeqInとSeqOutの2つのコンポーネントが見えるはずです。 メニューバーのONボタンをクリックし、中央にエディタを開きます。 これら両方のコンポーネントを、ネームサービスビューから中央のエディタへドラッグアンドドロップします。

armadillo_rtse00.png
SeqInとSeqOut

8個のポートがあるコンポーネントがそれぞれ起動します。ポート間をRTsystemEditorで接続し、メニューバーの緑の再生ボタンのようなAll Activateボタンを押すと、2つのコンポーネントが緑になりActive化され動き出します。

armadillo_rtse01.png
SeqInとSeqOutのActivate

SeqInコンポーネントのコンソール画面に様々な数字がスクロールして表示されます。 Armadillo上で動いているSeqOutCompからPC上で動いているSeqInCompへデータが送られていることが分かります。

これで、Armadillo上でRTコンポーネントを動作させる方法が何となくわかったのではないかと思います。次は、実際にコンポーネントのクロス開発環境を構築する方法について説明します。

開発環境 ATDE2 のセットアップ

開発環境 ATDE2 のセットアップ

このドキュメントでは、アットマークテクノからリリースされているArmadiilo用の開発環境ATDE2にRTコンポーネントのためのクロス開発環境を構築する方法について説明します。 ここで説明する方法で設定済みの開発環境は ATDE2 for OpenRTM-aist として下記にてリリースされていますので、それを利用する場合は以下に説明する作業は不要です。 また、次の章「OpenRTM-aistのクロスコンパイル」についてもATDE2 for OpenRTM-aistでは実行済みですので不要です。

ATDE2 for OpenRTM-aist のインストール

ATDE (Atmark Techno Development Environment) 2は、Armadillo-200シリーズ用の開発環境です。 実体は、VMware上で動作する Debian GNU/Linux 4.0 (“Etch”)をベースにしたVMイメージです。 使用するにはPCにVMwareをインストールする必要があります。

ATDE2 for OpenRTM-aist は Armadillo-200 シリーズ上で動作する RTコンポーネントを開発するため、ATDE2にOpenRTM-aistと各種ツールを事前にインストールした開発環境です。

VMwarePlayerのインストール

ATDEを動作させるにはVMwareをインストールする必要があります。 VMwareはVMware, Incが販売している仮想PC環境で、WindowsやLinux (あるいはMac OS X上)、または独自のOS上で動作します。 VMwareにはいろいろなバージョンがありますが、ここでは無償で利用できるWindows版のVMware Playerを利用します。

まず、VMware Playerのインストーラをダウンロードします。

Webページの手順に従ってVMware Playerのインストーラをダウンロードします。 ダウンロードしたインストーラを起動し、指示に従ってインストールします。

vmwareplayer_install0.jpg
インストーラの起動

インストール後、再起動を求められますので再起動します。 再起動後、スタートメニューからVMware Playerを起動します。

vmwareplayer_install4.jpg
VMware Playerの起動

起動を確認したら、ひとまず右上の×ボタンを押し終了します。

ATDE2 for OpenRTM-aistのダウンロード

ATDE2 for OpenRTM-aist を以下のリンクからダウンロードします。

説明 ファイル名 MD5 サイズ
ATDE2 for OpenRTM-aist atde2_for_openrtm_20121005.zip cd22a133c1d77a8e8c87c36aad5e6886 1776 MB

なお、オリジナルのATDE2は、以下のアットマークテクノからダウンロード可能です。ATDE2インストールガイドは、ATDE2 for OpenRTM-aist のインストールにおいても参考になりますので、一読することをお勧めします。

※ATDEおよびドキュメントが更新されている可能性があるので、ATDEダウロードサイトでご確認ください。

ダウンロードしたZIPファイルを展開すると、atde2_for_openrtm というフォルダができます。

atde2_folder.png
ATDE2の展開

フォルダの内部を見てみます。atde2.vmx (種類:VMwre構成ファイルとなっている方) がVMwareの構成ファイルです。 このファイルをダブルクリックすると、VMware Player上でこの仮想マシン(VM)が起動します。

atde2_folder_inside.png
ATDE2フォルダ

ATDE2の起動とログイン

前述のように、ATDE2のフォルダ内のatde2 (種類:VMwre構成ファイルとなっている方, 実際のファイル名は atde2.vmx) をダブルクリックするとこのVMが起動します。

もう一つの起動方法としては、スタートメニューから VMware Playerを起動し

  • ファイル(F)
    • 仮想マシンを開く(O)

から、上記のatde2.vmx を指定する方法があります。

いずれかの方法で起動すると、以下のような画面が現れます。

atde2vm0.png
ATDE2 (Linux/Debian) の起動画面

VMwareの画面上をクリックすると、制御がVMwareに移ります。Enterを押すか、しばらく待つとLinux (Debian) が起動します。 起動すると以下のような画面が現れます。(起動中に画面中央に各種サービスの起動画面が現れ、update-notifierで止まることがあるかもしれませんが、クリックすると消えますのでそのまま進めてください。)

atde2vm1.png
ATDE2 (Linux/Debian) の起動直後の画面

ATDE2はデフォルトでユーザ名 atmark でログインした状態で起動します。 システムは以下のユーザアカウントおよびパスワードが設定されています。

ユーザ名 パスワード 権限
atmark atmark 一般ユーザ
root root 特権ユーザ

なお、非常に簡単なパスワードしか設定されていませんので、長時間起動しておく場合はパスワードを変更したほうがよいでしょう。 以下、安全な環境下で、開発時のみ短時間起動すると仮定して、上記の設定のまま解説を進めます。

ネットワーク接続の確認

VMがネットワークにアクセスできるか確認します。

アプリケーション->インターネット->Iceweaselウェブ・ブラウザ からWebブラウザを起動します。

atde2vm2.png
Iceweaselウェブ・ブラウザ

URLにopenrtm.org等を入力し、Webページが表示されることを確認します。

atde2vm3.png
openrtm.orgへアクセス

ネットワークにつながらない場合、
  • VMware Playerを実行しているPCがネットワークに接続されているか?
  • VMware Playerをインストール後再起動したか?
  • VMware Playerのメニュー仮想マシン(V)->取り外し可能デバイス(D)->ネットワークインターフェース にチェックマークがついているか? 等を確認してください。

システムのセットアップ

ATDE2 for OpenRTM-aist では、以下の設定がすでに行われていますので不要です。 次のRTコンポーネントのクロスコンパイルの項に進んでください。

アットマークテクノが配布しているオリジナルのATDE2を自分で一からセットアップする際の参考にしてください。

ATDE2を利用するために、いくつか必要な事項を設定しておくと便利なのですが、以下の一括設定スクリプトを利用すると、簡単にセットアップができます。 なお、このスクリプトで行なっている詳しい内容についても説明します。

一括設定スクリプトによるセットアップ

一括設定スクリプトを使用すると、
  • sources.list の修正
  • sshのインストール
  • sambaのインストール・設定 を一括で行うことができます。

こちら一括設定スクリプトをダウンロードします。 ダウンロードしたスクリプトに実行権限を与え、実行します。

 atmark@atde:~$ wget http://svn.openrtm.org/Armadillo/trunk/atde2/tools/atde2setup.sh
 atmark@atde:~$ chmod 755 atde2setup.sh
 atmark@atde:~$ ./atde2setup.sh
atde2setup0.png
一括設定スクリプトのダウンロード

現在のパスワード (atmark) を求められますので入力します。

 atmark@atde:~$ ./atde2setup.sh
 [sudo] password for atmark: パスワードを入力
   :
  パッケージデータベースの取得
   :
 Do you want to install ssh? (y/n) <- yを入力
   :
 以降全てyを入力
 ワークグループはデフォルトのWORKGROUPでOK
 WINSの質問に関してはデフォルトのNO
   :
 New SMB password: atmark
 Retype new SMB password: atmark
   :
 Stopping Samba daemons: nmbd smbd.
 Starting Samba daemons: nmbd smbd.
 atmark@atde:~$

以上で、基本的設定は終了です。以下、スクリプトで行なっている内容を自ら行う場合の作業手順を示します。

source.listの編集

公開されているATDE2の環境では、パッケージのリポジトリのURLが古いため、そのままではapt-getなどでパッケージを取得することができません。 以下のように、/etc/apt/soruces.list を編集する必要があります。以降の作業を行うために、この作業は必ず行なってください。

 $ sudo cp /etc/apt/sources.list /etc/apt/sources.list.org
 $ sudo sed -i 's/ftp.jp/archive/g' /etc/apt/sources.list
 $ sudo apt-get update

sources.list を source.list.orgとしてバックアップを取り、sources.list内の ftp.jp を全て archives に置換しています。 その後、apt-get update でデータベースを更新しています。

sshのインストール

必須ではありませんが、sshをインストールしておけば、TeraTermなどでログインして作業を行うことができます。 通常、VMwareのゲストOSからホストOS、またはその逆にコピー&ペーストができないので、ターミナルで接続して作業するほうが便利な場合があります。

 $ sudo apt-get install openssh-server
 # パスワード: atmark を入力
 # すべてYと答える

次に、このゲストOSのIPアドレスを調べます。

 atmark@atde:~$ /sbin/ifconfig eth0
 eth0      Link encap:イーサネット  ハードウェアアドレス 00:0c:29:df:22:59 
           inetアドレス:192.168.0.2 ブロードキャスト:192.168.0.255  マスク:255.255.255.0
           inet6アドレス: fe80::20c:29ff:fedf:2259/64 範囲:リンク
           UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
           RXパケット:70593 エラー:0 損失:0 オーバラン:0 フレーム:0
           TXパケット:20438 エラー:0 損失:0 オーバラン:0 キャリア:0
       衝突(Collisions):0 TXキュー長:1000 
           RXバイト:17346973 (16.5 MiB)  TXバイト:11133415 (10.6 MiB)
           割り込み:18 ベースアドレス:0x2024 

192.168.0.2 がこのゲストOSのアドレスです。TeraTermなどで、このアドレスにsshで接続してみます。

teraterm_address.png
TeraTerm で接続する

TeraTermの場合、known hostにこのホストを追加するかどうか尋ねられますので、Yesと答えて次に進みます。 IDとパスワードをたずれられますので、上と同様にatmark/atmarkと入力します。

teraterm_login.png
ログインする

teraterm_loggedin.png
ログイン後の画面

なお、DHCP接続の場合、IPアドレスが起動毎に変わる可能性があり、sshで接続する際に毎回IPアドレスを使用する必要があるかもしれません。 その場合、ネットワーク接続方式を「ブリッジ接続」から「NAT」にし、固定IPアドレスを設定すると便利です。 /etc/network/interfaces を以下の例ように書き換えることで固定IPアドレスを設定することができます。

 auto eth0
 iface eth0 inet static
   address   192.168.0.2
   network   192.168.0.0
   netmask   255.255.255.0
   broadcast 192.168.0.255
   gateway   192.168.0.1
   dns-nameservers 192.168.0.1

なお、詳細についてはLinuxおよびDebianの参考書、Webページを参照してください。

sambaのセットアップ

VMwareのホストOSがWindowsの場合、ホストOSとゲストOS間でファイルのやり取りをしたいことがよくあります。 例えば、ゲストOSでコンパイルしたバイナリを、Armadilloで実行する際にUSBメモリにコピーする場合、ゲストOSで直接USBメモリを読み書きすることもできますが、Windows上でゲストOSからUSBメモリへファイルをコピーしたほうが便利なこともあります。

ゲストOSにSambaをインストールしておけば、簡単にゲストOSのファイルを操作することができます。

まず、sambaをインストールします。Sambaインストール後に、Sambaのコンフィギュレーションファイル /etc/samba/smb.confのバックアップをとっておきます。

 atmark@atde:~$ sudo apt-get install samba
 atmark@atde:~$ sudo mv /etc/samba/smb.conf /etc/samba.smb.conf.org

ホームの下に、smb.conf という名前で以下の内容のファイルを作成します。

 [global]
    workgroup = WORKGROUP
    server string = %h server
    dns proxy = no
    log file = /var/log/samba/log.%m
    max log size = 1000
    syslog = 0
    panic action = /usr/share/samba/panic-action %d
    encrypt passwords = true
    passdb backend = tdbsam
    obey pam restrictions = yes
    unix password sync = yes
    passwd program = /usr/bin/passwd %u
    passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
    pam password change = yes
 [homes]
    comment = Home Directories
    browseable = yes
    read only = no
    create mask = 0755
    directory mask = 0755
    valid users = %S

バックアップをとったファイルの代わりに、上記の内容のファイルを /etc/samba/以下にコピーします。

 atmark@atde:~$ cat > smb.conf
 # 上の内容をコピペ、Ctrl+Dを押す。
 atmark@atde:~$ sudo cp smb.conf /etc/samba

atmarkというユーザのパスワードを設定します。

 atmark@atde:~$ sudo smbpasswd -a atmark
 # パスワード: atmark を入力

sambaサービスを再起動します。

 atmark@atde:~$ sudo /etc/init.d/samba restart

これで、samba経由でゲストOS上のファイルをWindowsから操作できるようになりました。 Windowsでエクスプローラ(≠インターネットエクスプローラ)を起動します。(マイコンピュータをクリック or Windowsキー+e)

先ほど調べたIPアドレス (上の例では 192.168.0.2) の前にマークを2つつけて、エクスプローラのアドレスバーに入力します。

 \\192.168.0.2
smb_connectioin.png
エクスプローラによる接続

初回接続時にはIDとパスワードが訊かれますので、先ほど設定したIDとパスワード (atmark/atmark) を入力します。

smb_login.png
エクスプローラによる接続

自分のホームフォルダがatmarkおよびhomeという名前のフォルダとして参照できます。

smb_homefolder.png
ホームフォルダ

以上でATDE2の基本的設定は終了です。

RTコンポーネントのクロスコンパイル

RTコンポーネントのクロスコンパイル

ここでは、Armadillo上で実行するRTコンポーネントのビルド方法をについて説明します。 コンポーネントのビルドは、旧式 (RTCBuilder-1.0) のMakefileベースの方法と、新式 (RTCBuilder-1.1以降) のCMakeベースの方法の2通りがあります。

Makefile がすでにある場合(旧式)

古いRTCBuilderで生成したコンポーネントには、UNIX系システム用のMakefileが付属していました。この場合は、非常に簡単で、環境変数CXXにarm用コンパイラ /usr/bin/arm-linux-gnu-g++ を指定するだけでも可能です。

 $ CC=/usr/bin/arm-linux-gnu-g++ make

ただし、ATDE2 for OpenRTM-aist に付属の rtc-make-cross を使用すると、Armadillo-400シリーズでRTコンポーネントをビルドするときなども、同じ方法でビルドが可能です。 ここでは、rtc-make-cross を使用した方法について説明します。

OpenRTM-aistに付属のサンプルコンポーネント SeqOutComp を例に、ソースからクロスコンパイルしてみます。

ソース (SeqOutComp) のコピー

OpenRTM-aistをインストールすると ${prefix}/share/openrtm-x.y/example/src 以下にサンプルコンポーネントのソースコードがインストールされます。 ATDE2 for OpenRTM-aist では、/usr/arm-linux-gnu/share/openrtm-1.1/example/src/ 以下にソースコードがインストールされています。これをコピーします。

 atmark@atde:~$ mkdir tmp
 atmark@atde:~$ cd tmp
 atmark@atde:~/tmp$
 atmark@atde:~/tmp$ cp -r /usr/arm-linux-gnu/share/openrtm-1.1/example/src/SeqIO .
 cd SeqIO
 atmark@atde:~/tmp/SeqIO$ ls
 Makefile.SeqIn   README.SeqOut  SeqInComp.cpp  SeqOutComp.cpp  rtc.conf
 Makefile.SeqOut  SeqIn.cpp      SeqOut.cpp     component.conf
 README.SeqIn     SeqIn.h        SeqOut.h       gen.sh

ディレクトリにはSeqInComopとSeqOutCompのソースコードが含まれています。

rtc-make-crossによるビルド

ここで、コンポーネントをビルド剃るには rtc-make-cross を使用します。 ATDE2 for OpenRTM-aist にすでにインストールされていますが、こちらからもダウンロードできます。

ダウンロードした場合、以下のようにして /usr/bin 等にインストールするとよいでしょう。

 $ chmod 755 rtc-make-cross
 $ sudo install rtc-make-cross /usr/bin

-h オプションで rtc-make-cross のヘルプを見てみます。

 atmark@atde:~/tmp/SeqIO$ rtc-make-cross -h
 Usage: rtc-make-cross -a <arch_name> [make options]
 
     -a     target architecture name
     -h     print this help
 
 Available architectures:
    arm powerpc

-a オプションでターゲットのアーキテクチャを指定して、makeコマンドの代わりに使用します。利用できるアーキテクチャのキーワードはここでは、arm と powerpc の2種類のようです。 rtc-make-cross は環境にインストールされているクロス開発環境を調べて、どのアーキテクチャのクロスコンパイルが可能かをヘルプで表示します。 ATDE2はデフォルトで arm と powerpc 用のクロス開発がインストールされているので、このように表示されます。Armadillo-200シリーズ用の実行ファイルは arm アーキテクチャとしてコンパイルする必要がありますので -a arm というオプションを指定します。

また、SeqOutComp をコンパイルするには Makefile.SeqOut という Makefile を使用します。makeコマンドでは特定のMakefileを指定するには -f オプションを使用しますので、-f Makefile.SeqOutを指定します。

 atmark@atde:~/tmp/SeqIO$ rtc-make-cross -a arm -f Makefile.SeqOut
 Target architecture is arm (arm-linux-gnu)
 Toolchain found.
   CC:  /usr/bin/arm-linux-gcc
   CXX: /usr/bin/arm-linux-g++
   AR:  /usr/bin/arm-linux-ar
   LD:  /usr/bin/arm-linux-ld
 rm -f SeqOut.o
 /usr/bin/arm-linux-g++ `rtm-config --cflags` -c -o SeqOut.o SeqOut.cpp
 rm -f SeqOut.so
 /usr/bin/arm-linux-g++ -shared -o SeqOut.so SeqOut.o   `rtm-config --libs`
 rm -f SeqOutComp.o
 /usr/bin/arm-linux-g++ `rtm-config --cflags` -c -o SeqOutComp.o SeqOutComp.cpp
 /usr/bin/arm-linux-g++ -o SeqOutComp SeqOut.o   SeqOutComp.o `rtm-config --libs
 atmark@atde:~/tmp/SeqIO$ ls -al SeqOutComp
 -rwxr-xr-x 1 atmark atmark 283828 2012-09-08 01:32 SeqOutComp

作成された SeqOutComp というファイルがSeqOutCompコンポーネントの実行ファイルです。

USBメモリファイルセットの作成

作成されたコンポーネントをUSBメモリへコピーします。USBメモリへのコピーには、ATDE2 for OpenRTM-aist に付属の rtc2usbmem コマンドを使用します。

ATDE2 for OpenRTM-aist にすでにインストールされていますが、こちらからもダウンロードできます。

ダウンロードした場合、以下のようにして /usr/bin 等にインストールするとよいでしょう。

 $ chmod 755 rtc-2usbmem
 $ sudo install rtc2usbmem /usr/bin

rtc2usbmemコマンドは、指定したRTコンポーネントとその依存ライブラリを探して、指定したディレクトリへコピーします。また、Armadilloに挿入した際にRTCを自動起動するためのブートスクリプトとrtc.confも指定ディレクトリへコピーします。 RTCが依存するライブラリを調べ、一つ一つコピーする必要が無いので、非常に簡単にArmadilloに挿入するUSBメモリファイルセットを作成することができます。

-hオプションを指定してヘルプを見てます。

 atmark@atde:~/tmp/SeqIO$ rtc2usbmem -h
 
 Usage: rtc2usbmem -d <dir> -r <rtc> -l <libdir>
 
   This script creates a directory to be copied to USB memory
   for Armadillo execution environment.  One or more RTCs can be
   specified by -r and are copied to rtc directory.  Dependent
   libraries are automatically analyzed and copied to lib
   directory.  boot.sh to launch RTCs and rtc.conf for RTCs are
   also created.
 
     -a           Target architecture name
     -d <dir>     Target directory
     -r <rtc>     Target RTC binary
     -l <libdir>  Library search path
     -x           Do not copy RTM related libraries
     -h           Print this help
 
 Available architectures:
    arm powerpc
 
 EXAMPLE
   $ cd my_component_dir
   $ ls
   mycomponent        mycomponent.so
   $ rtc2usbmem -d /tmp/usbmem -r mycomponent -l . -l ../deplibdir
  

オプションの意味は以下のとおりです。

オプション 意味
-a ターゲットアーキテクチャ名を指定。-rで指定されるRTCのアーキテクチャと同一である必要がある。指定しなければRTCのアーキテクチャが利用される。
-d <dir> ファイルをコピーする先のディレクトリ。既にディレクトリがある場合、削除するかどうか途中で尋ねられる。デフォルトは /tmp/usbmem。
-r <rtc> 対象となるRTコンポーネント。複数指定可能。
-l <libdir> 依存ライブラリを検索するパスを指定。複数指定可能。
-x libRTM,libcoiなどRTミドルウエア関連ライブラリをコピーしない。RTC以外のプログラムとその依存ライブラリファイルセットを作成するときなどに利用。
-h ヘルプの表示。

必須なのは、RTCを指定する -r オプションです。ここでは、ホームディレクトリに seqout というディレクトリを作成しそこに必要なファイルセットをコピーすることにします。 実行結果は以下のようになります。

 atmark@atde:~/tmp/SeqIO$ rtc2usbmem -r SeqOutComp -d ~/seqout
 
 Now Armadillo's USB memory image is created.
 Target architecture:  arm
 Target directory:     /home/atmark/seqout
 Target RTCs:          SeqOutComp
 Library search path:  /usr/arm-linux-gnu
 
 Searching lib under /usr/arm-linux-gnu
 copying  /usr/arm-linux-gnu/lib/libRTC-1.1.0.so -> /home/atmark/seqout/lib
 Searching lib under /usr/arm-linux-gnu
 copying  /usr/arm-linux-gnu/lib/libcoil-1.1.0.so -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libuuid.so.1 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libdl.so.2 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libpthread.so.0 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libomniORB4.so.1 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libomnithread.so.3 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libomniDynamic4.so.1 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/debug/libstdc++.so.6 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libm.so.6 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libc.so.6 -> /home/atmark/seqout/lib
 copying /usr/arm-linux-gnu/lib/libgcc_s.so.1 -> /home/atmark/seqout/lib
 copying SeqOutComp -> /home/atmark/seqout/rtc
 /home/atmark/seqout/boot.sh created.
 /home/atmark/seqout/rtc.conf created.
 
 NOTE:
   Edit /home/atmark/seqout/rtc.conf for your environment.
 
 Target binaries have been copied to: /home/atmark/seqout

コピーされたファイルを見てみます。

 atmark@atde:~/tmp/SeqIO$ cd /home/atmark/seqout/
 atmark@atde:~/seqout$ ls -R
 .:
 boot.sh  lib  rtc  rtc.conf
 
 ./lib:
 libRTC-1.1.0.so   libdl.so.2     libomniDynamic4.so.1  libpthread.so.0
 libc.so.6         libgcc_s.so.1  libomniORB4.so.1      libstdc++.so.6
 libcoil-1.1.0.so  libm.so.6      libomnithread.so.3    libuuid.so.1
 
 ./rtc:
 SeqOutComp

libディレクトリに依存ライブラリ、rtcディレクトリにRTコンポーネントがコピーされています。

このディレクトリをUSBメモリにコピーしてArmadilloに挿入すると、コンポーネントが自動的に起動します。

CMakeList.txt がある場合 (新式)

コンポーネントのトップディレクトリにCMakeList.txtがある場合は、RTCBuilder-1.1以降で作成されたコンポーネントになります。 ビルドにはCMakeを使用します。CMakeはMakefileやVisual C++用のプロジェクトファイル等様々なプラットフォームで様々なビルドシステムのためのファイルを生成するためのツールです。

Linux上では主にMakefileを生成するために使用されます。ビルド環境の様々な設定を判別し、最適なMakefileを生成します。コマンドは、バッチ的に処理するcmakeと、(テキストベースの)GUIで対話的に処理するccmakeの2つがあります。 RTコンポーネントのクロス開発には rtc-cmake-cross/rtc-ccmake-crossを利用します。

ATDE2 for OpenRTM-aist にすでにインストールされていますが、こちらからもダウンロードできます。

なお、rtc-cmake-cross/rtc-ccmake-cross は中身はrtc-make-crossと同一です。名前を変えると、それぞれの名前どおりの動作を刷るようになっています。ダウンロードした場合、以下のようにして /usr/bin 等にインストールするとよいでしょう。

 $ chmod 755 rtc-make-cross
 $ sudo install rtc-make-cross /usr/bin
 $ sudo ln -s /usr/bin/rtc-make-cross /usr/bin/rtc-cmake-cross
 $ sudo ln -s /usr/bin/rtc-make-cross /usr/bin/rtc-ccmake-cross

-hオプションを与えてヘルプを見てみます。

  Usage: rtc-cmake-cross -a <arch_name> [cmake options]
 
     -a     target architecture name
     -h     print this help
 
 Available architectures:
    arm powerpc

ターゲットアーキテクチャをしていする -a オプションを使用するところ以外は、使い方はcmakeとほとんど同じです。 rtc-make-cross同様、サポートしているアーキテクチャが arm と powerpc の2種類あることがわかります。

ソース (rtchokuyoaist) のダウンロード

ここでは、Geofrey Biggs氏作の rtchokusyoaist コンポーネントのビルドを例に取り説明します。 rtchokuyoaistコンポーネントは北陽電機製レーザ測域センサ URG シリーズ用のRTコンポーネントです。URGセンサとArmadilloを組み合わせることで、分散センサコンポーネントを容易に実現することができます。

Armadillo_URG.png
URGセンサとArmadilloの組み合わせの例

rtchokuyoaistコンポーネントは次の3つのパッケージをコンパイルする必要があります。

上記のURLから、ZIPボタンを押してダウンロードしてください。

 tmark@atde:~/tmp/rtchokuyoaist$ ls
 gbiggs-flexiport-7ff727e.zip
 gbiggs-hokuyoaist-3.0.1-0-g69df78b.zip
 gbiggs-rtchokuyoaist-2.0.0-12-g43f93c7.zip
 atmark@atde:~/tmp/rtchokuyoaist$ find ./ -name '*zip' -exec unzip {} \;
 atmark@atde:~/tmp/rtchokuyoaist$ mv gbiggs-flexiport-7ff727e flexiport
 atmark@atde:~/tmp/rtchokuyoaist$ mv gbiggs-hokuyoaist-69df78b hokuyoaist
 atmark@atde:~/tmp/rtchokuyoaist$ mv gbiggs-rtchokuyoaist-43f93c7 rtchokuyoaist

flexiportのビルド

まず、flexiport からビルドします。cmakeの習慣として build ディレクトリを作成し、その中でビルドします。

 atmark@atde:~/tmp/rtchokuyoaist$ cd flexiport
 atmark@atde:~/tmp/rtchokuyoaist/flexiport$ mkdir build-cross
 atmark@atde:~/tmp/rtchokuyoaist/flexiport$ cd build-cross/
 atmark@atde:~/tmp/rtchokuyoaist/flexiport/build-cross$ rtc-cmake-cross -a arm ..
 /
 Target architecture is arm (arm-linux-gnu)
 Toolchain found.
   CC:  /usr/bin/arm-linux-gcc
   CXX: /usr/bin/arm-linux-g++
  : 中略
 -- Found Doxygen: /usr/bin/doxygen (found version "1.5.1")
 CMake Error at doc/CMakeLists.txt:8 (message):
   Sphinx was not found.  Set SPHINX_PATH to the directory containing the
   sphinx-build executable, or disable BUILD_DOCUMENTATION.
 
 -- Configuring incomplete, errors occurred!
 
 Configure failed. Check CMake options and configuration variables.

どうやらSphinxが足りないようです。ドキュメントは不要なので、BUILD_DOCUMENTATION 変数を OFFに設定してみましょう。

 atmark@atde:~/tmp/rtchokuyoaist/flexiport/build-cross$ rtc-cmake-cross -a arm -DBUILD_DOCUMENTATION=OFF ../
 Target architecture is arm (arm-linux-gnu)
   : 中略
 -- Configuring done
 -- Generating done
 CMake Warning:
   Manually-specified variables were not used by the project:
   
     CMAKE_TOOLCHAIN_FILE
 
 
 -- Build files have been written to: /home/atmark/tmp/rtchokuyoaist/flexiport/build-cross
 
 Configure done. Type 'make' and build program.

今度はうまくいったようです。Makefileができたのでmakeします。

 atmark@atde:~/tmp/rtchokuyoaist/flexiport/build-cross$ make
 Scanning dependencies of target flexiport
 [  7%] Building CXX object src/CMakeFiles/flexiport.dir/flexiport.cpp.o
 [ 15%] Building CXX object src/CMakeFiles/flexiport.dir/port.cpp.o
   : 中略
 Linking CXX executable flexiport_udp_example
 [100%] Built target flexiport_udp_example

これで、libflexiport.so というライブラリファイルが出来ました。 これをシステムのクロス開発環境にインストールします。

 atmark@atde:~/tmp/rtchokuyoaist/flexiport/build-cross$ ls src/libflexiport.so*
 src/libflexiport.so  src/libflexiport.so.2  src/libflexiport.so.2.0.0」
 tmark@atde:~/tmp/rtchokuyoaist/flexiport/build-cross$ sudo make install
 Password:
 [ 69%] Built target flexiport
  : 中略
 -- Installing: /usr/arm-linux-gnu/lib/flexiport/flexiportDepends.cmake
 -- Installing: /usr/arm-linux-gnu/lib/flexiport/flexiportDepends-noconfig.cmake

hokuyoaistのビルド

flexiport同様にrtc-cmake-crossを実行、ライブラリをビルドします。

 atmark@atde:~/tmp/rtchokuyoaist$ cd hokuyoaist/
 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist$ mkdir build-cross
 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist$ cd build-cross/
 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist/build-cross$ rtc-cmake-cross -a arm -DBUILD_DOCUMENTATION=OFF ../
 Target architecture is arm (arm-linux-gnu)
  : 中略
 -- Build files have been written to: /home/atmark/tmp/rtchokuyoaist/hokuyoaist/build-cross
 
 Configure done. Type 'make' and build program.
 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist/build-cross$ make
 Scanning dependencies of target hokuyoaist
 [ 16%] Building CXX object src/CMakeFiles/hokuyoaist.dir/hokuyo_errors.cpp.o
  : 中略
 [100%] Building CXX object examples/CMakeFiles/hokuyoaist_getid.dir/getid.cpp.o
 Linking CXX executable hokuyoaist_getid
 [100%] Built target hokuyoaist_getid
 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist

これもライブラリなので、インストールします。

 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist/build-cross$ sudo make install
 [ 66%] Built target hokuyoaist
 [ 83%] Built target hokuyoaist_example
  : 中略
 -- Installing: /usr/arm-linux-gnu/lib/hokuyoaist/hokuyoaistDepends.cmake
 -- Installing: /usr/arm-linux-gnu/lib/hokuyoaist/hokuyoaistDepends-noconfig.cmake
 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist/build-cross$

rtchokuyoaistのビルド

最後にRTコンポーネントであるrtchokuyoaistをビルドします。

 atmark@atde:~/tmp/rtchokuyoaist/hokuyoaist/build-cross$ cd ../../rtchokuyoaist/
 atmark@atde:~/tmp/rtchokuyoaist/rtchokuyoaist$ mkdir build-cross
 atmark@atde:~/tmp/rtchokuyoaist/rtchokuyoaist$ cd build-cross/
 atmark@atde:~/tmp/rtchokuyoaist/rtchokuyoaist/build-cross$ rtc-cmake-cross -a arm -DBUILD_DOCUMENTATION=OFF ../
 Target architecture is arm (arm-linux-gnu)
 Toolchain found.
   CC:  /usr/bin/arm-linux-gcc
  :中略
 CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE):
   Could NOT find OpenRTM (missing: OPENRTM_INCLUDE_DIR COIL_INCLUDE_DIR)
   (Required is at least version "1")
 Call Stack (most recent call first):
   /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:288 (_FPHSA_FAILURE_MESSAGE)
   cmake/Modules/FindOpenRTM.cmake:75 (find_package_handle_standard_args)
   CMakeLists.txt:39 (find_package)
 
 
 -- Configuring incomplete, errors occurred!
 
 Configure failed. Check CMake options and configuration variables.

おや、エラーが出ました。missing OPENRTM_INCLUDE_DIR COIL_INCLUDE_DIR とあるので、これらの変数が上手くセット出来なかったようです。 それぞれOpenRTMとcoilのインクルードディレクトリなので場所は以下のとおりになります。

  • OPENRTM_INCLUDE_DIR=/usr/arm-linux-gnu/include/openrtm-1.1/
  • COIL_INCLUDE_DIR=/usr/arm-linux-gnu/include/coil-1.1/

ですので、以下のように変数を指定します。

 $ rtc-cmake-cross -a arm -DBUILD_DOCUMENTATION=OFF    -DOPENRTM_INCLUDE_DIR=/usr/arm-linux-gnu/include/openrtm-1.1/    -DCOIL_INCLUDE_DIR=/usr/arm-linux-gnu/include/coil-1.1/ ../

あるいは、ccmake を利用して対話的にこれらの変数を与えることもできて、

 atmark@atde:~/tmp/rtchokuyoaist/rtchokuyoaist/build-cross$ rtc-ccmake-cross -a arm -DBUILD_DOCUMENTATION=OFF ../

のように rtc-ccmake-crossを実行して、ccmakeを起動します。

                                                      Page 1 of 1
  BUILD_EXAMPLES                   ON
  CMAKE_BUILD_TYPE
  COIL_INCLUDE_DIR                 /usr/arm-linux-gnu/include/coil-1.1
  COIL_LIBRARY                     /usr/arm-linux-gnu/lib/libcoil.so
  OPENRTM_IDL_DIR                  /usr/arm-linux-gnu/include/openrtm-./rtm/idl
  OPENRTM_INCLUDE_DIR              /usr/arm-linux-gnu/include/openrtm-1.1/
  OPENRTM_LIBRARY                  /usr/arm-linux-gnu/lib/libRTC.so
  PROJECT_VERSION                  3.0.0
  STATIC_LIBS                      OFF
 
 BUILD_EXAMPLES: Build and install examples
 Press [enter] to edit option                                 CMake Version 2.8.9
 Press [ c ] to configure
 Press [ h ] for help           Press [ q ] to quit without generating
 Press [ t ] to toggle advanced mode (Currently Off)

OPENRTM_INCLUDE_DIR、COIL_INCLUDE_DIRそれぞれの場所でReturnキーを押して、パスを入力します。 cを押しconfigureをします。cを再度押し、次にgを押してMakefileを生成 (generate) します。最後にeを押して対話画面を抜けます。 これで、Makefileが生成されているはずですので、makeします。

 atmark@atde:~/tmp/rtchokuyoaist/rtchokuyoaist/build-cross$ make
 Scanning dependencies of target hokuyoaist_TGT
 [ 10%] Compiling /home/atmark/tmp/rtchokuyoaist/rtchokuyoaist/idl/hokuyoaist.idl
 :中略
 [ 80%] Building CXX object src/CMakeFiles/rtchokuyoaist.dir/__/idl/hokuyoaistSK.cc.o
 [ 90%] Building CXX object src/CMakeFiles/rtchokuyoaist.dir/__/idl/hokuyoaistDynSK.cc.o
 Linking CXX shared library librtchokuyoaist.so
 [ 90%] Built target rtchokuyoaist
 Scanning dependencies of target rtchokuyoaist_standalone
 atmark@atde:~/tmp/rtchokuyoaist/rtchokuyoaist/build-cross$ ls src/
 CMakeFiles  cmake_install.cmake  rtchokuyoaist_standalone
 Makefile    librtchokuyoaist.so

以上でrtchokuyoaistコンポーネントの完成です。 srcディレクトリ以下に実行ファイルと共有ライブラリのコンポーネントができています。
  • rtchokuyo_standalone: rtchokuyoaistのスタンドアロンコンポーネント
  • librtchokuyoaist.so: rtchokuyoaistのローダブルモジュールコンポーネント

USBメモリファイルセットの作成

上述の SeqOutComp と同様 rtc2usbmem コマンドを使って、USBメモリにコピーするためのファイルセットを作成します。ターゲットディレクトリは ~/rtchokuyo とします。

 atmark@atde:~/tmp/rtchokuyoaist/rtchokuyoaist/build-cross$ rtc2usbmem -d ~/rtchokuyo -r src/rtchokuyoaist_standalone
 
 Now Armadillo's USB memory image is created.
 Target architecture:  arm
 Target directory:     /home/atmark/rtchokuyo
 Target RTCs:          src/rtchokuyoaist_standalone
 Library search path:  /usr/arm-linux-gnu
 
 Searching lib under /usr/arm-linux-gnu
 copying  /usr/arm-linux-gnu/lib/libRTC-1.1.0.so -> /home/atmark/rtchokuyo/lib
 Searching lib under /usr/arm-linux-gnu
 copying  /usr/arm-linux-gnu/lib/libcoil-1.1.0.so -> /home/atmark/rtchokuyo/lib
  :中略
 copying src/rtchokuyoaist_standalone -> /home/atmark/rtchokuyo/rtc
 copying /usr/arm-linux-gnu/lib/libhokuyoaist.so.3 -> /home/atmark/rtchokuyo/lib
 copying /usr/arm-linux-gnu/lib/libflexiport.so.2 -> /home/atmark/rtchokuyo/lib
 /home/atmark/rtchokuyo/boot.sh created.
 /home/atmark/rtchokuyo/rtc.conf created.
 
 NOTE:
   Edit /home/atmark/rtchokuyo/rtc.conf for your environment.
 
 Target binaries have been copied to: /home/atmark/rtchokuyo

ご覧のように、rtchokuyoaist コンポーネントの依存ライブラリである、libflexiport.soやlibhokuyoaist.soなどもコピーされています。

~/rtchokuyo ディレクトリ以下のファイルをUSBメモリにコピーし、rtc.confを編集してからArmadilloに挿入するとコンポーネントが起動します。

次章では、USBメモリファイルセットを実際にUSBメモリにコピーしコンポーネントを起動してみます。

コンポーネントの実行

コンポーネントの実行

この説では、前の章でクロスコンパイルしたコンポーネント SeqOutComp をUSBメモリにコピーしArmadillo上で実行します。 なお、rtchokuyoaistについても作業内容は同じです。

USBメモリへのコピー

ATDE2上でコンパイルしたコンポーネントをArmadillo上で実行するには、ファイルセットをUSBメモリにコピーする必要があります。 USBメモリをATDE2を実行しているWindows側で認識させファイルをコピーする方法、ATDE2側で直接USBメモリをマウントしてコピーする方法があります。

Windows経由でコピーする

VM上のATDE2 for OpenRTM-aistは、samba経由でATDE2上のファイルにアクセスできるようになっていますので、

  • USBメモリをPCに刺す
  • エクスプローラからATDEにアクセスする
    • '\\192.168.xxx.yyy <ATDEのIPアドレス>\atmark\sdmemory' にアクセス
  • sdmemory 内のすべてのファイルをUSBメモリにDnDでコピー
  • USBメモリの接続を解除して取り外す

といった手順でファイルセットをUSBメモリにコピーできます。

usbmemory_copy.png
USBメモリカードへSeqOutCompの実行に必要なファイルをコピーする

ただし、USBメモリを抜き取るのは、次の節で述べる手順に従って rtc.confを書き換えてからにしてください。

Linux経由でコピーする

Linux経由でコピーする方法は、手順が煩雑なので推奨しません。

まず、VMwareの「仮想マシン」->「仮想マシンの設定」からの設定で、USBコントローラが有効になっていることを確認します。

次にVMを起動し、USBメモリを挿入します。VMware Playerでは画面の右下に、接続されているデバイスの一覧が表示されます。このうちどれか一つがUSBメモリのデバイスに対応します。マウスカーソルをアイコン上に置くとバルーン表示されますので確認してください。

vmware_usbmemory01.png
USBメモリデバイスの確認

USBメモリのデバイスが見つかったら、アイコンを右クリックし接続します。

vmware_usbmemory02.png
USBメモリデバイスの接続

ATDEでは通常USBメモリは自動的にマウントされます。 ここで、コマンドラインから mount コマンドを入力してUSBメモリのマウントポイントを調べます。

 atmark@atde3:~$ mount | grep media
 /dev/sdb1 on /media/SD type vfat (rw,nosuid,nodev,uhelper=hal,shortname=lower,uid=1000)
 atmark@atde3:~$

リムーバブルディスクはデフォルトでは /media の下にマウントされます。 ここでは SDメモリは /media/SD にマウントされたことがわかります。

先ほど作成した seqout ディレクトリの内容を、USBメモリにコピーします。

 atmark@atde3:~$ cp -r seqout/* /media/SD/

USBメモリをアンマウントします。

 atmark@atde3:~$ umount /media/SD
 
これで、PCからUSBメモリを抜き取ることができます。 ただし、USBメモリを抜き取るのは、次の節で述べる手順に従って rtc.confを書き換えてからにしてください。

USBメモリファイルセット側のrtc.confの書き換え

Armadillo上で起動するRTコンポーネントが自分の参照を登録するネームサーバのアドレスをrtc.confに設定します。

ネームサーバは現在作業中のPC(VMではなくWindowsホスト)で起動することにしますので、PCのIPアドレスを調べます。コマンドプロンプトから

 > ipconfig

と入力し、PCのIPアドレスを覚えておきます。 ネットワーク・インターフェースが複数ある場合は注意が必要です。 VMwareがインストールされている場合、ほぼ100%複数のネットワーク・インターフェースが存在します。 実際にネットワークにつながっているインターフェースを見つけて、そのアドレスを覚えておいてください。 仮にPCのネットワークインターフェースのアドレスが 192.168.11.16 であったとして、USBメモリ上のrtc.confを以下のように書き換えます。

 corba.nameservers: 192.168.11.16

これで設定は完了です。USBメモリを取り外してArmadilloに挿入します。

Armadillo上での動作テスト

ここでは、Armadillo上で動作するSeqOutCompと、PC上で動作するSeqInCompを接続してみます。

Windowsホスト側のrtc.confの書き換え

Windows側のホストには仮想のものも含めて複数のネットワークインターフェースがあります。RTコンポーネントが使用するIPアドレスを固定するために、ホスト側のrtc.confも設定ををこないます。

上述の例ではIPアドレスは192.168.11.16でしたので、rtc.confに次の1行を追加します。

 corba.endpoints: 192.168.11.16

Vista以降のWindowsではUACにより C:\Program Files\OpenRTM-aist 以下の rtc.conf を書き換えることはできませんので、その場合 C:\tmpなど適当なフィルダに SeqInComp.exe とrtc.confをコピーして上の1行を追加してください。

ネームサービス・RTSystemEditorおよびSeqInCompの起動

次に、以下のようにネームサーバやコンポーネントを起動します。

  • ネームサービス: rtm-naming
    • 「スタート」->「OpenRTM-aist」->「C++」->「tools」->「Start Naming Service」
  • RTSystemEditor
    • 「スタート」->「OpenRTM-aist」->「C++」->「tools」->「RTsystemEditor」
  • SeqInComp
    • 「スタート」->「OpenRTM-aist」->「C++」->「components」->「examples」->「SeqInComp.exe」

RTSystemEditorでネームサーバに接続します。

Armadilloの起動

ArmadilloをシリアルケーブルでPCと接続し、PC側でターミナルソフト(TeraTerm等)を起動して、Armadilloをモニタリングしてください。 SDメモリをArmadilloに挿し、Armadilloに電源を入れ起動します。

armadillo_boot01.png
起動中のArmadillo

うまく行けば、PC上のネームサーバにSequenceOutCompという名前のコンポーネントが起動していることを確認できます。

armadillo_boot02.png
起動したArmadillo

Armadillo 側で起動した SequenceOutCompoと、PC側で起動した SequenceInComp というコンポーネントを接続してみます。

rtse_seqinout.png
SeqInCompとSeqOutCompの接続

接続完了後、2つのコンポーネントをActivateすると、PC側で起動した SequenceInComp のコマンドプロンプトに連続した様々な数字が表示され、Armadillo の SeqOutCompから数値が送られていることが確認できます。

トラブルシューティング

トラブルシューティング

RTsystemEditorのネームサービスビューにArmadilloのコンポーネント(SeqOut)が表示されない

[原因] Armadilloの電源が入っていない

Armadilloの電源を入れてください。

[原因] Armadilloが起動していない

工場出荷状態のArmadilloは起動可能なカーネルおよびユーザランドが書き込まれてい無いことがあります。 アットマークテクノで配布しているデフォルトのカーネルとユーザランドを書き込んで機能可能な状態にしてからご利用ください。

[原因] ArmadilloにLANケーブルが接続されていない

有効なネットワークにLANケーブルを接続してください。

[原因] Armadilloがネットワークにつながっていない

ArmadilloはデフォルトではDHCPでアドレスを取得してネットワークに接続します。 利用しているLAN上にDHCPがない場合、DHCPサーバを立てるか、Armadilloに固定アドレスを振る設定を行ってくださ。

[原因] USBメモリがカードスロットに挿入されていない

USBメモリ内のRTコンポーネントを起動するにはArmadilloのUSBコネクタにUSBメモリを差し込む必要があります。USBメモリを挿すタイミングは、Armadillo起動前でも起動後でも構いません。ただし、USBメモリを取り外す際は、ArmadilloのLED横のボタンを押して取り外してください。

[原因] USBメモリ内に、ライブラリ、コンポーネント起動スクリプト、rtc.confが入っていない

必要なファイルが一つでも欠けている場合コンポーネントは起動しません。 Armadilloにログインし、/home/openrtm ディレクトリを確認してみます。

 atmark-dist v1.30.0 (AtmarkTechno/Armadillo-240)
 Linux 2.6.26-at16 [armv5tejl arch]
 
 armadillo240-0 login: root
 Password: root
 [root@armadillo440-0 (ttymxc1) ~]# ls -R /home/openrtm
 //home/openrtm:
 boot.sh*     rtc/         rtc1577.log* rtc1709.log* rtc1747.log*
 lib/         rtc.conf*    rtc1688.log* rtc1728.log*
 
 /home/openrtm/lib:
 libRTC-1.1.0.so*      libgcc_s.so.1*        libomnithread.so.3*
 libc.so.6*            libm.so.6*            libpthread.so.0*
 libcoil-1.1.0.so*     libomniDynamic4.so.1* libstdc++.so.6*
 libdl.so.2*           libomniORB4.so.1*     libuuid.so.1*
 
 /home/openrtm/rtc:
 SeqOutComp*

上記の例SeqOutCompを動作させるには、このような構成になっている必要があります。

[原因] USBメモリが正しくマウントされていない

Armadilloにログインして、マウントポイントを確認します。

 
 [root@armadillo240-0 (ttymxc1) ~]# mount
 /dev/ram0 on / type ext2 (rw)
 proc on /proc type proc (rw)
 usbfs on /proc/bus/usb type usbfs (rw)
 sysfs on /sys type sysfs (rw)
 udev on /dev type tmpfs (rw)
 ramfs on /home/ftp/pub type ramfs (rw)
 /dev/sda1 on /home/openrtm type vfat (rw,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)

最後の行、/dev/sda1 が /home/openrtm ディレクトリにマウントされています。 もし、/dev/sda1 がマウントされていない場合、

 # mount -t vfat /dev/sda1 /mnt

のようにして手動でマウントしてみます。

[原因] 起動スクリプトにバグがある

起動スクリプトにバグがあり、RTコンポーネントが起動できないケースがあります。 起動スクリプト boot.sh に書いてある手順通りに、シリアル端末からRTCを実行してみる。

ネームサービスビューにゾンビとして表示される

[原因] オブジェクト参照に不正なアドレスが設定されている

Armadilloに複数のネットワークインターフェースがあり、PC側から届かない方のアドレス (Unreachable) がセットされている場合、システムエディタがRTCのプロファイル情報を取得できずにゾンビ表示になります。

Armadillo上で実行するRTC用のrtc.confにendpointを設定してください。

 corba.endpoints: 192.168.0.10:
 # 192.168.0.10: はArmadilloのネットワークインターフェースのアドレス

[原因] PCとArmadilloの間にファイヤウォールがあるもしくはArmadilloがプライベートアドレス空間にある

PCとArmadilloの間にファイヤウォールがある場合、またはArmadilloがNATを介してネームサービスに名前を登録している場合、PC側からはArmadilloに到達することができずにゾンビン表示となります。

ArmadilloをPCと同じセグメント(ネットワーク)に接続して起動してください。

ポートの接続ができない(エラー、RTSystemEditorが固まるなど)

[原因] PCのRTCからArmadilloのRTC(またはその逆)が Unreachable

ポートの接続をする際にはコンポーネント同士でポートのオブジェクト参照を交換します。 その際、相手のポートのIPアドレスおよびポートを利用して相手のポートの接続しに行くため、両RTC間が相互に到達可能なIPアドレスである必要があります。

特にPC側はVMwareなどがインストールされており、ネットワークインターフェースをたくさん持つ状態になっています。 たとえば、PC側のRTCが持つVMネットワークのプライベートアドレス 192.168.5.10 を、RTC上のRTCのオブジェクト参照内に埋め込むと、Armadillo側のRTCは 192.168.5.10 にポートの接続をしに行こうとします。この192.168.5.10というアドレスは、VMwareの仮想プライベートネットワーク内でのみ有効なアドレスなので、Armadillo側のRTCは到達し得ないポートに接続しに行こうとし、タイムアウトになるまで試行します。 この時、RTSystemEditorはRTCから応答が返ってこないため固まります。

この場合、PC側のRTCが読み込むrtc.confにendopiintを設定する必要があります。 ipconfig 等のコマンドでPCの実際のLAN上でのアドレスを調べ (仮に150.29.123.123とします)、

 corba.endpoints: 150.29.123.123:

のようにcorba.endpointsオプションに指定します。最後のコロン「:」は必ず付けてください。

RTSystemEditorで接続、またはActivateするとRTCが落ちる

[原因] ライブラリの不整合

実行しているRTCと、そのRTCが利用しているライブラリ (Linuxでは.so、WindowsではDLL) のバージョンに不整合がある場合、何らかの操作をすると落ちるケースがあります。 RTCとそのRTCが参照しているライブラリのバージョンを確認してください。

[原因] RTCのバグ

自作のRTCの場合、RTCに実装したロジックにバグがあればRTCは落ちます。 OpenRTM-aistに付属のサンプルRTCは簡単なロジックのものしかありませんので、この原因の可能性は低いでしょう。

[原因] OpenRTM-aistのバグ

OpennRTM-aistのバグの可能性がある場合は、

  • OpenRTM-aist のバージョン
  • 使用している環境の詳細
  • 使用しているRTCの詳細

を添えてメーリングリストにて報告してください。

その他

その他、どうしてもうまくいかない場合は、メーリングリスト ( OpenRTM-users ) で気軽に質問してください。

カーネルとユーザランドの入れ替え

カーネルとユーザランドの入れ替え

Armadilloのカーネルとユーザランドをカスタマイズして入れ替える方法について説明します。カーネルに必要なデバイスドライバが入っていなかったり、ユーザランドにアプリケーションを追加したい場合、ここで述べる方法でカスタマイズ・入れ替えを行います。

Linux のカーネル

OS (Operating System) のもっともコアとなる部分をカーネルと呼びます。 カーネル (= OS) は、アプリケーションプログラムに対して、CPU、メモリ、ディスクなどのリソースの分配や管理、ハードウエアへの抽象化されたアクセスの提供等を行います。

原則として、すべてのデバイスはカーネルが提供する、ファイルとして抽象化されたドライバ (デバイスファイル) 経由で、アプリケーションプログラムからアクセスされます。

基本的にハードウエアベンダがそのデバイスドライバを提供するWindowsとは異なり、Linuxでは、一般に配布されているカーネルのソースコード内にほとんどのデバイスドライバが含まれています。 デバイスドライバは、カーネル内に静的に組み込まれるドライバと、モジュールとして個別にコンパイルされ、必要になった時点で読み込むモジュール型のデバイスドライバがあります。

linux_kernel_and_driver.png
Linuxカーネルと2種類のドライバ

たいていのドライバは、Static としても Module としてもコンパイル可能で、カーネルの設定時に選択できます。

  • Linuxのドライバはカーネルのソースコードに含まれている
  • Linuxの設定時にドライバを組み込むかどうか決める
  • ドライバには静的に組み込むものとモジュール型のものがある

この2種類のドライバはそれぞれメリット・デメリットがあります。

静的に組み込むドライバ

  • 利点
    • カーネルに含まれているので、モジュールをロードする必要がない
    • モジュール化した時よりメモリ使用量が(ちょっとだけ)少なく済む(かもしれない)
  • 欠点
    • カーネルに組み込まれているので、使わなくてもその分メモリを食う
    • カーネルに何のドライバが組み込まれているのかわかりにくい

モジュール化されたドライバ

  • 利点
    • 必要な時だけ組み込めばいいので、メモリの節約になる
    • 後からモジュールだけコンパイルして組み込むことができる(ことがある)
      • サードパーティーが提供するドライバなど
  • 欠点
    • 使用するときモジュールをロードしなければならない
    • モジュール化することで、メモリ消費量が(ちょっとだけ)増える

Linuxカーネルのコンパイル

最近のほとんどのLinuxディストリビューション (Debian, Ubuntu, Fedora, CentOSなど)ではほぼすべてのドライバをはじめからモジュール形式でコンパイルしたものをカーネルと一緒に配布しています。 したがって、新しいデバイスを接続した場合でも、カーネルにドライバを追加して自分でコンパイルしなおす、といったことをする必要はありません。

しかし、かつてPCの速度が遅く、メモリが少なかった時代には、自分の環境にあったカーネルを自分でコンパイルすることはLinuxユーザが行う環境設定の第一歩でした。 Armadilloのような組み込みデバイスにおいては、現在においてメモリもディスクスペースも貴重ですので、自分の用途に合ったカーネルを設定・コンパイルする必要があります。

ユーザランド

ユーザランドとは、OSが動作するのに必要な部分のうち、カーネル以外の部分を言います。

 ユーザランド = OS - kernel

ユーザランドには、

  • /etc: 起動スクリプト群、設定ファイル群
  • /bin, /usr/bin: 基本コマンド群
  • /sbin, /usr/sbin, 基本システムコマンド群
  • /lib, /usr/lib, 基本ライブラリ群
  • /lib/modules, カーネルモジュール群

等があります。 Armadilloでは、ユーザランドを圧縮したイメージの状態でFlashメモリに格納し、起動時にRAMに展開してルートファイルシステムとしてマウントし利用します。 ユーザランドにファイルを追加したい、あるいは削除した場合、ユーザランドのイメージを作り直し、Armadilloにダウンロードする必要があります。 ユーザランドは通常10MB程度あり、シリアルポート経由でArmadilloにダウンロードするため、入れ替えには10分程度かかります。 頻繁に入れ替えるのは大変ですので、ユーザランドの入れ替えを考えている場合は、よく計画して行ったほうがよいでしょう。

BusyBox

Armadilloのような組み込みデバイスでは、ディスクスペースは大変貴重です。 一方で、Linuxシステムは起動するだけでも多くのコマンドが必要となります。 そこで、ディスクおよびメモリスペースを節約するために考え出されたのがBusyBoxです。 BusyBoxは、lsやcp, mvなど/binにインストールされているようなコマンド群の代わりを一つの実行ファイルで行います。

Armadilloでは、ユーザランドのコマンドの多くがBusyBoxにより実現されています。

カーネルモジュール

上で説明したカーネルのドライバのうち、静的に組み込まれるドライバはカーネル内部に存在しますが、モジュールドライバはファイルとしてユーザランドに存在します。 Armadilloでは通常以下のディレクトリ

 /lib/modules/2.6.26-at16/kernel/drivers
 #           ^^^^^^^^^^^^この部分はカーネルのバージョン

に格納されています。モジュールがインストールされていれば、

 $ find /lib/modules/2.6.26-at16/kernel/drivers
 ./
 ./net
 ./net/wireless
 ./net/wireless/rt5370sta.ko
 ./scsi
 ./scsi/scsi_wait_scan.ko

このように、<device名>.ko というファイルがいくつか見つかるはずです。

カーネルモジュール内部にはカーネルのバージョンが保持されていて、異なるバージョンのカーネルにはモジュールをロードできないようになっています。

カーネルとカーネルモジュールは必ずセットで作成します。 したがって、カーネルモジュールを含むユーザランドとカーネルは原則としてセットで作成する必要があります。

Atmark Dist

Armadilloのような組み込みLinux環境では、利用できるメモリやディスクに制限があるため、必要最低限のカーネルやユーザランド(種々のコマンド群やアプリケーションを含めてこう呼ぶ) しかインストールしません。

ArmadilloではカーネルもユーザランドもFlashメモリ上に格納され、起動時にRAMにに展開され利用します。起動後にユーザランドに変更を加えても、Flashメモリ上のユーザランドのイメージには変更は反映されないため、ユーザランドに新たなコマンドを加えたり設定を変更したい場合は、PC上でクロス開発し、ユーザランドをイメージ化しArmadilloのFlashメモリにダウンロードする必要があります。

これを行うための環境が Armark Distです。 Atmark Dist は uClinux という MMU (Memory Management Unit) がない組み込み紺ぴぃーた向けのLinuxのためのソースコードベースのディストリビューション uCLinux distが元になっています。 もちろんArmadilloはMMUを搭載したARM9ベースのCPUボードですので、uCLinuxを使う必要はありませんが、uCLinux distの組み込み向けユーザランドを作成する機能を利用し、Armadillo用のカーネルとユーザランドを作成するよう拡張したものを Atmark Distとしてリリースしています。

Armark Distの一般的な使い方は、上述のアットマークテクノの解説をご覧ください。

この解説では、

  • 北陽電機製レーザ測域センサ: URGシリーズ
  • 無線LAN
  • USBカメラ

を利用するために、カーネルおよびユーザランドの再設定および利用方法について説明します。

Atmark Distとカーネルソースのダウンロード

基本的な手順は atmark-dist 開発者ガイド第3章 に従います。

まずはじめに、Atmark DistとLinuxカーネルをダウンロードします。

アットマークテクノのダウンロードサイトには、全体とデバイスごとのフォルダにAtmark Distとカーネルソースが置かれています。 カーネルソースはデバイス毎に若干異なるようですので、基本的にはデバイス個別のフォルダにおかれているAtmark Distとカーネルソースをセットで利用するとよいでしょう。

Atmark Distとカーネルソースの展開

以下、作業ディレクトリをホームディレクトリ直下の work というディレクトリにします。(ディレクトリ名は任意ですが、以下便宜上workとします。)

 $ cd
 $ mkdir -p work/atmarkdist
 $ cd work/atmarkdist
 $ wget http://download.atmark-techno.com/armadillo-440/source/dist/atmark-dist-20120727.tar.gz
 $ wget http://download.atmark-techno.com/armadillo-440/source/kernel/linux-2.6.26-at16.tar.gz
 $ tar xvzf atmark-dist-20120727.tar.gz
 $ tar xvzf linux-2.6.26-at16.tar.gz

Atmark Distはビルドの過程で、カーネルソースを参照します。Atmark Distがカーネルソースを認識するためには、Atmark Distディレクトリの直下にカーネルのディレクトリが存在する必要があります。 そのため、カーネルソースディレクトリへのシンボリックリンクを張ります。

 $ mv atmark-dist-20120727 atmark-dist # 便宜上ディレクトリ名を変える
 $ cd atmark-dist
 $ ln -s ../linux-2.6.26-at16 linux-2.6.x
 # ln -s ../linux-2.6.26-at16 linux-2.6.26でもよい

ディレクトリ構成はこのようになっているはずです。

 ~/work
   + atmarkdist
     + armark-dist
        + bin
        + config
        + :
        + linux-2.6.x -> ../linux-2.6.26-at16 へのシンボリックリンクをあらかじめ張る
        + :
        + vendors
     + linux-2.6.26-at16
 

make menuconfig

Atmark Distのメニューを起動します。

 $ cd ~/work/atmarkdist
 $ make menuconfig
atmarkdist01.png
図1 make menuconfig 直後の画面

Vendor/Product では ArmarkTechno、ProductではArmadillo-440を選択する。

  1. Vendor/Product Selection --->
    • Vendor: Atmarktechno を選択
    • Product: Armadillo-440 を選択
  2. Kernel/Library/Defaults Selection --->
    • [*] Customize Kernel Settings にチェック
    • [*] Customize Vendor/User Settings (NEW) にチェック

に設定。Exitを2回選択し、設定を保存するかきかれるのでOKを選択すると、次はカーネルの設定画面が起動する。

以降、対象とするドライバ毎に説明する。

備考

USBカメラ等を使用するために必要な UVC (USB Video Class) ドライバは 2.6.26 以降で含まれるようになっており、Armadillo-200系の現在のカーネル 2.6.12 では含まれていない。 したがって、UVCデバイスは現在のところ標準では使用できず、最新カーネルにArmadillo用パッチをを当てるなどしてUVCデバイスを含むカーネルを使用する必要がある。

カーネルとユーザランドの設定 (CDC ACMドライバ編)

この文書は編集中です。

カーネルとユーザランドの設定 (CDC ACMドライバ編)

アットマークテクノのダウンロードサイトからダウンロード可能なカーネルは、Armadillo-400シリーズで動作させるための最低限のドライバのみ組み込まれており、その他のデバイスを利用する場合は自分でカーネルを再コンパイルして組み込む必要があります。

ロボットシステムでよく用いられる北陽電機のレーザ測域センサ URG シリーズも、Armadilloのデフォルトカーネルでは利用することができないデバイスの一つです。

ここでは、URGセンサを動作させるために必要な CDC ACMドライバの組み込み方を説明します。

Atmark-dist configuration

 + atmark-dist
   + linux-2.6.x -> ../linux-2.6.?? へのシンボリックリンク
 + linux-2.6.?? -> 以下は 2.6.26-at16 を仮定しています

上記のディレクトリ構成を仮定します。Atmark-dist を展開したディレクトリ内で

 $ make menuconfig

とコマンドを入力すると、以下のような画面が表示されます。

atmarkdist_atmarkdistconfig00.png
Atmark-dist Configuration初期画面

メニュー中央の青い長方形がカーソルです。 カーソルキーで上下に動かし、Enterキーで選択し、配下のサブメニューに入ります。

ここでは、Vendor/Product SelectionおよびKernel/Library/Defaults Selectionメニューを設定します。

Vendor/Product Selection

Vendor/Product Selectionでは、ターゲットのベンダとプロダクトを指定します。 (SnapGear) Vendorと表示されているところにカーソルを移動し、Enterをします。

atmarkdist_select_vendor00.png
Atmark-dist Configuration:ベンダ選択画面

ベンダ名はアルファベット順に並んでいるので、カーソルキーで上のほうに行き AtmarkTechno を Enter キーを押して選択します。

atmarkdist_select_vendor01.png
Atmark-dist Configuration:ベンダ選択 (AtmarkTechno)

次に、プロダクトを選択します。

atmarkdist_select_product00.png
Atmark-dist Configuration:プロダクト選択画面

アットマークテクノの製品名一覧が表示されるので、自分が使用しているプロダクト名 (ここでは Armadillo-440) を選択します。

atmarkdist_select_product01.png
Atmark-dist Configuration:プロダクト選択 (Armadillo-440)

Kernel/Library/Defaults Selection

VendorProduct Selectionメニューを抜け、Kernel/Library/Defaults Selectionメニューを選択します。

atmarkdist_customize_kernel.png
Atmark-dist Configuration:Kernel/Library選択画面

まず以下のように、カーネルソースとクロス開発環境およびライブラリを選択します。

  • Kernel: 前述の通りにディレクトリ構成を準備していれば自動で linux-2.6-x が選択される
  • (default) Cross-dev: デフォルトのまま。Armadillo-400系の場合は実質 armel
  • (None) Libc Version: デフォルトの None を選択

次は、このAtmark-dist Configurationの後に、カーネルやユーザランドの設定を行うかどうかの選択をします。

今回は、CDC ACMドライバを組み込むだけで、ユーザランドには手を加えないので、Customize Kernel Settings にのみスペースキーを押してチェックを入れます。

以上、設定が終了したら、Exit でメニューを抜けます。最後に Do you wish to save your new kernel configuration? と尋ねられるので Yes を選択して Atmark-Dist Configurationを終了します。

atmarkdist_exit_atmark_config.png
Atmark-dist Configuration:終了

カーネルの設定

Atmark-Dist Configurationを終了すると、シェル画面に戻り、コンパイルを開始します。しばらくするとカーネルの設定メニューが表示されます。

kernel_config00.png
Linux Kernel Configuration: 初期画面

Atmark-Dist同様、青い長方形がカーソルで、カーソルキーで上下に移動、Enterまたはスペースキーで選択します。

デバイスドライバを組み込むので、Device Driverを選択します。

kernel_config_devicedriver.png
Linux Kernel Configuration: Device Driver

下のほうにある USB Support サブメニューに入ります。

kernel_usb_support.png
Linux Kernel Configuration: USB Supportサブメニューを選択

CDC ACMドライバは USB Modem (CDC ACM) support というところにあります。

kernel_cdc_acm.png
Linux Kernel Configuration: USB Modem (CDC ACM) support

USB Modem (CDC ACM) support にカーソルを持っていき、スペースキーを押します。スペースキーを押すごとに、< >(無印) -> <M>(モジュール) -> <*> (組込ドライバ) のようにマークが変更されます。組込みドライバにする場合は、チェックボックスを以下のように <*> (アスタリスク) に設定します。

kernel_cdc_acm_embed.png
Linux Kernel Configuration: 組込型ドライバ設定

カーネルモジュール型ドライバにしたい場合は、チェックボックスを以下のように <M> に設定します。

kernel_cdc_acm_module.png
Linux Kernel Configuration: カーネルモジュール型設定

以上でCDC ACMドライバの設定は終わりです。Exitを何回か選択して Linxu Kernel Configuration を抜けます。

kernel_config_exit.png
Linux Kernel Configuration: 終了

最後にカーネル設定を保存するかどうか尋ねられるので、Yesと答えて終了します。

コンパイル

以上が終了したら、コンパイルを行います。 atmark-dist 直下のディレクトリで make clean と make を行います。 以前コンパイルしたオブジェクトファイルなどが残っている場合があるので、make clean は必ず行ってください。 コンパイルはPCの性能にもよりますが、数分から十数分かかります。

 atmark@atde3:~/work/atmarkdist/atmark-dist$ make
 make -C tools/sg-cksum
 make[1]: ディレクトリ `/home/atmark/work/atmarkdist/atmark-dist/tools/sg-cksum' に入ります
   :
  数分から十数分
   :
 /home/atmark/work/atmarkdist/atmark-dist/tools/cksum -b -o 2 /home/atmark/work/atmarkdist/atmark-dist/images/linux.bin.gz >> /home/atmark/work/atmarkdist/atmark-dist/images/linux.bin.gz
 make[1]: ディレクトリ `/home/atmark/work/atmarkdist/atmark-dist/vendors/AtmarkTechno/Armadillo-440' から出ます
 atmark@atde3:~/work/atmarkdist/atmark-dist$

コンパイルが終了すると、image ディレクトリの下に、linux.bin.gz, romfs.img.gz といったイメージファイルができているはずです。 途中でコンパイルエラーになっている場合、このイメージは作成されませんので、作成されたイメージファイルのタイムスタンプをよく確認してください。

 atmark@atde3:~/work/atmarkdist/atmark-dist$ ls -al images/
 合計 43296
 drwxr-xr-x  2 atmark atmark     4096 2012-08-19 12:47 .
 drwxr-xr-x 15 atmark atmark     4096 2012-08-19 12:47 ..
 -rwxr-xr-x  1 atmark atmark  3617965 2012-08-19 12:47 linux.bin
 -rw-r--r--  1 atmark atmark  1764568 2012-08-19 12:47 linux.bin.gz
 -rw-r--r--  1 atmark atmark 27803685 2012-08-19 12:47 romfs.img
 -rw-r--r--  1 atmark atmark 11071893 2012-08-19 12:47 romfs.img.gz

それぞれ、

  • linux.bin: Linux kernel。
  • linux.bin.gz: gzip 圧縮されたLinux kernel。これをArmadilloのkernel領域に書き込む。
  • romfs.img: ユーザランドイメージ。
  • romfs.img.gz: gzip圧縮されたユーザランドイメージ。これをArmadilloのuserland領域に書き込む。

となっています。

ダウンロード

作成したカーネルとユーザランドのイメージをArmadilloに書き込み(ダウンロード)ます。 (組込みの分野では、ROM領域へプログラムを書き込むことを一般にダウンロードと呼びます。)

カーネルやユーザランドへのイメージの書き込みは以下のサイトが参考になります。

書き込みはLinuxからでも、Windowsからでも行うことができますが、ここでは、Windows用のHermit-At Win32を用いてイメージを書き込む方法を説明します。

PCとArmadilloの接続

PCにシリアルポートがある場合は、PCとArmadilloをシリアルケーブルで接続します。 PCにシリアルポートがない場合、USB-シリアル変換コネクタなどを用いてArmadilloとPCを接続してください。 デバイスマネージャでどのシリアルポートがArmadilloにつながっているか確認してください。

ジャンパピンの変更

ArmadilloのDCコネクタ付近に4本(2x2)のピンヘッダが出ています。 このうち、逆サイドのLANコネクタやUSBコネクタに近い2ピンをジャンパでショートさせます。 これで、hermitによりROM書き込みモードになります。 この段階ではまだArmadilloに電源を入れないでください。

Hermit-At Win32

Hermit-At Win32 WindowsからArmadilloのフラッシュメモリ領域に各種イメージを書き込むためのツールです。 以下のサイトからダウンロードできます。

hermit.exe を起動するとこのようなウインドウが現れます。

hermit_win32_start.png
Hermit-At Win32 起動画面

まず、使用するシリアルポートを選択します。 ここでは、COM2がArmadilloに接続されているシリアルポートです。

Memmapボタンを押してみてください。PCとArmadilloが正しく接続されており、ArmadilloがHermitのダウンロードモードになっていれば、メモリマップが表示されます。

hermit_win32_memmap.png
Hermit-At Win32 Memmap画面

表示を見てみると、RAMとFLASH領域があり、さらにFLASH領域は
  • config
  • userland
  • kernel
  • bootloader に分かれていることがわかります。

これから書き換えようとしているのは、kernel のカーネル領域と、userlandのユーザランド領域です。

カーネルの書き換え

まず、カーネルの書き換えを行います。 Erase ボタンを押し、Regionのプルダウンで kernelを選択し、実行ボタンを押します。

hermit_win32_erase_kernel.png
Hermit-At Win32 Erase画面

ダイアログが表示されカーネル領域が削除されます。

次にダウンロードボタンを押し、Image で先ほど作った linux.bin.gz を、Regionで kernel 選択します。

hermit_win32_download.png
Hermit-At Win32 Download画面

Image の右側の ... ボタンを押すと、ファイル選択のためのダイアログが開きます。ATDE3 for OpenRTM ではsambaが設定されていますので、アドレスバーのところに

 \\192.168.5.132 <- ATDE3 for OpenRTMのアドレス
 または
 \\192.168.5.132\atmark\work\atmarkdist\atmark-dist\images

のように、ATDEのアドレスを入力します。アカウント名(atmark)とパスワード(atmark)を入力し、先ほど作成したlinux.bin.gzのフォルダにアクセスし、ファイル (linux.bin.gz) を選択します。

hermit_win32_download_filadialog.png
Hermit-At Win32 ファイル選択画面

linux.bin.gz (拡張子が見えず linux.bin と表示されますが、種類がGZファイルとなっているほう) を選択します。以上が終わったら実行ボタンをクリックします。 書き込みダイアログが表示され、数分でカーネルの書き込みは終了します。

ユーザランドの書き換え

次にユーザランドを書き換えます。 カーネル同様、

  • Erase メニューで userland を削除
  • Download メニューで先ほど linux.bin.gz を選択した場所にある、romfs.img.gz を選択し、書き込み

を行います。 ユーザランドはファイルサイズが大きいため、書き換えには十数分かかります。

以上で、カーネルとユーザランドの書き換えは終了です。

デバイスの接続

URGセンサの接続

Armadilloのジャンパピンをオープンにして、電源を再投入します。この時URGセンサはまだ接続しないでください。

URGセンサはUSB Modeとして /dev/ttyACM0 (2つ目以降はttyACM1, ttyACM2, ...) というデバイス名で利用できます。

起動後、rootでログインして、デバイスが存在するかどうか確認してみてください。

 [root@armadillo440-0 (ttymxc1) ~]# ls /dev/ttyACM*
 ls: /dev/ttyACM*: No such file or directory

USGセンサはまだ接続されていないのでまだデバイスファイルは存在しません。 次に、URGセンサを接続してみます。URGセンサをArmadilloのUSBコネクタに接続すると以下のようなメッセージが表示されます。

 usb 1-1: new full speed USB device using fsl-ehci and address 4
 usb 1-1: device descriptor read/64, error -71
 usb 1-1: configuration #1 chosen from 1 choice

モジュールのロード

CDC ACMドライバをカーネルに直接組み込んだ場合は、/dev/ttyACM0 ができているはずです。モジュールとして組み込んだ場合は、ドラバモジュールをロードする必要があります。デバイスモジュールのロードには modprobe コマンドを使います。

 [root@armadillo440-0 (ttymxc1) /etc]# modprobe cdc-acm
 Using /lib/modules/2.6.26-at16/kernel/drivers/usb/class/cdc-acm.ko
 cdc_acm 1-1:1.0: ttyACM0: USB ACM device
 usbcore: registered new interface driver cdc_acm
 cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters
 [root@armadillo440-0 (ttymxc1) /etc]# ls -l /dev/ttyACM*
 crw-rw----    1 root     root     166,   0 Aug 19 14:55 /dev/ttyACM0

以上で、CDC ACMドライバがシステムに組み込まれていることが確認できました。

モジュールの自動ロード

CDC ACMドライバをカーネルに直接組み込んだ場合は、URGセンサを接続しArmadilloを起動すると自動的にデバイスが利用可能になりますが、モジュールとして組み込んだ場合 modprobe でドライバモジュールを組み込む必要があります。

Armadillo の /etc/config/rc.local にmodprobeコマンドを追加することで、自動時に自動的にモジュールをロードするよう設定します。

 [root@armadillo440-0 (ttymxc1) ~]# vi /etc/config/rc.local

viエディタでrc.localのPATH設定を行っている部分の後ろくらいに以下のようなコマンドを入力します。

 PATH=/bin:/sbin:/usr/bin:/usr/sbin
 
 # ここから
 if test -f /lib/modules/2.6.26-at16/kernel/drivers/usb/class/cdc-acm.ko; then
  echo -n "Loading CDC ACM driver"
  modprobe cdc-acm
  check_status
 fi
 # ここまで

上述したように、/etc/config 以下のディレクトリは保存可能なコンフィギュレーション領域ですので flatfsd コマンドを使って保存することができます。

 [root@armadillo440-0 (ttymxc1) ~]# flatfsd -s
 flatfsd: saving fs to partition 0, tstamp=1
 flatfsd: Wrote 5720 bytes to flash in 1 seconds

Armadilloを再起動して、ドライバ組み込まれるかどうかを確認します。

起動中以下のようなメッセージが出るか

 Loading CDC ACM driverUsing /lib/modules/2.6.26-at16/kernel/drivers/usb/class/cdc-acm.ko
 cdc_acm 1-1:1.0: ttyACM0: USB ACM device
 usbcore: registered new interface driver cdc_acm
 cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters
                                                                 done

dmesg コマンドを使って確認することができます。

 cdc_acm 1-1:1.0: ttyACM0: USB ACM device
 usbcore: registered new interface driver cdc_acm
 cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters

以上でURGセンサのためのCDC ACM USB Modemドライバの組込みは終了です。

カーネルとユーザランドの設定 (無線LANドライバ編)

カーネルとユーザランドの設定 (無線LANドライバ編)

ArmadilloでRalink Chipの無線LANアダプタを利用する方法について説明する。 対象とするのは、比較的ポピュラーな Ralink Chipを(RT3070/RT3370/RT5370/RT5372系チップ) 搭載したUSB無線LANインターフェース。

カーネルの設定

Armadillo-440用のデフォルトのカーネル (linux-a400-1.09.bin.gz) では無線LANに関するオプションが有効になっていないため、無線LANを有効にしカーネルの再コンパイルが必要となる。

atmarkdist02.png
図2 カーネル設定画面

上のようなカーネルの設定画面が表示されたら、下記の無線LANデバイスに関するオプションにチェックをつける。

  • Device Drivers --->
    • [*] Network device support --->
      • Wireless LAN --->
        • [*] Wireless LAN (IEEE 802.11)

Exitしてカーネルの設定メニューを抜ける。

atmarkdist03.png
図3 Wireless LAN (IEEE 802.11)を有効にする

ユーザランド (romfs) の設定

カーネルの設定画面を抜けると、ユーザランドの設定画面が起動する。

atmarkdist04.png
図4 ユーザランド設定画面

Network Applicationsの設定に入り、下の方の hostap にチェックをいれる。すると、更に下層のメニューが開くので、wpa_supplicant にチェックを入れる。

  • Network Applications --->
    • [*] hostap
      • [*] wpa_supplicant

この他

  • wireless_tools support
  • iwconfig
  • iwlisthttp://daqmw.kek.jp/seminar/2012/slide/DAQ_MW-BBT20120808.pptxhttp://daqmw.kek.jp/seminar/2012/slide/DAQ_MW-BBT20120808.pptx
  • iwpriv

などのWLAN関係のツールがチェックされていることを念のため確認。

atmarkdist05.png
図5 ユーザランド設定画面

以上が終わったらExitで抜ける。

user/hostap/wpa_supplicant/.config の編集

このままmakeを行うと、madwifi関係のコンパイルでエラーになるため、user/hostap/wpa_supplicant/.config の設定を変更する。

 $ vi user/hostap/wpa_supplicant/.config

として、以下のように CONFIG_DRIVER_MADWIFI=y をコメントアウトする。

 # Driver interface for madwifi driver
 #CONFIG_DRIVER_MADWIFI=y
 # Change include directories to match with the local setup
 CFLAGS += -I$(ROOTDIR)/$(LINUXDIR)/drivers/net/wireless/madwifi

ビルド

以上が終了したら、コンパイルを行います。 atmark-dist 直下のディレクトリで make clean と make を行います。 以前コンパイルしたオブジェクトファイルなどが残っている場合があるので、make clean は必ず行ってください。 コンパイルはPCの性能にもよりますが、数分から十数分かかります。

 atmark@atde3:~/work/atmarkdist/atmark-dist$ make
 make -C tools/sg-cksum
 make[1]: ディレクトリ `/home/atmark/work/atmarkdist/atmark-dist/tools/sg-cksum' に入ります
   :
  数分から十数分
   :
 /home/atmark/work/atmarkdist/atmark-dist/tools/cksum -b -o 2 /home/atmark/work/atmarkdist/atmark-dist/images/linux.bin.gz >> /home/atmark/work/atmarkdist/atmark-dist/images/linux.bin.gz
 make[1]: ディレクトリ `/home/atmark/work/atmarkdist/atmark-dist/vendors/AtmarkTechno/Armadillo-440' から出ます
 atmark@atde3:~/work/atmarkdist/atmark-dist$

 
依存関係などでエラーが出るケースがあるが、丹念に依存関係を解決するよう設定を見直してください。それでもコンパイルが出来ない場合、atmark-distとLinuxカーネルともにソースから展開し初期状態から行うと良い場合もあります。

ドライバソースのダウンロード

Ralinkのサイトからドライバのソースコードをダウンロードする。

対象無線LANデバイス

以下に、Ralinkチップを使用したUSB無線LANデバイスのリストを示す。

RT8070/RT3070/RT3370/RT5370/RT5372系チップ

RT3070/RT3370/RT5370/RT5372系チップ用ドライバは以下からダウンロード可能。

メーカー 型番 VID:PID Chip
RT8070系チップ
BUFFALO WLI-UC-GNM 0411:01a2 RT8070V
LOGITEC LAN-GMW/DS 0789:0168 RT8070V
LOGITEC LAN-GMW/PSP 0789:0168 RT8070V
LOGITEC LAN-W150N/U2 0789:0164 RT8070V
RT3070系チップ
PLANEX GW-USMicroN 2019:ED14 RT3070L
PLANEX GW-USMicroN-G 2019:ED14 RT3070L
PLANEX GW-USMicro300 2019:AB29 RT3072L
Logitec LAN-W150N/U2DS 0789:0164 RT3070?
Logitec LAN-WN11/U2 0789:0164 RT3070L
BUFFALO WLI-UC-GN 0411:015D RT3070L
BUFFALO WLI-UC-GNHP 0411:0158 RT3070L
BUFFALO WLI-UC-GNP 0411:019E RT3070L
BUFFALO WLI-UC-GNT 0411:015D RT3070L
BUFFALO WLI-UC-GNM 0411:01A2 RT3070L?
BUFFALO WLI-UC-GNM2 0411:01A2 RT3070L?
BUFFALO WLI-UC-GNM2R 0411:01A2 RT3070L?
BUFFALO WLI-UC-G301N 0411:01A2 RT3070L?
IODATA WN-G150U 04BB:0947 RT3070
RT3370系チップ
BUFFALO WLI-UC-G300N 0411:00E8 RT3370
BUFFALO WLI-UC-G300HP 0411:0148 RT3370
BUFFALO WLI-UC-GNHP 0411:0158 RT3370
BUFFALO WLI-UC-GN 0411:015D RT3370
BUFFALO WLI-UC-GNP 0411:019E RT3370
BUFFALO WLI-UC-GNM 0411:01A2 RT3370
Logitec LAN-W300N/U2 0789:0166 RT3370
PLANEX GW-USMini2N 2019:AB25 RT3370
RT5370系チップ
BUFFALO WLI-UC-G300N 0411:00E8 RT5370
BUFFALO WLI-UC-AG300N 0411:012E RT5370
BUFFALO WLI-UC-G300HP 0411:0148 RT5370
BUFFALO WLI-UC-GNHP 0411:0158 RT5370
BUFFALO WLI-UC-GN 0411:015D RT5370
BUFFALO WLI-UC-GNP 0411:019E RT5370
BUFFALO WLI-UC-GNM 0411:01A2 RT5370
Logitec LAN-W300N/U2 0789:0166 RT5370
PLANEX GW-USMini2N 2019:AB25 RT5370

RT2800系チップ

RT2800系チップ用ドライバは以下からダウンロード可能。RT3070/RT3370/RT5370/RT5372系チップ用ドライバで動作するとの情報もあるが詳細は不明。

http://www.ralinktech.com/en/04_support/license.php?sn=5021

メーカー 型番 VID:PID Chip
RT2800系チップ
BUFFALO WLI-UC-G300N 0411:00E8 RT2800
BUFFALO WLI-UC-AG300N 0411:012E RT2800
BUFFALO WLI-UC-G300HP 0411:0148 RT2800
BUFFALO WLP-UC-AG300 0411:0150 RT2800
BUFFALO WLI-UC-GNHP 0411:0158 RT2800
BUFFALO WLI-UC-GN 0411:015D RT2800
BUFFALO WLI-UC-G301N 0411:016F RT2800
BUFFALO WLI-UC-GNM 0411:01A2 RT2800
Logitec LAN-WN22/U2 0789:0162 RT2800
Logitec LAN-WN12/U2 0789:0163 RT2800
Logitec LAN-W150/U2M 0789:0164 RT2800
Logitec LAN-W300N/U2 0789:0166 RT2800
Logitec LAN-W150N/U2 0789:0168 RT2800
Corega CG-WLUSB2GNL 07AA:002F RT2800
Corega CG-WLUSB2GNL 07AA:003C RT2800
Corega CG-WLUSB300AGN 07AA:003F RT2800
Corega CG-WLUSB300GNS 07AA:0041 RT2800
Corega CG-WLUSB300GNM 07AA:0042 RT2800
PLANEX GW-US300MiniS 2019:AB24 RT2800
PLANEX GW-USMini2N 2019:AB25 RT2800
PLANEX GW-US300MiniW 2019:ED06 RT2800
RT2870系チップ
エレコム LAN-W150N/U2KT 0789:0168 RT2870
BUFFALO WLI-UC-G300N 0411:00E8 RT2870
Logitec LAN-WN22/U2 0789:0162 RT2870
Logitec LAN-WN12/U2 0789:0163 RT2870
Logitec W150/U2M 0789:0164 RT2870
Corega CG-WLUSB2GNL 07AA:002F RT2870
Corega CG-WLUSB2GNL 07AA:003C RT2870
Corega CG-WLUSB300AGN 07AA:003F RT2870
PLANEX GW-USMini2N 2019:AB25 RT2870
PLANEX GW-US300Mini 2019:ED06 RT2870
PLANEX GW-USMicroN 2019:ED14 RT2870

ダウンロード・展開

ダウンロードしたソースをatmark-distと同じディレクトリに展開する。 なお、ダウンロードしたソースはファイル名の拡張子がbz2のみになっているが実際はtar.bz2圧縮である。

 $ tar xvjf 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO.bz2
 $ mv 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO RT3070 // ディレクトリ名が長いので修正
 $ cd RT3070

パッチを当てる

を当てる。

 $ wget http://aaaaa/RT3070.patch
 $ patch -p1 < RT3070.patch

ビルドする

makeする。 atmark-dist と同じディレクトリ以外に展開した場合、環境変数 ATMARKDIST_DIRに設定してmakeする必要がある。 以下の例では、atmark-dist が /home/atmark/work/atmark-dist にあると仮定している。

 $ ATMARKDIST_DIR=/home/atmark/work/atmark-dist make
 $ ATMARKDIST_DIR=/home/atmark/work/atmark-dist make install

これにより、atmark-dist/romfs以下のディレクトリにカーネルモジュール (rt5370sta.ko) と設定ファイル (RT2830STA.dat) が保存される。

  • romfs/lib/modules/2.6.26-at16/kernel/drivers/net/wireless/rt5370sta.ko
  • romfs/etc/Wireless/RT2870STA/RT2870STA.dat

イメージを書き込む

romfsイメージを作る

Armadilloに書き込むための romfs イメージを再度作成する。

 $ cd /home/atmark/work/atmark-dist
 $ make image
 $ ls -al images
 合計 45300
 drwxr-xr-x  2 atmark atmark     4096 2012-08-12 11:46 .
 drwxr-xr-x 15 atmark atmark     4096 2012-08-13 01:26 ..
 -rwxr-xr-x  1 atmark atmark  3626594 2012-08-12 15:54 linux.bin
 -rw-r--r--  1 atmark atmark  1769841 2012-08-12 15:54 linux.bin.gz
 -rw-r--r--  1 atmark atmark 29314085 2012-08-12 15:54 romfs.img
 -rw-r--r--  1 atmark atmark 11603547 2012-08-12 15:54 romfs.img.gz

カーネル linux.bin.gz およびユーザランド romfs.img.gz

Armadillo にユーザランドイメージをダウンロードする

hermitなどを立ち上げてromfs.img.gz をユーザランドにダウンロードする。 詳細については、アットマークテクノの以下のページを参照してください。

第6章 フラッシュメモリの書き換え方法

無線LANの設定

キーの取得

 # wpa_passphrase <SSID>

により、パスフレーズ入力プロンプトが表示されるので、パスフレーズを入力すると以下のように暗号化された psk のキーが出力される。

 # wpa_passphrase HOGE
 # reading passphrase from stdin
 4332221111
 network={
         ssid="HOGE
         #psk="4332221111"
         psk=b7752c14f1586911c99a4bbce1ad3921f5bbbb9e62a05dcc8f7be6fae8c2fca5

/etc/config/interfaces の修正

無線LAN用に /etc/config/interfaces を以下のように修正する。

 # /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
 
 auto lo ra0
 
 iface lo inet loopback
 #iface eth0 inet dhcp
 
 iface ra0 inet dhcp
   pre-up modprobe rt5370sta
   wpa-ssid MARISA
   wpa-psk b7752c24f1586911c99a4bbce1ad3921f5bbbb9e62a05dcc8f7be6fae8c2fca5
   scan_ssid 0 
   ap_scan 11

さらに、flatfsd で変更された interfaces ファイルを flatfsd で config 領域に保存する。

 # flatfsd -s

確認

再起動し無線LANが動作していることを確認する。

 Configuring network interfaces: Using /lib/modules/2.6.26-at16/kernel/drivers/net/wireless/rt5370sta.ko
 rtusb init rt2870 --->
 usbcore: registered new interface driver rt2870
 no /sbin/wpa_supplicant found; none killed.
 ioctl[SIOCSIWPMKSA]: Network is down
 ioctl[SIOCSIWMODE]: Network is down
 Could not configure driver to use managed mode
 0x1300 = 00064300
 ioctl[SIOCSIWAUTH]: Operation not supported
 WEXT auth param 4 value 0x0 - udhcpc (v0.9.9-pre) started
 Sending discover...
 Sending discover...
 Sending discover...
 Sending select for 192.168.11.16...
 Lease of 192.168.11.16 obtained, lease time 86400
                                                                 done
 Starting inetd:                                                 done

ログイン後、iwconfig, ifconfig などで動作状況を確認できる。

 # iwconfig ra0
 ra0       Ralink STA  ESSID:"MARISA"  Nickname:"RT2870STA"
           Mode:Managed  Frequency=2.437 GHz  Access Point: 00:3A:9D:DC:7C:6A
           Bit Rate=270 Mb/s
           RTS thr:off   Fragment thr:off
           Encryption key:BA10-1A03-2808-3D5E-1F43-2A50-BF10-25A7   Security mode:open
           Link Quality=100/100  Signal level:-53 dBm  Noise level:-74 dBm
           Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
           Tx excessive retries:0  Invalid misc:0   Missed beacon:0
 # ifcnofig ra0
 ra0       Link encap:Ethernet  HWaddr 00:22:CF:41:6F:4D
           inet addr:192.168.11.16  Bcast:192.168.11.255  Mask:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000
          RX bytes:658590 (643.1 KiB)  TX bytes:50439 (49.2 KiB)

トラブルシューティング

モジュールのロードができていない

何らかの理由でモジュールがロードできていない場合、無線LANデバイスは使用できない。

 # lsmod (ロードされているモジュールを見る)
 Module                  Size  Used by    Not tainted
 rt5370sta 752944 1 - Live 0xbf000000

もし、rt5370sta モジュールがロードされていない場合、手動でロードしてみる。

 # modprobe rt5370sta
 または
 # insmod /lib/modules/2.6.26-at16/kernel/drivers/net/wireless/rt5370sta.ko

ネットワークインターフェースが起動しない

モジュールがロードされているのにに、ネットワーク・インターフェース ra0 が起動しない場合、手動で起動してみる。

 # ifconfig ra0 up
 # ifconfig ra0
 ra0       Link encap:Ethernet  HWaddr 00:22:CF:41:6F:4D
           inet addr:192.168.11.16  Bcast:192.168.11.255  Mask:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000
          RX bytes:658590 (643.1 KiB)  TX bytes:50439 (49.2 KiB)

IPアドレスが割り当てられない

ネットワークインターフェースが割り当てられない場合、手動でDHCPクライアントを起動してみる。

 # udhcpc -b -p /var/run/udhcpc.ra0.pid -i ra0

参考ページ

Atmarkテクノ Webページ

その他

ファイルダウンロード

この節で使用したファイルを以下からダウンロードできます。

ファイル名 (サイズ) 説明 日付
ドライバ設定: カーネルモジュール
rt3070_mod_linux.bin.gz
1,765,638 bytes
CDC ACM, RT3070系ドライバを組み込んだArmadillo-440用カーネルイメージ。
CMSのシステムの都合上ファイル名が linux.bin_.gz となっています。
2012.08.19
rt3070_mod_romfs.img.gz
11,594,936 bytes
CDC ACM, RT3070系ドライバを組み込んだArmadillo-440用ユーザランドイメージ。
CMSのシステムの都合上ファイル名が romfs.img_.gz となっています。
2012.08.19
rt3070_configs.tar.gz
19,440 bytes
上記設定をしたLinuxカーネル設定ファイル。 2012.08.19

OpenRTM-aistのクロスコンパイル

OpenRTM-aistのクロスコンパイル

クロス開発とは、ターゲットとは異なるアーキテクチャ上でそのターゲット用のバイナリを開発することです。

ArmadilloはARM Ltd.により開発されたARMアーキテクチャのCPUを搭載している組み込みコンピュータです。 一方、大半のPCはIntelが開発した i386 (または x86_64) アーキテクチャのCPUを搭載しています。 通常、ARM CPU上で実行できるバイナリ(コマンド、アプリケーション)は、i386 CPU上では実行できませんし、i386 CPU用のバイナリは、ARM CPU上では動作しません。 CPU毎に異なるバイナリ実行形式を用意してあげる必要があります。

通常ARM CPUは安価・省電力である一方、PCなどと比べるとメモリやハードディスクが少なく(ハードディスクが無いことも多い)、速度も遅いので、ARMを搭載した組み込みコンピュータ上でコンパイルなどの開発作業を行うことは効率的ではありません。 (実際、Armadillo-200シリーズに組み込まれているARM CPUはそれほど遅くはなく、一昔前のPCくらいの速度はありますので、開発作業は不可能ではありませんが、開発に必要なディスクスペースがありません。)

そこで、一般的なPC上で、ARM CPU上で実行可能なバイナリを作成(クロスコンパイル)するクロス開発が通常行われます。

ATDEはArmadillo用のクロス開発を行うための各種ツールがあらかじめインストールされており、標準ライブラリのみ使用するのであれば、そのままの環境で開発することができます。 /usr/arm-linux-gnueabi の下には、ARM用にコンパイルされた実行ファイルやライブラリファイルが格納されています。 以下のようにfileコマンドを使って確認してみてください。

 atmark@atde:~$ file /usr/arm-linux-gnu/lib/libc-2.3.6.so
 /usr/arm-linux-gnu/lib/libc-2.3.6.so: ELF 32-bit LSB shared object, ARM, version 1 (ARM), for GNU/Linux 2.4.1, stripped

ELF 32-bit LSB shared object, ARMという文字が見えますが、これはこのライブラリがARMアーキテクチャ用のものであることを表しています。

標準以外のライブラリが必要な場合、ARM Linux用にコンパイルされたDebianパッケージを、クロス開発環境にインストールすることで、これを利用したアプリケーションなどをコンパイル・リンクすることができます。

以下、OpenRTM-aistをクロスコンパイルするために必要なパッケージのインストール、クロスコンパイル方法について解説します。

必要なパッケージのインストール

クロス開発を行うためには、ARM用の各種ライブラリをインストールする必要があります。ATDE3では既に大半のライブラリが用意されており、簡単なプログラムであればほぼそのままで利用できますが、OpenRTM-aistを使用する場合はomniORBやlibuuidなどOpenRTMが利用しているライブラリをインストールする必要があります。

OpenRTMを利用するために必要なライブラリをインストールするには、一括インストールスクリプトpkg_install_atde3.shを利用すると便利です。

以下、pkg_install_atde2.sh が行なっていることを簡単に説明します。

ARM用debパッケージ

ARM用のライブラリは以下のサイトに様々なアーキテクチャ用にまとめて置かれています。

例えば、omniORBは、

以下に置かれています。libomniorb4のパッケージだけでも、これだけあります。

 libomniorb4-1_4.1.2-1+b1_alpha.deb    22-Apr-2008 16:47    1.5M     
 libomniorb4-1_4.1.2-1+b1_amd64.deb    13-Apr-2008 22:47    1.4M     
 libomniorb4-1_4.1.2-1+b1_arm.deb    14-Apr-2008 07:47    1.4M     
 libomniorb4-1_4.1.2-1+b1_armel.deb    14-Apr-2008 21:17    1.2M     
 libomniorb4-1_4.1.2-1+b1_hppa.deb    14-Apr-2008 12:32    1.6M     
 libomniorb4-1_4.1.2-1+b1_i386.deb    14-Apr-2008 16:02    1.4M     
 libomniorb4-1_4.1.2-1+b1_ia64.deb    14-Apr-2008 12:32    1.8M     
 libomniorb4-1_4.1.2-1+b1_mipsel.deb    14-Apr-2008 15:47    1.2M     
 libomniorb4-1_4.1.2-1+b1_powerpc.deb    14-Apr-2008 15:47    1.5M     
 libomniorb4-1_4.1.2-1+b1_s390.deb    14-Apr-2008 17:02    1.4M     
 libomniorb4-1_4.1.2-1+b1_sparc.deb    14-Apr-2008 05:47    1.4M     
 libomniorb4-1_4.1.2-1_mips.deb        24-Apr-2008 21:58    1.3M

aplha, hppa, mipsdel などおそらく聞きなれないアーキテクチャのパッケージもあれば、i386, amd64, powerpc などのおなじみのアーキテクチャのものもあります。 ARM用のパッケージには、armとarmelの2種類がありますが、Armadillo-400シリーズでは通常 armel アーキテクチャのパッケージを利用します。

ARMには現在2種類のABI (Application Binary Interface) があり、それぞれ OABI (Old ABI), EABI (Embedded ABI) と呼ばれます。 arm パッケージはOABI用にコンパイルされたものであることを意味し、armel パッケージはEABI用にコンパイルされたものであることを意味します。 なお armel は ARM little-endian (eとlが逆のような気もしますが) の略で、実際バイエンディアンCPUであるARM用に armeb (ARM big-endian) という名称もありますが、こちらは使われていないようです。

dpkg-cross

クロス開発用のライブラリをインストールするためには、dpkgではなくdpkg-crossコマンドを利用します。 なお、apt-getのクロスパッケージ版のapt-crossというコマンドもありますが、ATDE2のベースとなっている Debian Etch にはパッケージとして存在しないので、debパッケージを一つづつダウンロードして dpkg-cross を用いてインストールする必要があります。

dpkg-cross は以下の様に使用します。

 wget http://package_url/package_name.deb
 dpkg-cross -a arm -i pkg_name

  • a arm はarmアーキテクチャの指定オプションです。

必要なパッケージ

OpenRTMをコンパイルするために必要なパッケージは以下のとおりです。

  • i386用通常パッケージ
    • python python-dev python-support python-syck
  • arm 用 cross パッケージ
    • libuuid1 uuid-dev

Etch用ARMアーキテクチャ対応のomniORBがリポジトリには存在しますが、omniORBが古くかつ浮動小数点の値の送受信にバグがあるため、自分でソースからコンパイルする必要があります。 i386用パッケージはapt-getで、arm 用パッケージはdpkg-crossでインストールします。

omniORBのコンパイル

リポジトリからダウンロードできる omniORB-4.0.6は、コンパイル時のオプションの関係で、double型のデータをネットワーク経由でやり取りすると、値が化けるというバグがあります。したがって、omniORBに関してはソースからコンパイルしインストールする必要があります。 omniORB-4.1.6以降ではこのバグの対処がなされているので、再コンパイルする場合は4.1.6以降のバージョンを推奨します。 omniORBのクロスコンパイルの手順をまとめたスクリプトを利用することもできます。(このスクリプトは4.1.6以前、以後を判断して、4.1.6より前のomniORBには自動的にパッチを当てます。)

 $ tar xvjf omnioRB-4.1.6.tar.bz
 $ cd omniORB-4.1.6
 $ ./configure --prefix=/usr/arm-linux-gnu CXX=/usr/bin/arm-linux-gnu-g++ CC=/usr/bin/arm-linux-gnu-gcc CXXFLAGS=-s CFLAGS=-s --build=i386-linux-gnu --host=arm-linux-gnu --target=arm-linux-gnu --with-omniorb=/usr/arm-linux-gnu --with-includes=-I/usr/arm-linux-gnu/include
 $ make clean
 $ make CC=gcc -C src/tool/omniidl/cxx/cccp
 $ make CXX=g++ -C src/tool/omniidl/cxx
 $ make CC=gcc-3.4 -C src/tool/omkdepend
 $ make
 $ sudo make install

途中、CC=gcc, CXX=g++ などと指定しているのは、ホスト(i386)環境上で動かす必要のあるomniidlの関連モジュールをコンパイルしているためです。 (omniORBはビルドの途中で、幾つかのIDLファイルをomniidlでコンパイルしますが、omniidl自体がARM用実行ファイルだと実行できないため。)

また、上記のスクリプトを使った場合、

 $ tar xvjf omnioRB-4.1.6.tar.bz
 $ cd omniORB-4.1.6
 $ wget http://svn.openrtm.org/Embedded/trunk/Armadillo/atde2/tools/omniorb_crossbuild.sh
 $ chmod 755 omniorb_crossbuild.sh
 $ ./omniorb_crossbuild.sh /usr/arm-linux-gnu
 $ sudo make install

となり、若干手順が簡単になります。

OpenRTM-aistのクロスコンパイル

OpenRTM-aistはビルドシステムにautoconf/automakeを利用しているため、configureのオプションを幾つか指定するだけでクロスコンパイル可能です。

 $ wget http://openrtm.org/pub/OpenRTM-aist/cxx/1.1.0/OpenRTM-aist-1.1.0-RELEASE.tar.bz2
 $ tar xvjf OpenRTM-aist-1.1.0-RELEASE.tar.bz2
 $ cd OpenRTm-aist-1.1.0
 $ ./configure --prefix=/usr/arm-linux-gnu CXX=/usr/bin/arm-linux-gnu-g++ CC=/usr/bin/arm-linux-gnu-gcc CXXFLAGS=-s CFLAGS=-s --build=i386-linux-gnu --host=arm-linux-gnu --target=arm-linux-gnu --with-omniorb=/usr/arm-linux-gnu --with-includes=-I/usr/arm-linux-gnu/include
 $ make
 $ make install

もしくは、OpenRTM用cofnigureスクリプト を利用して、

 $ wget http://openrtm.org/pub/OpenRTM-aist/cxx/1.1.0/OpenRTM-aist-1.1.0-RELEASE.tar.bz2
 $ tar xvjf OpenRTM-aist-1.1.0-RELEASE.tar.bz2
 $ cd OpenRTm-aist-1.1.0
 $ wget http://svn.openrtm.org/Embedded/trunk/Armadillo/atde2/tools/openrtm_conf_arm.sh
 $ make
 $ make install

とすると、手順が若干簡単になります。

以上でOpenRTM-aistがクロス開発環境にインストールされました。 以下のファイルがあることを確認してください。

  • /usr/arm-linux-gnu/include/openrtm-1.1/rtm 以下のヘッダファイル
  • /usr/arm-linux-gnu/lib/libcoil* 等 coilライブラリ
  • /usr/arm-linux-gnu/lib/libRTC* 等 OpenRTMライブラリ

rtc-make-cross コマンドレファレンス

rtc-make-cross コマンドレファレンス

概要

 rtc-make-cross [OPTION]... [make OPTIONS]...

解説

rtc-make-cross はRTコンポーネントのクロスコンパイルを補助するツールです。 rtc-template や RTCBuilder が生成する旧形式の Makefile をサポートしてい ます。

このコマンドは make コマンドのラッパーとして働き、環境変数 CC/CXX/AR/LD をクロスコンパイルに必要なツールへのパスに設定し、make を 実行します。

このコマンドはシステムの /usr 以下の Endebian クロス開発環境を検索し、 クロスコンパイルに必要なツールを見つけます。このコマンドがクロスコンパ イルツールチェーンを見つけるためには、Endibian クロス開発環境が通常のイ ンストールルールに基づき /usr 以下にインストールされている必要がありま す。それぞれのクロス開発環境は arm-linux-gnu, powerpc-linux-gnu といっ た名前でなければなりません。

オプション

2つ以上のクロス開発環境が見つかった場合は、使用するクロスコンパイルアー キテクチャを -a オプションを使用して指定する必要があります。インス トールされているクロス開発環境が1種類の場合、その環境が使用されま す。-aでアーキテクチャを指定する必要はありません。

-a で利用可能なアーキテクチャ名は -h オプションでヘルプを表示さ せると確認することができます。

 $ rtc-make-cross -h
 Usage: rtc-make-cross -a <arch_name> [make options]
 
     -a     target architecture name
     -h     print this help
 
 Available architectures:
    arm powerpc

この環境では、armとpowerpcのクロス開発環境が利用できることがわかります。

-a architecture
ターゲットアーキテクチャを指定する。
-h
ヘルプを表示する。

上記以外のコマンドラインオプションは、すべて make コマンドに渡されます。 下の例は、make において clean ターゲットを実行します。

 $ rtc-make-cross -a arm clean

下の例では、Makefile として Makefile.ConsoleIn を指定します。

 $ rtc-make-cross -a arm -f Makefile.ConsoleIn

バグ

バグを発見した場合は、<n-ando@aist.go.jp> ご連絡ください。

参照

作者

このコマンドは安藤慶昭 <n-ando@aist.go.jp> により作成されました。

COPYRIGHT

Copyright (c) 2012, Noriaki Ando

rtc-cmake-cross コマンドレファレンス

rtc-cmake-cross コマンドレファレンス

概要

 rtc-cmake-cross [OPTION]... [make OPTIONS]...
 rtc-ccmake-cross [OPTION]... [make OPTIONS]...

解説

rtc-cmake-cross はRTコンポーネントのクロスコンパイルを補助するツールで す。RTCBuilder が生成する新形式の CMake (CMakeList.txt) をサポートして います。

このコマンドは cmake および ccmake コマンドのラッパーとして働きます。ク ロス開発環境を自動的に調査し、cmake でのクロスコンパイルに必要な、いわ ゆる ツールチェーンファイル を生成します。 cmake/ccmake に対して -DCMAKE_TOOLCHAIN_FILE オプションでツールチェーンファイルを cmake/ccmake に渡し実行します。

このコマンドはシステムの /usr 以下の Endebian クロス開発環境を検索し、 クロスコンパイルに必要なツールを見つけます。このコマンドがクロスコンパ イルツールチェーンを見つけるためには、Endibian クロス開発環境が通常のイ ンストールルールに基づき /usr 以下にインストールされている必要がありま す。それぞれのクロス開発環境は arm-linux-gnu, powerpc-linux-gnu といっ た名前でなければなりません。

オプション

2つ以上のクロス開発環境が見つかった場合は、使用するクロスコンパイルアー キテクチャを -a オプションを使用して指定する必要があります。インス トールされているクロス開発環境が1種類の場合、その環境が使用されま す。-aでアーキテクチャを指定する必要はありません。

-a で利用可能なアーキテクチャ名は -h オプションでヘルプを表示さ せると確認することができます。

 $ rtc-make-cross -h
 Usage: rtc-make-cross -a <arch_name> [make options]
 
     -a     target architecture name
     -h     print this help
 
 Available architectures:
    arm powerpc

この環境では、armとpowerpcのクロス開発環境が利用できることがわかります。

-a architecture
ターゲットアーキテクチャを指定する。
-h
ヘルプを表示する。

上記以外のコマンドラインオプションは、すべて cmake/ccmake コマンドに渡 されます。下の例は、buildディレクトリを作成し、そこでcmakeを実行します。

 $ mkdir build
 $ cd build
 $ rtc-cmake-cross -a arm ..

下の例では、cmake に対して変数 OPENRTM_INCLUDE_DIR をコマンドラインから指定して ccmake を実行します。

 $ rtc-cmake-cross -a arm -DOPENRTM_INCLUDE_DIR=/usr/openrtm-1.1 ..

バグ

バグを発見した場合は、<n-ando@aist.go.jp> ご連絡ください。

参照

作者

このコマンドは安藤慶昭 <n-ando@aist.go.jp> により作成されました。

COPYRIGHT

Copyright (c) 2012, Noriaki Ando

rtc2usbmem コマンドレファレンス

rtc2usbmem コマンドレファレンス

概要

 rtc2usbmem [OPTION]...

解説

rtc2usbmem はクロスコンパイルされたRTコンポーネントを、USBメモリやSDメ モリカードにコピーして実行するため、指定されたディレクトリへRTコンポー ネントのコピー、依存ライブラリのコピー、rtc.confの生成、起動スクリプト のコピーを行います。

指定されたRTコンポーネントの実行ファイルを解析し、依存しているライブラ リをクロス開発環境から検索します。検索された依存ライブラリファイルは、 OpenRTM-aistのライブラリやRTコンポーネントとともに、指定されたディレク トリへコピーされます。

実行するターゲット上にあらかじめライブラリをインストールしておく必要は なく、指定されたディレクトリにコピーされたライブラリのみでRTコンポーネ ントを実行することができます。

このコマンドはシステムの /usr 以下の Endebian クロス開発環境を検索し、 クロスコンパイルに必要なツールを見つけます。このコマンドがクロスコンパ イルツールチェーンを見つけるためには、Endibian クロス開発環境が通常のイ ンストールルールに基づき /usr 以下にインストールされている必要がありま す。それぞれのクロス開発環境は arm-linux-gnu, powerpc-linux-gnu といっ た名前でなければなりません。

オプション

2つ以上のクロス開発環境が見つかった場合は、使用するクロスコンパイルアー キテクチャを -a オプションを使用して指定する必要があります。インス トールされているクロス開発環境が1種類の場合、その環境が使用されま す。-aでアーキテクチャを指定する必要はありません。

-a で利用可能なアーキテクチャ名は -h オプションでヘルプを表示さ せると確認することができます。

 $ rtc2usbmem -h
 Usage: rtc2usbmem  -d <dir> -r <rtc> -l <libdir>
  :
  : 略
  :
 Available architectures:
    arm powerpc

この環境では、armとpowerpcのクロス開発環境が利用できることがわかります。

-a architecture
ターゲットアーキテクチャを指定する。
-d dir
ファイルをコピーするディレクトリを指定する。
-r rtc
ターゲットのRTコンポーネントを指定する。複数指定可。
-l libdir
依存ライブラリを検索するライブラリパスを指定する。複数指定可。
-x
OpenRTM-aist関係のライブラリ (libRTC.so. libcoil.so) をコピーしない。
-h
ヘルプを表示する。

バグ

バグを発見した場合は、<n-ando@aist.go.jp> ご連絡ください。

参照

作者

このコマンドは安藤慶昭 <n-ando@aist.go.jp> により作成されました。

COPYRIGHT

Copyright (c) 2012, Noriaki Ando