USB-C Ethernetアダプタ1本でmechArm 270が自律動作した日|Pythonスクリプト制御
LOG131R2R2R2026/4/8

USB-C Ethernetアダプタ1本でmechArm 270が自律動作した日|Pythonスクリプト制御

USB-C Ethernetアダプタが届いた。たった1本のケーブルが、セットアップの複雑さを根本から変えた。

💡 Key Takeaway

有線Ethernetによる永続的なSSH接続を確立し、r2r2r_loop.py のSSH自動実行を実装した。mechArmの電源とケーブル1本だけで、以降のすべての操作がMacのターミナルから完結する。

発生した問題

現場判断

結果

再起動後にeth0がDOWNになる

rc.localの-eオプションが手前の行のエラーで停止させていると特定、-eを削除

永続化完了・再起動後も192.168.2.1で有線接続確認

r2r2r_loop.pyに10.42.0.1が見つからない

grepで全スクリプトを検索、SSH実行自体が未実装と判明

paramikoによるSSH自動実行・SFTP転送を新規実装

r2r2r-scriptsがgit管理外だった

git initから実行し個別ファイルをadd

[LOG131] SSH自動実行実装としてcommit完了

ロボットの「次」を考えた

実機作業の前に、今後の設計を整理した。テーマはUnityシミュレーションとリアル実機のデータ共通化だ。

2つの世界をつなぐ橋は今のところ「関節角度(6軸)」だけだ。UnityがCSVで生成した角度列を send_angles() で流し込む——この構造はLOG97から変わっていない。次のフェーズに向けて、何が共通化できていて、何がまだ断絶しているかを整理した。

Unityにあってリアルにないもの:配置誤差(place_err)、関節遅れ(j_lag)、エンドエフェクタの3D座標。リアルにあってUnityにないもの:グリッパーの実際の把持状態、カメラROI輝度、物理的なズレ(摩擦・ケーブル抵抗・サーボ個体差)。2つの「成功」の定義がまだ別物として動いている。これをどこかで翻訳する必要がある。

ROS2の位置付けも改めて確認した。「ロボットの制御ソフト」というイメージがあったが、実態は「複数のプロセスをつなぐ通信インフラ」だ。今のR2R2Rは「順番にやる」設計で成立しているため、ROS2が本当に必要になるのは「同時に複数のことが起きる」場面——動いているものを追跡しながら掴む、力を感じながら止まる、2台のアームが協調する——そういったケースが出てきてからの話だ。今はまだそこではない。

2台連携の話も出た。ペイロードの問題を2台のリレーで解決するというアイデアはロボティクスとして正しい発想だが、今は1台のループを完全に証明することが先だ。「頭の片隅に置く」段階として整理した。

USB-C Ethernetケーブルが届いた

Amazon発注済みだったUSB-C Ethernetアダプタが届いた。

Mac側で確認すると en8 として認識されていたが、IPは 169.254.83.6——DHCPで正式なIPが取れなかった時の自動割当だ。PiのEthernet側にIPが設定されていないため繋がらない状態だった。

WiFi経由でPiに入り、eth0に静的IPを設定した。Mac側にも対応するIPを設定し、有線SSHを試みた。

ssh ubuntu@192.168.2.1 -i ~/.ssh/id_rsa_pi

繋がった。ログイン画面に IP address for eth0: 192.168.2.1 と表示されている。

永続化との格闘

再起動後に設定が消えないよう永続化を試みたが、ここで予想外の壁に当たった。

netplanに設定を書いて sudo netplan apply しても、再起動後にeth0が DOWN のまま。原因を追うと、/etc/rc.local の先頭行が #!/bin/sh -e になっていた。-e は「エラーが出たら即終了」の指定だ。

このPiのrc.localには sudo ip link set can0 up という行がある。can0デバイスは存在しないためこの行でエラーになり、その後に書いた ip link set eth0 up に届かずスクリプトが終了していた。

#!/bin/sh -e を #!/bin/sh に変更——たった2文字の削除で解決した。

IP address for eth0: 192.168.2.1  ← 有線Ethernet(永続)
IP address for wlan0: 10.42.0.1   ← WiFi(継続)

SSH自動実行の実装

有線接続が確立したので、r2r2r_loop.py のSSH自動実行を実装した。これまでは「ブロックをPICK位置に置いてください」と表示して手動入力待ちになっていた箇所を、paramikoによる自動実行に置き換えた。

SSH_HOST = "192.168.2.1"
SSH_USER = "ubuntu"
SSH_KEY_PATH = os.path.expanduser("~/.ssh/id_rsa_pi")
REMOTE_SCRIPT = "~/pick_and_place_fixed.py"

実装した処理は3段階だ。SFTPで pick_and_place_fixed.py をPiに転送、SSH経由で python3 ~/pick_and_place_fixed.py を実行、終了コードを取得してsuccess/failを判定——既存のログ機能・fail_step入力・CSV記録はそのまま維持した。

[main e6e9075] [DAY131] SSH自動実行実装 有線Ethernet経由 192.168.2.1
 1 file changed, 220 insertions(+)

モニター・キーボード・マウスが不要になった

この日の変化を一言で言うと、セットアップの複雑さが消えた。

以前の手順:WiFiホットスポットを確認 → SSH接続 → 場合によってはモニター・キーボード・マウスが必要。

今後の手順:mechArmの電源を入れる → Ethernetケーブルを繋ぐ → ssh ubuntu@192.168.2.1 -i ~/.ssh/id_rsa_pi

それだけだ。モニター・有線キーボード・マウスはすべて不要になった。セットアップが簡単になるということは、ループを回す回数が増えるということだ。

ケーブル1本が、ロボットとの距離を縮めた。

※ プロジェクト名「R2R2R」は、UC Berkeley・Toyota Research Instituteの研究「Real2Render2Real」(Yu, Fu et al., 2025)の概念に触発されています。現実空間をデジタルツイン化し、仮想空間での試行から得た知見を実世界のモーター駆動へ還元する——その設計と実装過程を毎日記録しています。技術アプローチおよび目的は独自のものです。