ひろじいべーしっくch「BASIC入門編」の補講1の動画の解説・補足。(0-031)
ここでは、Switchプチコン4の命令により操作するモーションIRカメラの説明を紹介しています。
モーションIRカメラとは?
(C)イミダス・集英社の時事用語事典では以下の様に説明されています。
任天堂のゲーム機「Nintendo Switch(ニンテンドースイッチ)」の専用コントローラー「Joy-Con(ジョイコン)」側部に内蔵された赤外線カメラの呼称。IRは英語で赤外線を意味するInfrared(rays)の略。赤外線カメラはNintendo Switchの周辺にある被写体の形や動きや距離を読み取る。

(C)イミダス・集英社
モーションIRカメラは右のジョイコンの下部に位置し、上下左右などの位置関係は以下の通りです。
動画の2分59秒(カメラの上下左右位置の解説。)

このように、必ずモーションIRカメラを使用する際には本体画面から外して使います。
動画の5分59秒(うしろのボタンを外して)

動画の6分07秒(レールに沿って外します)

モーションIRカメラ関連の命令
以下は公式リファレンスからの引用です。特にモーションIRカメラと関連する事項は赤色の文字にしています。また撮影モード関連は緑色、クラスタリングモード関連はオレンジ色、モーメントモード関連は水色で示しています。(IRREAD命令での背景水色の部分はクラスタリングモードとモーメントモードの共通事項)
CONTROLLER
CONTROLLER(コントローラーID)
コントローラーの種類や接続状況を調べる
引数
コントローラーID
0 デフォルトコントローラー
1~4 通常コントローラー
・通常コントローラーのIDは接続したコントローラーのプレイヤーランプの点灯数に対応する。
・携帯モードコントローラーが使える場合、IDは常に1。
・デフォルトコントローラーは全接続コントローラーの入力を合成し、現在設定されている操作スタイルに関係なく、常に携帯モードコントローラー相当の入力として扱う。
・コントローラーID1~4を使用する場合は事前にXCTRLSTYLE命令で使用したい操作スタイルを設定しておくことを強く推奨する。
返値
0 未接続
1 携帯モードコントローラー
2 Proコントローラー
3 Joy-Con 2本持ち
4 Joy-Con(L)
5 Joy-Con(R)
CONTROLLER
CONTROLLER コントローラーID OUT コントローラー種類,メイン色,サブ色
CONTROLLER コントローラーID OUT コントローラー種類,左メイン色,左サブ色,右メイン色,右サブ色
コントローラーの接続状況や種類を調べる
引数
コントローラーID
0 デフォルトコントローラー
1~4 通常コントローラー
・通常コントローラーのIDは接続したコントローラーのプレイヤーランプの点灯数に対応する。
・携帯モードコントローラーのIDは常に1。
・デフォルトコントローラーは全接続コントローラーの入力を合成し、現在設定されている操作スタイルに関係なく、常に携帯モードコントローラー相当の入力として扱う。
・コントローラーID1~4を使用する場合は事前にXCTRLSTYLE命令で使用したい操作スタイルを設定しておくことを強く推奨する。
返値
コントローラー種類
0 未接続
1 携帯モードコントローラー
2 Proコントローラー
3 Joy-Con 2本持ち
4 Joy-Con(L)
5 Joy-Con(R)
メイン色,サブ色
コントローラーの色をメイン色とサブ色の2つの色コードで返す
・取得した色コードは他の描画命令の色コードとして使用可能。
・コントローラーが未接続の場合はメイン、サブ共に黒が返る。
左メイン色, 左サブ色, 右メイン色、右サブ色
2本持ちや携帯モードの場合、左右のコントローラーの色を別々に取得できる
・横持ちや縦持ちの場合、右メイン色と右サブ色には黒が返る。
XCTRLSTYLE
XCTRLSTYLE 最大接続数,操作スタイル[,モーションセンサー使用フラグ,IRセンサー使用フラグ[,接続画面表示フラグ]]
コントローラーの最大接続数、操作スタイル、使用機能を設定する
・設定した操作スタイルによって、接続可能なコントローラーの種類、想定するJoy-Conの持ち方、取得できるボタン・スティックの種類、使用できるコントローラー機能が変わる。
・接続確認画面の操作結果はRESULT関数で確認できる(1:成功, -1:キャンセル)。
・サブプログラムからの呼び出しは無視される。
引数
最大接続数
接続したい最大のコントローラー数を指定する
・操作スタイルに応じて指定可能な値の範囲が異なる。
フル 1~2
2本持ち 1~2
横持ち 2~4
縦持ち 2~4
操作スタイル
設定する操作スタイル:0~3
番号 スタイル名 使用可能なコントローラー
0 フル 携帯モード、Joy-Con2本持ち、Proコントローラー
1 2本持ち Joy-Con2本持ち
2 横持ち Joy-Con(L)/(R)横持ち、Proコントローラー
3 縦持ち Joy-Con(L)/(R)縦持ち
モーションセンサー使用フラグ
モーションセンサー(加速度センサー、ジャイロセンサー)を使用したい場合1を、使用しない場合は0を指定する
・省略時は0。
IRセンサー使用フラグ
モーションIRカメラを使用したい場合1を、使用しない場合は0を指定する
・省略時は0。
・モーションIRカメラを使用する場合は操作スタイルを1(2本持ち)にする必要がある。
接続画面表示フラグ
コントローラー接続画面を必ず表示するかどうかを指定する
・1を指定すると、コントローラー接続画面が必ず表示される。
・0を指定すると、設定が変わった時だけコントローラー接続画面が表示される。
・省略時は0。
IRSTART
IRSTART コントローラーID,IR認識タイプ
IRカメラの使用を開始する
・XCTRLSTYLEであらかじめIR使用フラグをONにしておく必要がある。
・サブプログラムからの呼び出しは無視される。
引数
コントローラーID
IRカメラを使用するコントローラーのID:1~2
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
IR認識タイプ
IRカメラの認識方法を指定する
0 クラスタリングモード
1 撮影モード
2 モーメントモード
・クラスタリングモードは明るい領域を矩形として認識する。同時に最大16個の領域を認識できる。
・撮影モードはIRカメラの撮像画像を画像として取得する。
・撮影モードで撮影したデータはIRSPRITEで表示する事ができる。データをBASICプログラム内に取り出す事はできない。
・撮影モード起動中は画面キャプチャが禁止される。
・モーメントモードは撮像範囲を8×6の小領域に分割し、それぞれの認識情報を取得する。
———-
IRSTART
IRSTART コントローラーID,0,[照明タイプ],[ゲイン],[露出],[最小クラスタ],[最大クラスタ],[最低輝度]
IRカメラの使用を開始する(クラスタリングモード詳細パラメーター設定型)
・XCTRLSTYLEであらかじめIR使用フラグをONにしておく必要がある。
・サブプログラムからの呼び出しは無視される。
引数
コントローラーID
IRカメラを使用するコントローラーのID:1~2
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
0
クラスタリングモードとするために0を指定する
照明タイプ
IRカメラの照明を指定する
0 全て(遠+近)
1 遠距離用のみ
2 近距離用のみ
3 照明OFF
・省略時は0。
ゲイン
IRカメラの撮影ゲイン:1~16
・省略時は2。
露出
IRカメラの撮影露出時間:7~600
・省略時は200。
最小クラスタ
クラスタとして認識する最小の面積(ピクセル数):0~76800
・省略時は3。
最大クラスタ
クラスタとして認識する最大の面積(ピクセル数):0~76800
・省略時は76800。
最低輝度
クラスタとして認識する最低の輝度:0~255
・省略時は150。
———-
IRSTART
IRSTART コントローラーID,1,[照明タイプ],[ゲイン],[露出],[イメージサイズ]
IRカメラの使用を開始する(撮影モード詳細パラメーター設定型)
・XCTRLSTYLEであらかじめIR使用フラグをONにしておく必要がある。
・撮影モードで撮影したデータはIRSPRITEで表示する事ができる。データをBASICプログラム内に取り出す事はできない。
・撮影モード起動中は画面キャプチャが禁止される。
・サブプログラムからの呼び出しは無視される。
引数
コントローラーID
IRカメラを使用するコントローラーのID:1
・撮影モードでは1以外指定できない。
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
IR認識タイプ
撮影モードとするために必ず1を指定する
照明タイプ
IRカメラの照明を指定する
0 全て(遠+近)
1 遠距離用のみ
2 近距離用のみ
3 照明OFF
・省略時は0。
ゲイン
IRカメラの撮影ゲイン:1~16
・省略時は8。
露出
IRカメラの撮影露出時間:7~600
・省略時は300。
イメージサイズ
撮影画像のサイズを指定する
0 320×240
1 160×120
2 80×60
3 40×30
4 20×15
・イメージサイズが大きいほど転送に時間がかかる。320×240で最短4秒、以下サイズが小さくなるごとに4倍速くなる。
・省略時は2。
———-
IRSTART
IRSTART コントローラーID,2,[照明タイプ],[ゲイン],[露出]
IRカメラの使用を開始する(モーメントモード詳細パラメーター設定型)
・XCTRLSTYLEであらかじめIR使用フラグをONにしておく必要がある。
・サブプログラムからの呼び出しは無視される。
引数
コントローラーID
IRカメラを使用するコントローラーのID:1~2
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
2
モーメントモードとするために2を指定する
照明タイプ
IRカメラの照明を指定する
0 全て(遠+近)
1 遠距離用のみ
2 近距離用のみ
3 照明OFF
・省略時は0。
ゲイン
IRカメラの撮影ゲイン:1~16
・省略時は8。
露出
IRカメラの撮影露出時間:7~600
・省略時は300。
IRカメラ(はやピー)さんの作品「IRカメラ モーメントモードでさつえい!」(公開キー“4NZADA3WD”)217行目にある記入例→IRSTART 1,2,1,8,300
コントローラーID 1、モーメントモード、証明タイプ遠距離用、ゲイン8、露出時間300
———-
IRSTOP
IRSTOP コントローラーID
IRカメラの使用を停止する
・サブプログラムからの呼び出しは無視される。
引数
コントローラーID
IRカメラの使用を停止するコントローラーのID:1~2
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
———-
IRSTATE
IRSTATE(コントローラーID)
IRカメラの開始状況を取得する
引数
コントローラーID
IRカメラの状況を取得するコントローラーのID:1~2
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
返値
IRカメラの状況
0 使用していない
1 停止中
2 クラスタリング起動中
3 撮影モード起動中
4 モーメントモード起動中
———-
IRREAD
IRREAD コントローラーID OUT サンプリング番号,ノイズレベル,データ数,データ配列
(クラスタリング、モーメント)IRカメラの認識結果を読み取る
・IRSTARTでIRカメラの使用を開始しておく必要がある。
引数
コントローラーID
IRカメラの認識結果を読み取るコントローラーのID:1~2
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
返値
サンプリング番号
新しいデータを読み取るたびに1増えていく番号
・同じ番号を連続して取得した場合は、新しいデータがまだ受信できていない事を示す。
ノイズレベル
認識中のノイズレベル
・0~2の値が返り、値が小さいほどノイズが少なく、正確な値が取れている事を示す。
データ数
データ配列に含まれるデータの数
・クラスタリングモードの場合、認識したクラスタの数を示す。配列には各クラスタの情報が入る。
・モーメントモードの場合常に48。配列には撮影領域内を横8×縦6に分割した各ブロックの情報が入る。
データ配列
読み取った認識結果を格納した配列
・幅(データ配列の添え字の2番目の項目)8の2次元配列。
・高さは0~データ数-1までに意味のある値が入っている。(クラスタリング、モーメント共通、データ配列の添え字の1番目の項目で、クラスタリングモードではクラスタの数を0からカウントしたもの。モーメントモードでは以下の図で示す場所を0からカウントしたもの)

