守谷工房の製作品3へ                守谷工房Topへ

Mindstorms NXT挑戦2(2022.8.1)

Lego MindstormsnxtOSEKにより自在かつ高度に制御することを
目標に、開発環境の構築を目指しています。例えばライントレースカーを
左右センサーによる単純な2値化制御ではなく、PID制御を取り入れて
機敏で円滑な走行をさせたいものです。NXT挑戦1ではWindows上に
UNIX環境を組み込むためCygwinを採用しようとしましたが、結果は
様々なエラーに悩まされて惨敗。環境を変更して再挑戦してみます

 

挫折の中、偶然見つけたこちらのサイト、冒頭に以下のような説明があります。
 

 最新のCygwin上では、クロスコンパイラが致命的エラーを出力しnxtOSEKアプリケーションを構築することができません。エラーには今ひとつ再現性がなく、異なる対象のコンパイルで異なるエラーが出ます。forkに失敗したり、スタックやヒープが不足したりで致命的エラーが発生しています。peflagsコマンドでスタックやヒープの割当を増やしても改善しません。

前回で自ら経験した失敗とほぼ同じです。さらに、
 

 Lego Mindstormsの最新プロダクトはEV3ですが、大学や高専などの教育機関では教材用にこれまでNXTを相当数買い込んでいたりするケースが少なくありません。ハードはまだまだ動くのに、開発環境が使えないためにそれらを死蔵してしまうのも勿体ない話です。

全くもって同感です。Qiitaのお勧めに従いWSLを試します。
 

手順1はWSL(Windows Subsystem for Linux)のセットアップです。
リンクの先に詳細な手順が説明されています。Windows10以降、
Windows上にLinux環境を構築する機能が組み込まれています。
 

室蘭工業大学データサイエンス研究室が提供
して下さっているQiita内のWEBページです。

 

旧インターフェースのコントロールパネル
からプログラムと機能に進みます。

 

左側ペインからWindowsの機能の
有効化または無効化
に進みます。

 

Linux用Windowsサブシステムにチェックを
入れます。既にBeta版ではなくなっています。

 

WSLに続き、Bash(Linuxのシェル)をセットアップします。
何とUbuntuMicrosoft Storeで配布されています。

 

Ubuntu自体はOperating Systemですが、ここでは
WSLを介してWindows上で機能するシェルのようです。

 

問題なくセットアップが終了し、デスクトップのアイコンによりUbuntuが
起動します。ユーザー名、パスワードをセットし、sudo apt update
sudo apt upgradeコマンドによりパッケージをアップデートします。
リポジトリ(ダウンロード先のサーバー)は、特に.ac.jpに変更せず
海外のままでも、レスポンスが著しく低下するようなことはありません。

 

手順2では、Windows上で動作するARMアーキテクチャ開発環境を
セットします。YAGARTO(Yet Another GNU ARM Toolchain)を
利用することで、もはやCygwinには依存せずYet Another GNU
ARMというくらいなので、前回のGNU ARMは不要となります。
 

セットアップ手順は簡単で、ダウンロード
したインストーラ
を実行するだけです。


手順2内のリンクからはbu2.17、gcc4.2.1、
20071117のバージョンがダウンロードされます。
 

手順3は、前回同様にnxtOSEKをインストールします。C:/Users/
username/Documents/srcにセットするよう指示されているのは、
WSL側から/mnt/ドライブ名/・・と指定することで、Windowsの
ディレクトリが見えるからだそうです。しかし、Documentsフォルダに
セットしたことで、前回はWSL側からのパス指定はひどく面倒でした。
YAGARTOをC:/WINAPP/にセットしてあるので、nxtOSEK
同じフォルダにセットします。指定時のパス記述も簡単になります

 

解凍したnxtOSEKフォルダを
C:/WINAPP/にセットします。

 

nxtOSEKフォルダの内容です。動作確認用サンプルが
格納されたsamples_cやsampales_c++が見えます

 

