中古でHokuyo UST-30LCを買ってみた。ちっちゃくて可愛いけど、新品は40万くらいする化け物

届いたら電源ケーブルがブチ切れてたので、適当に繋いでMacから点群を読もうの回。


TL;DR

  • UST-30LCの電源はDC 10〜30V。USB PD 12Vトリガーで動く
  • 電源線は オレンジ赤マーク=+VIN / オレンジ黒マーク=-VIN
  • TCPが繋がらないときは tcpdump 。センサーが別IPにARPしてたらそのIPをエイリアスで追加する
  • 通信ポートは 10940、プロトコルはSCIP 2.0

背景

趣味用にHokuyo UST-30LCを中古で買ってみました。お値段は高めでした。

届いたら電源・IOケーブルが切断されてて、コネクタがない状態でした。(Ethernet側はついてた)


ケーブル自作

コネクタと電源仕様の確認

まずマニュアルを探す。ManualsLibとHokuyo USAに英語版があった。

電源仕様はDC 10〜30V、定常150mA(起動時450mA)。 コネクタはHiroseのDF62B-24EP-2.2C(24ピン 2.2mmピッチ)が付いているらしいが、こいつにはついてない。

主要な線のアサインはこう:

ピン線色信号
1オレンジ(赤マーク1)+VIN
2オレンジ(黒マーク1)-VIN
3〜7グレー・白・黄Output 1〜3 / Malfunction / Sync
8〜14黄・ピンク・オレンジ・グレーCOM Input / Input 1〜5

点群だけ取りたいなら最低限+VINと-VINとEthernetの3系統で大丈夫だと思います。

電源:USB PDトリガーを使う

Amazonで買った中華製のUSB PDトリガーを使いました。 オヤイデで売ってるこっちを使いたかったが手元に無かったのと、Amazonの方が安くて手元にあったのでそっちを使いました。

USB PD充電器(65W以上推奨)から12Vを引き出してセンサーに繋ぐだけです。 将来的に延長したい場合はPD対応のUSB-C to Cケーブルで充電器とトリガーの間を延ばす運用のつもりです。

細線のはんだ付け

センサーから生えてる線が細すぎてふつうのストリッパーが使えないので、炙りました。 やり方:

  1. ライターで軽く炙って炭化させて拭く
  2. XAコネクタのハウジングを圧着
  3. PD基板側もXAコネクタを出しておいて、いいかんじにつけましょう

最終的にこうなった


Macからつなぐ

EthernetはAnkerのUSB-C to Ethernetアダプタで直結しました。

IPアドレス設定

センサーのデフォルトIPは 192.168.0.10。 Macのネットワーク設定でen9(アダプタ)を手動設定:

  • IP: 192.168.0.20
  • サブネット: 255.255.255.0
  • ゲートウェイ: 空欄

詰まったところ

(1) pingが通らない

ping 192.168.0.10
Request timeout for icmp_seq 0

ICMPには応答返してくれないのかな〜と思ったがそうじゃなかった。 arp-scanを試したらHokuyoのMACアドレスで応答が返ってきた。

sudo arp-scan --interface=en9 --localnet
192.168.0.180  00:1d:9b:1e:05:bc  Hokuyo Automatic Co., Ltd.

IPが変わって 192.168.0.180 だった。まぁ中古だしそういうもん。

(2) TCP 10940に繋がらない

IPを修正してnc、Pythonスクリプトを試しても全部タイムアウトする。 nmapで確認したら全1000ポートがfilteredになってた。

All 1000 scanned ports on 192.168.0.180 are in ignored states.
Not shown: 1000 filtered tcp ports (no-response)

ARPには応答するのにTCPだけ無反応???

(3) tcpdumpしてみる

ので、ターミナル2枚使ってtcpdumpで監視しながらncを投げた。

sudo tcpdump -i en9 host 192.168.0.180 -n
IP 192.168.0.20.58611 > 192.168.0.180.10940: Flags [S]   
ARP, Request who-has 192.168.0.200 tell 192.168.0.180    
IP 192.168.0.20.58611 > 192.168.0.180.10940: Flags [S]   
ARP, Request who-has 192.168.0.200 tell 192.168.0.180    

センサーが 192.168.0.200 にARPし続けてるじゃん

前に接続してたPCのIPが .200 で、そのTCPセッションがハングしたまま残ってたという考察をしてみる。 センサーは既存セッションの処理に引っかかってて新規接続を受け付けられない状態になっていたっぽい。

(4) 解決:.200をエイリアスで追加

sudo ifconfig en9 alias 192.168.0.200 255.255.255.0

これでセンサーが .200 に接触できてセッションがリセットされ、 その後 .20 からのSYNにSYN-ACKが返ってくるようになった。やったぜ。


点群取得

PythonでSCIP 2.0通信して点群を取得・可視化するスクリプトをclaudeに出してもらった。

import socket, math, time

HOST = "192.168.0.180"
PORT = 10940

def decode_3char(encoded):
    values = []
    for i in range(0, len(encoded) - len(encoded) % 3, 3):
        chunk = encoded[i:i+3]
        if len(chunk) < 3:
            break
        v = ((ord(chunk[0]) - 0x30) << 12 |
             (ord(chunk[1]) - 0x30) <<  6 |
             (ord(chunk[2]) - 0x30))
        values.append(v)
    return values

def polar_to_xy(distances, angle_min=-135.0, angle_max=135.0):
    points = []
    n = len(distances)
    for i, d in enumerate(distances):
        if d < 20 or d > 60000:
            continue
        angle = math.radians(angle_min + (angle_max - angle_min) * i / (n - 1))
        points.append((d * math.cos(angle), d * math.sin(angle)))
    return points

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5.0)
sock.connect((HOST, PORT))

sock.sendall(b"GS00001080 1\n")
buf = b""
while b"\n\n" not in buf:
    buf += sock.recv(4096)

# データ行を結合してデコード
lines = buf.decode(errors="replace").split("\n")
data_str = ""
in_data = False
for line in lines:
    if line == "":
        in_data = False
    if in_data and len(line) > 1:
        data_str += line[:-1]
    if line.startswith("GS") or line.startswith("00"):
        in_data = True

distances = decode_3char(data_str)
points = polar_to_xy(distances)
print(f"{len(points)} 点取得")
sock.close()

matplotlibでリアルタイム表示する版も作った。pip3 install matplotlib numpy して:

python3 ust30lc_viewer.py

270°、最大30mの点群がリアルタイムで出てくる。かがくのちからって、すげー!

あとUSTくんはUTMくんと違って、命令が来てない間は内部の回転が止まってました。 消費電力も停止時しか測ってないけど、3W弱くらいでした。めっちゃ省電力。


なんでこんな面倒なことをしてるかというと、単純にWidnowsが手元にないからですね。windowsで動く純正ソフトがあればもっと楽にできると思います。

みなさんは MacとかいうカスPC ではなく、素晴らしいx86アーキテクチャのPCを購入しましょう!

あと詰まった時間の9割がIPの話だったので、次からまずtcpdumpで見るくせをつけたいですね。

参考