・座標の範囲はX:(0~320)Y:(0~240)。
・クラスタリングでのデータ形式(データ配列の添え字の2番目)は次の通り。
0 クラスタX座標
1 クラスタY座標
2 クラスタ幅
3 クラスタ高さ
4 クラスタのピクセル数
5 クラスタの重心座標X
6 クラスタの重心座標Y
7 クラスタの平均輝度
・モーメントモードでのデータ形式(データ配列の添え字の2番目)は次の通り。
0 ブロックの平均輝度
1 ブロックの重心座標X
2 ブロックの重心座標Y
———-
IRSPRITE
IRSPRITE コントローラーID,スプライトID
(撮影モード専用)撮影モードで取得したモーションIRカメラ画像をスプライトに貼り付ける
・指定したスプライトには撮影画像がリアルタイムで反映され続ける。
・IRSPRITEで作成したスプライトは通常のスプライトと同様に扱う事ができる。ただしSPPAGEを設定した場合元に戻す事はできない。
・撮影モードの撮影データをBASICデータとして取得する事はできない。
・サブプログラムからの呼び出しは無視される。
引数
コントローラーID
スプライトと結びつけるIRカメラを持ったコントローラーのID:1
・IRSPRITEでは1のみ指定可能。
・コントローラーIDの詳細はCONTROLLER関数のヘルプを参照。
スプライトID
撮影画像と結びつけるスプライトのID:0~4095
サンプルプログラム(撮影モード)

