UnitV2でのsudo実行

流石に常時rootログインでコマンド実行は危険なので、sudoは必要ですが、sudoはデフォルトでは実行できませんが、sudoできるようにする方法(Jupter notebookでコマンド実行すればいい、なぜならroot権限で動作しているから)はいろいろなところで記事になっていますが、

例えば、

https://tanokatu.com/2021/06/09/linux-m5stack-unitv2-2/

Jupyter notebookに入って”新規” – ”ターミナル”を開いて、以下を実行というものですが、

# chown root:root /usr/bin/sudo && chmod 4755 /usr/bin/sudo

# chown root:root /usr/libexec/sudo/sudoers.so

# chown root:root /etc/sudoers

これでsudoは実行できてもsuは実行できません。特に必要性もないとは思いますが。また、これだけならばsshをrootログインして実行しても同じことでしょう。

 

admin

M6の1.25ピッチ?

UnitV2カメラの取り付けネジですが、M6ではありますがピッチが標準では無い模様。なぜなら1mmピッチネジだと途中で止まるから、かといってもちろん細目ネジ(0.75mmピッチ)ではない。

写真で見てみると、インサート埋め込まれている部分の厚みがおよそ6mmでネジ山が5つ見えるから1.25mmピッチらしいけど、そんなネジは普通はないと思うけどネットで検索するとカメラ固定用の三脚とか使えてるらしいから存在はするらしい。

P.S.(@2022/6/12)

手元のスマホ用三脚のスマホ固定部分を取り外したベースのネジはピッチ1.25mmのようでUnitV2にもフィット。どうもこのサイズは固定を素早くやるための特殊(標準)サイズのようです。

-> と思ったら、どうもカメラ固定用のネジはインチネジ(1/4″)ですね。それなら全てクリア。1/4-20 UNCと言われるネジで、ピッチは25.4/20 = 1.27mmになります。

 

admin

UnitV2で顔認識結果の処理

登録した顔画像のマッチング結果をシリアルでM5stackに送信して、確かさがある一定以上ならばブザーで知らせるという簡単なアプリです。

https://isehara-3lv.sakura.ne.jp/blog/2022/05/24/unitv2-aiカメラとm5stackをgroveコネクタで接続して認識結果を/

のアップデートの形になります。

<シリアルのデータ形式>

顔認証でシリアルから流れるデータは、

{“num”:1,”face”:[{“x”:92.80541992,”y”:0,”w”:366.1600952,”h”:478,”prob”:0.995221317,”match_prob”:0.659739733,”name”:”face_1″,”mark”:[{“x”:194,”y”:178},{“x”:358,”y”:158},{“x”:292,”y”:246},{“x”:228,”y”:356},{“x”:368,”y”:338}]}],”running”:”Face Recognition”}

こんな感じで、JSONで階層構造と配列を使っています。マッチング閾値(match_prob)へのアクセスは["face"][0]["match_prob"]となります。

#include <M5Stack.h>
#include <arduinojson.h>
#include <softwareserial.h>

SoftwareSerial Grove(22, 21);     // define rx/tx connecting to the UnitV2 camera
                                  // SoftwareSerial(rxPin, txPin, inverse_logic)

float x;
int y;
long k;
char data[1000];

void setup() {
  M5.begin();
  M5.Lcd.setCursor(20, 40);
  M5.Lcd.setTextSize(2);
  M5.Speaker.begin(); 
  Serial.begin(115200);
  Grove.begin(115200);
  M5.Lcd.print("--initialized--");      // display M5 Lcd message
  M5.Lcd.setCursor(20, 70);
  M5.Lcd.print("Face recongition");
}


void loop_(){

  if(Grove.available()) {
    String recvStr = Grove.readStringUntil('\n');
    if(recvStr[0] == '{'){
      Serial.print(recvStr);
    }
  }
}

void readJSON(void){
  String recvStr = Grove.readStringUntil('\n');
  StaticJsonDocument<1024> doc;
  DeserializationError error = deserializeJson(doc, recvStr);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  x = doc["face"][0]["match_prob"];
}

void loop(){
  M5.Speaker.mute();
  if(Grove.available()) {
    readJSON();
    Serial.println(x);
    if (x > 0.7f)
    {
      M5.Speaker.setVolume(3);
      M5.Speaker.beep();
      delay(200);     
    }
  }
}

データのバイト数が結構大きく(800バイト以上)なるので、char data[1000]とStaticJsonDocument<1024>を大きめのサイズにしています。これをしないとM5stackがリブート繰り返しました。