手順4、osek os-1.1.lzhからsg.exeを取り出し、
nxtOSEK/toppers_osek/sg/にコピーします。

 

手順5、nexttool.zipからNeXTTool.exe(NXTへの転送
ツール)を取り出し、C:/WINAPP/bin/にコピーします。

 

手順6、nxt fantom drivers v120.zipからsetup.exe
を取り出し実行します(PC-NXT間のUSBドライバ)。

 

デバイスマネージャーを確認するとLEGO Devicesの項目が
現れ、LEGO MINDSTORMS NXTが追加されています。

 


# Tool-chain specific items

#===============================================================================
# GNUARM_ROOT and NEXTTOOL_ROOT need to adapt your PC environment #===============================================================================

# specify GNU-ARM root directory
ifndef GNUARM_ROOT
GNUARM_ROOT = /cygdrive/C/cygwin/GNUARM
endif

# specify NeXTTool root directory
ifndef NEXTTOOL_ROOT
NEXTTOOL_ROOT = /cygdrive/C/cygwin/nexttool
endif


#===============================================================================
$(VERBOSE).SILENT

TARGET_PREFIX :=arm-elf

MKDIR = mkdir -p
TOUCH = touch

CROSS = $(GNUARM_ROOT)/bin/$(TARGET_PREFIX)-

CC = $(CROSS)gcc
CXX = $(CROSS)g++
AS = $(CROSS)as
AR = $(CROSS)ar
LD = $(CROSS)g++ -nostartfiles
OBJCOPY = $(CROSS)objcopy

BIOSFLASH = biosflash.exe
APPFLASH = appflash.exe
RAMBOOT = ramboot.exe
NEXTTOOL = NeXTTool.exe
 

手順7では、ツールパスを定義するecrobot/tool_gcc.makを編集
します。元のファイルはCygwinを使用する前提で記述されています。
また、各実行ファイルには拡張子(.exe)を明示する必要があります。

   


# Tool-chain specific items

#===============================================================================
# GNUARM_ROOT and NEXTTOOL_ROOT need to adapt your PC environment #===============================================================================

# specify GNU-ARM root directory
ifndef GNUARM_ROOT
GNUARM_ROOT = /mnt/c/WINAPP/yagarto
endif

# specify NeXTTool root directory
ifndef NEXTTOOL_ROOT
NEXTTOOL_ROOT = /mnt/c/WINAPP/bin
endif


#===============================================================================
$(VERBOSE).SILENT

TARGET_PREFIX :=arm-elf

MKDIR = mkdir -p
TOUCH = touch

CROSS = $(GNUARM_ROOT)/bin/$(TARGET_PREFIX)-

CC = $(CROSS)gcc.exe
CXX = $(CROSS)g++.exe
AS = $(CROSS)as.exe
AR = $(CROSS)ar.exe
LD = $(CROSS)g++.exe -nostartfiles
OBJCOPY = $(CROSS)objcopy.exe

BIOSFLASH = biosflash.exe
APPFLASH = appflash.exe
RAMBOOT = ramboot.exe
NEXTTOOL = NeXTTool.exe
  

GNU ARMはCygwinではなくYAGARTOに代替されているので
GNUARM_ROOTを/mnt/WINAPP/yagartoに変更します。
また、NexTTOOL.exeも格納場所が変更されているので
NEXTTOOL_ROOTを/mnt/WINAPP/binに変更します。

  


WINECONSOLE := wineconsole endif
 


WINECONSOLE :=
 

WSL環境ではecrobot/ecrobot.makの中で、
WINECONSOLEを定義する必要がありません。

 
記述内容を削除します。行ごと削除か
コメントアウトでもよいかも知れません。
 