実行画面

実行中の様子

モデル:グッドスマイルカンパニー製ねんどろいど 初音ミク
GOOD SMILE COMPANY, INC.
© Crypton Future Media, Inc. www.crypton.net
動画の7分23秒(鏡写しの仕様でないため、左右の動きと反対に見えるが、それで正しい映像であることの説明)

以下は、IRSPRITE命令で「撮影モードの撮影データをBASICデータとして取得する事はできない。」ことを示すために作成した動画の9分26秒あたりから使用したプログラムです。

動画の9分49秒(BASICデータとして取得する事はできない)

モーメントモードの解説
モーメントモードでの解説は、はやピーさんの作品「IRカメラ モーメントモードでさつえい!」(公開キー“4NZADA3WD”)をお借りしました。ありがとうございました。
動画の10分49秒(紹介)

実行画面

モーメントモードにおける表示方法については主にIRREAD命令のデータ配列がポイントです。
データ配列は2次元配列で、添え字の1番目が場所を示し、以下の0~47が対応しています。

今回使用した「IRカメラ モーメントモードでさつえい!」では、添え字の1番目で上記の場所を指定し、データ配列の添え字の2番目を0(ブロックの平均輝度)にして、各場所の平均輝度の色をCOLOR命令とRGB命令で色付けして表示していました。
「IRカメラ モーメントモードでさつえい!」での表示例

