PythonとMaixSense A010

2024-07-13(土)

MaixSense A010 ToFセンサーの続き

ROS2で使ってみたマルツで売ってる格安100x100 ToF (Switch Scienceは売り切れ)を今度はPythonで動かす。

仕様的にPySerialでATコマンドを送れば使えて,実際そうやってるサンプルもネットに存在する。

もうちょいMaixSense周りの処理は簡単に表現してに使いたいと思ったら,手のトラッキングのデモがあった。 そのソースはPython-hand-detectで公開されていてmediapipeにDepthを渡している。

ソースを見るとfrom metasense import MetaSenseとあるものの,pypiにもcondaにも存在せず。上のキーボードを使ったデモのソースに含まれていた。これが正式な配布なのか不明。

pyserialは必要なので入れておく。 上記のキーボードを使ったデモのソースに含まれる,utils.pyとmetasense.pyを一緒に置いて実行する。 LCDやUARTに出すか出さないかで安定度がだいぶ変わる。

USBのみ出力にしておけば実測はしてないがFPS=19でヌルヌル動く

None

import time
import cv2
import numpy as np
from metasense import MetaSense

COM_PORT = "/dev/tty.usbserial-202206_E8C25B0"
BASE_BARTRATE = 115200

# sendCmdはちゃんとsleepで待つと有効
# 速いFPSを使いたい場合はDISPを絞る
# DISP=2: USBのみ (FPS=19でヌルヌル動く)
# DISP=3: USBとLCD (FPS=5くらいにしないと途中で固まる)
# UNITは1-9のときは UNIT mm刻みの画素値(1なら255で255mm)
# UNITは10まで良いと書いてあるが10にすると0の挙動になる
# UNIT=0のときは可視化重視モードでToFが近場の解像度が良いことから5.1*sqrt(x)らしい
QUANTIZE = 9 # mm が 濃度値1
DISP = 2
FPS=19

if __name__ == '__main__':
    # init metasense
    while True:
        try:
            metasense = MetaSense(COM_PORT, BASE_BARTRATE)
        except:
            time.sleep(0.1)
        else:
            if metasense.ser.is_open:
                break
    metasense.start()
    metasense.sendCmd("AT+DISP={}\r".format(DISP))
    time.sleep(1.0)
    metasense.sendCmd("AT+UNIT={}\r".format(QUANTIZE))
    time.sleep(1.0)
    metasense.sendCmd("AT+FPS={}\r".format(FPS))
    time.sleep(1.0)

    try:
        while True:
            frame = metasense.tof_data_queue.get()
            frame_id = frame['frameID']
            frame_res = frame['res']
            frame_data = frame['frameData'] # Depth
            frame_data0 = frame['frameData'] # 疑似カラー用

            frame_img0 = np.array(frame_data0, np.uint8).reshape(frame_res[0], frame_res[1])
            frame_img0 = cv2.flip(frame_img0, 1)
            frame_img0 = cv2.applyColorMap(frame_img0, cv2.COLORMAP_JET)

            # 濃度値100より遠いのは0 (UNIT=0のときは (th/5.1)^2 で,th=100で384mm)
            # UNIT:1-9のときは th*UNIT mm
            th = 100
            for idx,data in enumerate(frame_data):
                if(data > th): frame_data[idx] = 0
            # convert frame data to image
            frame_img = np.array(frame_data, np.uint8).reshape(frame_res[0], frame_res[1])
            # rotate image 180 degree
            frame_img = cv2.flip(frame_img, 1)
            color_img =  cv2.applyColorMap(frame_img, cv2.COLORMAP_JET)
            th_img = cv2.resize(color_img, (frame_res[0] * 10, frame_res[1] * 10))
            frame_img0 = cv2.resize(frame_img0, (frame_res[0] * 10, frame_res[1] * 10))
            cv2.imshow("frame0", frame_img0)
            cv2.imshow("th", th_img)
            cv2.waitKey(1)
    except KeyboardInterrupt:
        metasense.terminate()
        exit()

Category: Wiki Tagged: Python


Apple SiliconなマシンでROS2

2024-07-10(水)

なんやかんやでROS2をmacOSで使えた方が便利なので導入してみる。

None

基本的にはここの手順なのだが

  • SIPは無効にしなくてもとりあえずは動く(?)
  • python3はHomebrewに限らず3.12を入れてるとハマるが3.11ならvenvでも問題なし
  • /usr/local/libに余計なx86_64なdylibがあるとそっちを拾ってくるのでM1登場初期にbrew86を運用していた人は全部消した方が良い
  • 途中でよくわからんがfastcdrでコケるがbuildの中に入ってmake installして再度workspaceのビルドをかけると通る
  • ここで入らないros2関係のインストールはたぶん苦行(cv_bridgeも諦めた …

Category: Wiki Tagged: ROS2 Apple Silicon

Read More

NumPy 2.0

2024-06-19(水)

NumPy 2.0の混入

2024-6-17にNumPy2.0がリリースされたらしく,その前後でpipでのデフォルトバージョンが2.0に置き換わった模様。 依存関係でインストールされる場合にも2.0が適用されるので,今迄動いていた環境をpip -r で再構築しよ …

Category: Wiki Tagged: Python

Read More

github-wiki-see

2021-12-04(土)

昔は研究室Webサーバ内にwikiを設置していたものの,SPAM対策やら色々面倒になりGithubのリポジトリ内Wikiでいいかと引っ越した訳ですが,2019年からGoogle等の検索エンジンのクロールをGithubが拒否するようになってます。 理由は色々あるらしいですが,robots.txtから Disallow: /*/wiki*を削除したもののx-robots-tag: noneがヘッダに埋め込まれるせ …

Category: Wiki Tagged: github wiki

Read More

MATLAB2014aに対応しました

2014-03-31(月)

ライセンスサーバをMATLAB2014aに対応させました。

IMAQ Toolbox無しでUSBカメラが使えるようになります。Wikiに使い方を書いておきました。

Category: Wiki

Read More
Page 1 of 1