$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) $(COM_CFG_SOURCE) $(COM_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)"
$(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg $(shell cygpath -m -w ${TOPPERS_OSEK_OIL_SOURCE}) \
 -os=ECC2 -com=CCCA -I$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/impl_oil -template=$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/lego_nxt.sgt
else

$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)"
$(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg $(shell cygpath -m -w ${TOPPERS_OSEK_OIL_SOURCE}) \
 -os=ECC2 -I$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/impl_oil -template=$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/lego_nxt.sgt
endif
 

手順8として、ecrobot/ecrobot.mak中330~331行と
335~336行の定義を変更します。主にWINCONSOLEと
shell cygpathの記述を削除し、sgファイル名に拡張子.exeを
補います。手順中で変更後のスクリプトをコピーできるように
なってはいますが、ひどく厄介な作業でミスを繰り返します。

  


$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) $(COM_CFG_SOURCE) $(COM_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)"
$(TOPPERS_OSEK_ROOT_SG)/sg/sg.exe
$(TOPPERS_OSEK_OIL_SOURCE) \ -os=ECC2 -com=CCCA -I$
(TOPPERS_OSEK_ROOT_SG)/sg/impl_oil -template=$
(TOPPERS_OSEK_ROOT_SG)/sg/lego_nxt.sgt
else

$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)"
$(TOPPERS_OSEK_ROOT_SG)/sg/sg.exe $(TOPPERS_OSEK_OIL_SOURCE) \ -os=ECC2 -I$(TOPPERS_OSEK_ROOT_SG)/sg/impl_oil -template=$(TOPPERS_OSEK_ROOT_SG)/sg/lego_nxt.sgt
endif
 

修正を終えたecrobot.makファイルです。約400行からなる
長大なテキストファイルなので、修正行の特定に難儀します。

  


$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) $(COM_CFG_SOURCE) $(COM_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)"
$(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg $(shell cygpath -m -w ${TOPPERS_OSEK_OIL_SOURCE}) \ -os=ECC2 -com=CCCA -I$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/impl_oil -template=$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/lego_nxt.sgt
else

$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)"
$(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg $(shell cygpath -m -w ${TOPPERS_OSEK_OIL_SOURCE}) \ -os=ECC2 -I$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/impl_oil -template=$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/lego_nxt.sgt
endif
 

最後に、ecrobot/ecrobot++.mak
ファイルにも同様の修正を加えます。

  


$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) $(COM_CFG_SOURCE) $(COM_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)" $(TOPPERS_OSEK_ROOT_SG)/sg/sg.exe $(TOPPERS_OSEK_OIL_SOURCE) \ -os=ECC2 -com=CCCA -I$(TOPPERS_OSEK_ROOT_SG)/sg/impl_oil -template=$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/lego_nxt.sgt
else

$(TOPPERS_CFG_SOURCE) $(TOPPERS_CFG_HEADER) implementation.oil : $(TOPPERS_OSEK_OIL_SOURCE)
@echo "Generating OSEK kernel config files from $(TOPPERS_OSEK_OIL_SOURCE)" $(TOPPERS_OSEK_ROOT_SG)/sg/sg.exe $(TOPPERS_OSEK_OIL_SOURCE) \ -os=ECC2 -I$(TOPPERS_OSEK_ROOT_SG)/sg/impl_oil -template=$(TOPPERS_OSEK_ROOT_SG)/sg/lego_nxt.sgt
endif
 

該当箇所は334~335行と339~340行です。334~335行の
修正スクリプトに、何故かshell cygpathの記述が残っています。
手順に従って延々と続けてきた開発環境構築は以上です。どこか
途中で取り違えや勘違い、ケアレスミスがなければ良いのですが。
 
 

YAGARTOおよびnxtOSEKがセットアップされた環境で
あらためて
ubuntuを起動します。起動時のデフォルトは
WSL側のディレクトリhome/[user]にマップされます。

 

cd ../..によりルートディレクトリまで戻り、続けて
/mnt/c/を指定することでWindows側C:¥に移動します。
dirコマンドによりCドライブ内のディレクトリが表示されます。

 