上図で、48ブロックに分けてみた図

データ配列の情報により、各場所にそれぞれ色(平均輝度)を付けていた。

その他。「IRカメラ モーメントモードでさつえい!」の動作中に右ジョイスティックを長押しすると操作の説明が表示されます。





サンプルプログラム(クラスタリングモード)
クラスタリングモードは、映像よりも赤外線センサーの情報に徹したモードです。取得できたデータの内容が理解できれば、非常に応用性があるモードと言えます。IRREAD命令のデータ配列がポイントです。
データ配列は2次元配列で、添え字の1番目が複数に存在するクラスタ一つ一つに与えた番号を示し、1番目には0が対応しています。2番目以降は1加算されます。すなわち3つのクラスタがあった場合には、それぞれ0、1、2という番号を付けたと理解してください。
・クラスタリングでのデータ形式(データ配列の添え字の2番目)は次の通り。
0 クラスタX座標
1 クラスタY座標
2 クラスタ幅
3 クラスタ高さ
4 クラスタのピクセル数
5 クラスタの重心座標X
6 クラスタの重心座標Y
7 クラスタの平均輝度

実行画面

上の画面の場合、クラスタの1番目(データ配列は2次元配列で、添え字の1番目は0)の内容は、数値が表示されている上から1段目の欄、クラスタX座標が194、クラスタY座標が41、クラスタ幅が126、クラスタ高さが71、クラスタのピクセル数が5461、クラスタの重心座標Xが264、クラスタの重心座標Yが75、クラスタの平均輝度が220ということです。
動画の16分30秒(実行中の様子)

ゲームに改造(クラスタリングモード)
ルール
・ゲームの操作性を考慮して、鏡向きの仕様にしました。モーションIRカメラに対して右側に手をかざすと犬が右に向かいます。
・一定時間ごとに赤い枠が左右に移動します。できるだけ犬の群れを赤い枠に入れる様にして下さい。
・緑の四角いクラスタや犬1つあたりスコアが1点加算されます。
・制限時間1分
・目標スコア2000点以上

実行画面

あとがき
今回は特にまとめる様なことはしません。ここまで読んで下さった皆様に、少しでもSwitichプチコン4の命令により操作するモーションIRカメラに興味を持っていただければ幸いです。
コメント