ドキュメント(以下のリンク)によれば、StaticJsonDocumentは1KB以下の小さめのJSONファイルで使えとあります。それほど多くないスタックエリアを使うので、StaticJsonDocumentでの設定値が小さくてスタックオーバーフローを起こしたと思われ、M5stackがリブートを繰り返してました。

https://arduinojson.org/v6/api/staticjsondocument/

 

認識の閾値は流れるデータからmatch_probを0.7以上で判断しています。

M5.Speaker.tone()は動作しなかったのでbeepを使って音出ししています。

 

P.S. @2022/6/16

細かな体裁(UnitV2のAP立ち上がり検知、認識結果の顔IDプリントアウト)を整えました。ソースはこちらに、

https://github.com/chateight/UnitV2_camera/tree/master/src

 

admin

UnitV2 A.Iカメラで初期動作モードを指定する

デフォルトでは動画再生モードになっていますが、変更する方法です。

ブラウザで、

歯車マークを選択、

メニューで、初期設定したい機能を選択するだけです。例えばシリアルで顔認識結果を送り出したい時にはこういうふうに設定しておけば、電源投入すれば自動的に顔認識モードで認識結果を他のデバイスで受信できると思ったけど、一度ブラウザで立ち上げないと認識結果は送られてこないから、ブラウザ経由のHTTPリクエストなしでは起動はしないようです。バックグランドで認識結果を送る仕組みはjs(Ajax)からpythonを呼び出しているというようなやり方なのでしょう。

シリアルポート経由のJSON形式で動作モード設定は、以下のUnitV2の公式ドキュメントのリンクから。

https://docs.m5stack.com/en/quick_start/unitv2/base_functions

 

今更ですが、UnitV2への接続方法には公式ドキュメントによれば① USB経由、② APポイントモードの二つの方法があります。

Ethernet Mode Connection: UnitV2 has a built-in wired network card. When you connect to a PC through the TypeC interface, it will automatically establish a network connection with UnitV2.

AP mode connection: After UnitV2 is started, the AP hotspot (SSID: M5UV2_XXX: PWD:12345678) will be turned on by default, and the user can establish a network connection with UnitV2 through Wi-Fi access.

UnitV2に電源を他から供給できればAPモードで接続が便利だと思います。

 

admin

 

 

 

UnitV2 AIカメラとM5stackをgroveコネクタで接続して認識結果を受け取る

UnitV2 AIカメラからは認識結果が垂れ流しで出力されてくるようなので、それをM5stackで受け取ってみます。

M5stackのgroveは標準ではI2Cなので、シリアルで使うためにSoftwareSerialライブラリを使います。

参考は、

https://qiita.com/ma2shita/items/37d403fb7a79814d4d4c

ですが、SoftwareSerialの設定(インスタンス作成)では上のリンクのソースと21 <=> 22を入れ替え必要でした。

groveコネクタというのは物理的な形状や接続しか定義していないので、中を通る信号線は自由に定義できるから。

以下の画像から、

ピン21 — SDA — Tx(左端)

ピン22 — SCL — Rx(左端から2番目)

となるので、シリアルのツイスト対抗ピン設定すると”Grove(22, 21); // define rx/tx”となります。

#include <M5Stack.h>
#include <ArduinoJson.h>
#include <SoftwareSerial.h>

SoftwareSerial Grove(22, 21);     // define rx/tx connecting to the UnitV2 camera
                                  // SoftwareSerial(rxPin, txPin, inverse_logic)

int x;
int y;
long k;
char data[50];

void setup() {
  M5.begin();
  M5.Lcd.setCursor(20, 40);
  M5.Lcd.setTextSize(2);
  Serial.begin(115200);
  Grove.begin(115200);
  M5.Lcd.print("--initialized--");      // display M5 Lcd message
  Serial.print("---initialized---");    // output serial line
}


void loop_(){

  if(Grove.available()) {
    String recvStr = Grove.readStringUntil('\n');
    if(recvStr[0] == '{'){
      Serial.print(recvStr);
    }
  }
}

void readJSON(void){
  String recvStr = Grove.readStringUntil('\n');
  StaticJsonDocument<128> doc;
  DeserializationError error = deserializeJson(doc, recvStr);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  x = doc["x"];
  y = doc["y"];
  k = doc["k"];
  const char* running = doc["running"]; // "Lane Line Tracker"  
}

void loop(){
  if(Grove.available()) {
    readJSON();
    sprintf(data,"x = %d , y = %d , k = %ld",x,y,k);
    Serial.println(data);
  }
}