cd WINAPPによりYAGARTOおよびnxtOSEKがセットされて
いるC:¥WINAPPディレクトリに移動します
。dirを実行すると、
binnxtOSEKyagartoの各フォルダが確認できます。

 

一連のサンプルプログラムはnxtOSEKフォルダ内に
格納されています。cd nxtOSEKにより移動します。
C言語によるサンプルはsamples_cフォルダ内です。

 

さらにsamples_cフォルダに移動し、ディレクトリを
表示させてみます。50以上のサンプルが用意
されています。因縁のhelloworldもあります。

 

helloworldは、スクリーンに「helloworld」と表示するだけの簡単な
プログラムです。コンパイルするためhelloworldフォルダに移動すると、
フォルダ内にはMakefilehelloworld.chelloworld.oilの3個の
ファイルが格納されています。拡張子.oilはOSEK Implementation
Languageの略で、コンパイル仕様を定義するスクリプト・・だそうです。

 


/* helloworld.c for TOPPERS/ATK(OSEK) */
#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"

/* nxtOSEK hook to be invoked from an ISR in category 2 */
void user_1ms_isr_type2(void){ /* do nothing */ }

TASK(OSEK_Task_Background)
{
while(1)
{
ecrobot_status_monitor("OSEK HelloWorld!");
systick_wait_ms(500); /* 500msec wait */
}
}
 

helloworld.cファイルの内容です。正確にはスクリーンに
「OSEK HelloWorld!」と表示して少し(500ms)待つ、
でいいはずですよね・・、Cは(も)まともに勉強してない。

 

サンプルプログラムが格納されているディレクトリ上でmake allコマンドを
入力すると、ビルド(コンパイル→アセンブル→バイナリ生成)が実行されます。
特にエラーが発生する様子もなく、最終行でhelloworld_OSEK.rxeつまり
NXT用の実行ファイルが書き出されています。何とかなりそう・・ですかね?

 

ビルドを終えた後のフォルダ内を一覧表示させてみます。
関連するファイルが計20個にも増えています。

 

helloworldフォルダをWindows側
からエクスプローラで眺めてみます。

 

ビルド後はこれだけの
ファイル構成になります。

 

Mindstorms NXTの研究は、工房の仕事を終えて帰宅してから
自宅の1室に整えた環境・PCにて取り組んでいます。夕食を挟み
疲れ切った頭と体で進めようとするものだから、とにかく捗りません
Cygwinによる環境構築に失敗してから早や2か月、ubuntuによる
再挑戦は果たしてどのような結果に・・。NXTをUSBで接続します。

 

生成されたrxeファイルをUSB経由でNXTに転送するコマンドは
sh ./rxeflash.shです。最後にNeXTTool is terminated.
と表示され、どうやらエラーなくNXT内に送り込まれたようです。

 

NXT本体のトップメニューから
My Filesを選択します。

 

helloworld_OSEKが格納
されているではありませんか。

 

NXT本体の操作ボタンは、コンテキストライクに機能が変化
します。
helloworld_OSEKを選択しRunボタンを押します。

 

C言語プログラム内に記述されていたOSEK HelloWorld!が、
NXT本体のスクリーンに表示されています。NXTはブロック本体に
内蔵されたNXTプログラム機能、外部PCにセットするROBOLAB
NXTプログラミングなど簡易プログラミング環境(アプリ)による操作が
紹介されています。しかし、その制御内容は2値的であり順次処理的
であり、およそ制御工学本来の威力を発揮できるものではありません。
多彩なライブラリを伴う汎用言語(CやC++)により、高度に数式処理
された制御を自在に記述してNXTのプロセッサに直結できる環境に、
この瞬間辿り着いたと言えましょう。多くの大学工学部や専門学校が、
NXT用開発環境の整備に心血を注ぐ背景が分かるような気がします。

 

守谷工房の製作品3へ                守谷工房Topへ