AIカメラの電源はgrove経由でM5stackから供給されるので、一度ブラウザでAIカメラの動作モードを指定してやれば、あとはAIカメラのUSBケーブルは抜いても引き続き動作します。

AIカメラから送信されるデータはjson形式なので、生のデータはこんな感じ。

これを、ArduinoJsont使って、解析します。

サンプルの事例ではLaneLineTrackerだったので同じコードを流用してますが、いかようにも変えられるでしょう。

生データ出力と解析データ表示は、ソース中ではloop()とloop_()関数で埋め込んで切り替えています。

また結果はUSBシリアルへの出力ですが、M5stackに表示させるだけで十分ならば画面表示させれば良いし、さらにパソコンやラズパイなどに無線で飛ばしても良いでしょう。

時々deserializeがエラーしているので、これはシリアルの転送速度を落としてやらないとダメかもしれません。

 

admin

M5stack unitV2 A.I cameraのmicroSDスロット

TFカードと呼んでますが、実態はmacroSDとほぼ同じだろう。本体にスロットがあり、取り出し簡単ではなかったけれども抜いてみたら、SunDiskの16GBのカードが入っていて中はカラっぽ。

すでにsshコマンドで確認済みですが。

https://isehara-3lv.sakura.ne.jp/blog/2022/03/07/unit-v2カメラにsshログオン/

A.Iカメラの基本機能でそれなりのことはできるけれども、何かやろうとするとA.Iカメラ側にコード書かなければいけないけれども、関連情報はこれからサーチ。まあ、Pythonも3.0系が入っているし、c/c++も使えばやりたいことはできるでしょう。

Groveインターフェース介して、電源供給とシリアル通信使うのが現実的なアプリケーションになると思う。

 

admin

Unit V2カメラにsshログオン

Linuxで動いているので、当然sshも使えます。

ユーザー権限では色々情報ありますが、root権限では以下のような長ったらしいパスワード入れれば良さそうです。

https://notenoughtech.com/home-automation/m5stack-unitv2/

10.254.239.1はavahiが動いていればunitv2.pyで問題ありません。



<user login>

ssh m5stack@10.254.239.1 
//user: m5stack
//pwd: 12345678

------------------------------------

<file>

unitv2% df
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi:rootfs              419980    297980    122000  71% /
devtmpfs                 57344         0     57344   0% /dev
tmpfs                    58368         0     58368   0% /dev/shm
tmpfs                    58368        92     58276   0% /tmp
tmpfs                    58368        44     58324   0% /run
cgroup                   58368         0     58368   0% /sys/fs/cgroup
/dev/mmcblk0p1        15549952        32  15549920   0% /media/sdcard


<root pw>

7d219bec161177ba75689e71edc1835422b87be17bf92c3ff527b35052bf7d1f

unitv2# who
root            pts/0           00:00   Jan  1 00:07:12  10.254.239.104
unitv2# 


<python>

unitv2# python --version
Python 3.8.6


<network>

unitv2# ifconfig
br0       Link encap:Ethernet  HWaddr 00:30:1B:BA:02:DB  
          inet addr:10.254.239.1  Bcast:10.254.239.255  Mask:255.255.255.0

ログインして幾つかのコマンドを実行してみましたが、外付けのsdカードには何も入っていないようですね。何に使うんだろう?

 

admin

 

 

M5Stack UnitV2 AI カメラ(SSD202D)つないでみる

いつもの通り、switch scienceで購入。これは宅急便(送料650円)扱いだけれども、8,000円以上は送料無料とかで支払い一万円は超えず。

 

macに接続、最初Mac OSでは機能有効にするとインターネット使えなくなった(Linuxでも同じ)ですが、ドライバ不要のLinux(VMware Ubuntu)で使うのが良さそう。

デフォルトのアプリで物体認識してみる。写真にカップ写っているからかdinning tableと認識されてます。

まずは、疎通確認だけですね。

<ドキュメント>

https://docs.m5stack.com/en/unit/unitv2?id=description

https://docs.m5stack.com/en/quick_start/unitv2/v_training

 

admin

M5Stack UnitV2 AI カメラ(SSD202D)

M5stackにつながるカメラにそれほどの選択肢はありませんが、これは面白そうです。A.I機能がビルトインされてて購入時点で使えるとのことなので、画像認識系のアプリを簡単に作成するには便利そうです。

https://www.switch-science.com/catalog/7160/

Linux系らしいので、多少モディファイするのも難易度は高くはなさそうです。

(画像はスイッチサイエンスのwebから)

 

admin