1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLMがロボットアームを制御できるまで(2/3) RPAセットアップ編

1
Last updated at Posted at 2026-02-08

 前回に続きロボットアームをバーチャル嫁から動かすための下準備をしていきます。

1. 何故RPAか?

1.1. 直面した問題

結論: Dofbotを直接制御するためのエンドポイントURLがわからん…

 最初の設計としては以下の形式ももちろん検討してました。

 やるとしたらバーチャル嫁を動かしてるUnityからラズパイのDocker上で動いてるであろう制御スクリプトのエンドポイントに6箇所のサーボの角度の情報を与えてPOSTリクエストを送るとかできれば楽かもしれません。
 そこで、まずはラズパイ上のスクリプト調べてみたりDofbotのマニュアルを読んでましたが、エンドポイントURLが分からず断念しました。
 http:// (前回の設定変更で更新されたIPA):6000 までは推測できましたがその先がわからなければ当然バーチャル嫁からの直接制御は難しいです。

1.2. 制御用の専用アプリがあるならそれの制御を自動化できれば可能性はあるのではないか?

 しかし、遠隔制御用にスマホやPC向けのアプリが配布されてるということは、それらのアプリの制御を行うプログラムを組めば間接的にロボットアームの自動操縦をできるのではないかと考えました。
 ですので、とりあえず色んなもの作れそうなPythonならDofbotのPC版遠隔制御アプリを制御とかできないかと考えまずはそこの調査から始めました。
 この段階ではバーチャル嫁のレスポンスに含まれるコマンドに応じて各サーボの角度が格納されたリクエストを受け取って中身の値に応じてサーボの角度をアプリ上で再設定する中継サーバーとか作れないかと構想しました。
 私見ながらロボット系の制御アプリケーションってUnityで作られてるイメージがありますのでPython for UnityとかのUnity向けのライブラリも充実してるPythonならそこまで難しくないのではとも考えてました。

 しかし、そのあたりについてGPT先生に情報を整理してもらうと実際には難しいことがわかりました。以下がその返答です。

IMG_9697.png

 直接制御は難しいけれども別途アプローチの仕方は4つあるそうです。

  1. UnityとPythonの連携
  2. ROSの利用
  3. サーバーを介した制御
  4. Subprocessを利用したGUI操作

 1.は制御アプリがビルド済のもののため却下、2.もビルド前なら有効だったかもしれない、3.は肝心のエンドポイントが分からないが別PCから送られたバーチャル嫁のコマンドの受け取り用には必要、ということで消去法で制御アプリの操作そのものは4.の手段を使うことにし、中継サーバー起動時にSubprocessで制御アプリを立ち上げて以後はコマンドに応じてpyautoguiでマウス操作やキーボード操作を自動化するのが現実的と思いました。

1.3. 最終的な設計

 pyautoguiを使ったRPAの機能を搭載し起動時にsubprocessで制御アプリを起動しロボットアームとの接続処理を行った後バーチャル嫁からのコマンドを待機して受け取り次第それに応じてアプリを制御する形の中継サーバーを作りました。

 ソースコードはこちら

 動きはしますが使う場合はディスプレイサイズなどの個々人の環境に合わせて細かな調整をする必要はあるかもしれません。
 特にスクロール周りは4Kモニター使用時は増減値×125でちょうどいいですがそれより小さい画面で検証する場合はスクロール値をもっと小さくしてもいいかもしれません。

 UXを考慮するとconfig.tomlで設定するよりもブラウザとかで設定してsqliteとかに保存する感じの設定用のUIを用意するのもありですがそれは今後の課題とかになりそうです(とりあえず最低限の機能が動く事を優先)。

(記事執筆時点で同時に読んでたInterface 2026年2月号でFastMCPなるものがあったと知り愕然。いっそFastAPIで書いてる今のサーバー規模感の少ない今のうちにFastMCPにフルリプレイスするのもありか…?)

 server配下のディレクトリ構成については可読性や保守性度外視して完全にネタに走っています。ディレクトリ構成でセフィロトの樹を表現するのは私くらいかもしれない。
 こんな感じに(Pinterestにちょうどいい画像あって良かった…)。

IMG_9731.jpeg

 サーバー起動後処理が走る順番と生命の樹の順序を連動させる感じで。
 ITの世界にスピリチュアルとかシャーマニズムの概念を絡めるふざけっぷりがいい。アクエリオンが好きな方とかにこの構成刺さりそうな気はしてます。なお私はアクエリオンは主題歌は好きですが10年以上前に1話目だけ見て琴線に触れず見るのやめました。

 RPAを通じたロボット制御ですとBlue Prismという選択肢もありましたが月額49,500円のサブスクは財布に来るのとそもそもDofbotの制御に対応してるのかという問題がありましたので自分で作りました。

2. RPAサーバーセットアップ

2.1. RPAサーバーを動かすPCにDofbot制御用アプリをダウンロードする

 まずはYahboom社のラズパイロボットアームのオンラインマニュアルにアクセスします。組み立て用の動画もここの02.組み立てるの1.インストールビデオにあり、商品に添付されてるペーパーマニュアルがわかりづらい場合こちらの方がわかりやすいです(Chromeなら日本語への変換もしてくれるので余計に楽)。

image.png

 ページ左側の目次を下の方にスクロールしていきますと、ダウンロードの項目があり、その中にPCソフトウェアの項目があります。今回RPAサーバーで自動制御するアプリケーションはこちらにあります。

スクリーンショット 2026-01-29 210643.png

 クリックするとGoogleドライブのページに移動しますので表示されているYahboomArmEn.zipをダウンロードし、展開します。

image.png

 ダウンロードしたZipを展開しますと、以下のようになっているかと思います。

image.png

 この中のDofbot.exeをダブルクリックしてまずはアプリが正常に動作するかを検証します。以下は失敗例です(アプリとAIカメラの映像が同期していないため別々のウィンドウになってしまっている)。この場合は一度アプリケーションを全て閉じて再度開き直します。

image.png
image.png

 アプリを開き直して以下の画像のようになりましたらOKです。

image.png

 右下の方にあるConnectボタンを押して設定画面を開きます。

スクリーンショット 2026-01-29 212105.png

 以下の画像のように設定画面が出てきましたらHost addressの部分にDofbot本体のディスプレイに表示されているIPAを入力します。
 CommunicationとVideoについてはポート番号の設定をいじることとかしない限りはデフォルトのまま(6000と6001)変更しなくてOKです。
 設定が終わりましたらConnectボタンを押します。

スクリーンショット 2026-01-29 212338.png

 ロボットアームとの接続に成功しますと以下の画面のようにWebブラウザのウィンドウが最前面に出てきます。

スクリーンショット 2026-01-29 212906.png

 黄色い枠内の任意の場所をクリックしてアプリを最前面に出します。

スクリーンショット 2026-01-29 213157.png

 アプリを最前面に出しますと右下のConnectボタンがDisConnectボタンになり、右隣の赤色だった〇が緑色になっています。この状態ですぐ左側のControl DOFBOTの各つまみの部分でスクロールしてみてロボットアームが連動して動作するのを確認できましたらまずこの段階はOKです。

スクリーンショット 2026-01-29 213446.png

2.2. RPAサーバーのセットアップ

 基本的にはREADME.mdの手順通りにやっていけば大丈夫です。コマンドプロンプトを開き、リポジトリをクローンしたい場所で以下のコマンドを実行します。

git clone https://github.com/enriched-uranium235/RPA-Server-for-Dofbot.git

 以下はCドライブ直下にクローンした場合
image.png

 リポジトリをクローンしますと以下のようになっています。

image.png

 ここに先ほどダウンロードして動作確認して問題なかった状態のDofbotのアプリケーションと関連ファイルを全てコピペします。

image.png

 コピペ後のRPAサーバーのディレクトリ

image.png

 VSCodeなどのコードエディターでRPAサーバーを開き、新しいターミナルを用意します。

image.png

 以下のコマンドで仮想環境を作成します。

python -m venv .venv

 ターミナルでコマンドプロンプトを開きますと仮想環境に自動で入るはずですが、入らなかった場合は以下のコマンドで仮想環境に入ります。

.venv\Scripts\activate

 以下のコマンドでrequirements.txtに記載された必要なライブラリ一式を入れます。

pip install -r requirements.txt

 ライブラリ一式のインストールが終わりましたら次はRPAの設定に必要な情報を調べていきます。

2.3. アプリ自動制御に必要な座標の取得

まずは中継サーバーのレポジトリのserverディレクトリに入っている座標設定用ファイル(config.toml)を開きます。デフォルトは以下のようになっています。

[dofbot]
min_servo1=0
max_servo1=180
min_servo2=0
max_servo2=180
min_servo3=0
max_servo3=180
min_servo4=0
max_servo4=180
min_servo5=0
max_servo5=180
min_servo6=0
max_servo6=180
dofbot_ip="127.0.0.1"
dofbot_port=6000
dofbot_app_connect_button_coodinate=[0, 0]
dofbot_check_network_coodinate=[0, 0]
dofbot_app_ip_input_coodinate=[0, 0]
dofbot_app_port_input_coodinate=[0, 0]
dofbot_app_connect_submit_button_coodinate=[0, 0]
dofbot_app_use_coodinate=[0, 0]
dofbot_app_servo1_scroll_coodinate=[0, 0]
dofbot_app_servo2_scroll_coodinate=[0, 0]
dofbot_app_servo3_scroll_coodinate=[0, 0]
dofbot_app_servo4_scroll_coodinate=[0, 0]
dofbot_app_servo5_scroll_coodinate=[0, 0]
dofbot_app_servo6_scroll_coodinate=[0, 0]

 Dofbot本体には以下のように1〜6のシールが貼ってありますが、設定ファイルのservo1からservo6もシールの位置に対応しています。

IMG_9732.jpeg

 各サーボは0~180°までしか動かせないですのでmax_servoやmin_servoはデフォルト設定のままでいいですが、私のように本棚の上とかにロボットアームを置いてしまっているケースでしたらmin_servo1とmax_servo1を90にしておく方が安全です(設定しないで動作確認してたらロボットアームが頭の上に落ちてきたため)。

 dofbot_ipには本体組み立て時に必ず取り付けるはずのディスプレイに表示されているIPAを入れます。

IMG_9733.jpeg

 dofbot_portはDofbot本体で動いている制御スクリプトの待機ポートです。デフォルトの6000のままで問題ありませんが、設定いじってポート番号変更した場合はそれに合わせます。

 次に、必要な座標の情報を集めていきます。まずは、レポジトリのoperate_recorderの中に入っているマウス操作やキーボード操作、スクロール操作を記録するためのPythonスクリプトを起動します。

python operate_recorder/record.py

 ターミナルで上記コマンドを実行しますとターミナル上に以下の感じでマウスの座標やキーボードに入力した内容、どの座標でスクロール操作が行われたかが出力されます。

image.png

  • dofbot_app_connect_button_coodinate(制御アプリのコネクトボタン)

 以下の画像の赤枠のConnectボタンの座標です。
 スクリーンショット 2026-01-31 114119.png

 operate_recorder/record.pyを実行しているターミナルを最前面に表示し、マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1286, 763)と出力されていますのでconfig.tomlのdofbot_app_connect_button_coodinateをこの値で上書きします。以降も同じ手順の繰り返しです。

  • dofbot_check_network_coodinate(接続設定ダイアログのラジオボタン)

 以下の画像の赤枠の部分です。アプリ起動時デフォルトでこちらにチェックは入っていますが、万が一入っていなかった場合を想定してこの座標に移動してクリック操作を行うように処理は書いてあります。
スクリーンショット 2026-01-31 115449.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

スクリーンショット 2026-02-04 224408.png

 (898, 338)。

  • dofbot_app_ip_input_coodinate(設定ダイアログのIPアドレス入力欄の座標)

 以下の画像の赤枠の部分です。対象箇所をクリックしてconfig.tomlのdofbot_ipに設定されたIPアドレスを入力する操作のために必要な座標です。

スクリーンショット 2026-01-31 120506.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

スクリーンショット 2026-02-04 224616.png

 (917, 443)。

  • dofbot_app_port_input_coodinate(設定ダイアログのポート番号入力欄の座標)

 以下の画像の赤枠の部分です。対象箇所をクリックしてconfig.tomlのdofbot_portに設定されたポート番号を入力する操作のために必要な座標です。

スクリーンショット 2026-01-31 130840.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

スクリーンショット 2026-02-04 224853.png

 (1111, 690)。

  • dofbot_app_connect_submit_button_coodinate(設定ダイアログを反映するためのConnectボタンの座標)

 以下の画像の赤枠の部分です。更新内容を反映してDofbotとの接続を確立するためのボタンの座標です。

スクリーンショット 2026-01-31 131551.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

スクリーンショット 2026-02-04 225023.png

 (1115, 690)。

  • dofbot_app_use_coodinate(アプリを最前面に表示するための座標)

 以下の画像の赤枠の部分です。設定完了後Connectボタンを押すとブラウザ画面が最前面に出てくるため、自動操縦の邪魔になります。そこで、対象の任意の箇所をクリックしてアプリを最前面に再度出します。私は普段は黄枠の部分の座標を指定しています。

スクリーンショット 2026-01-31 132500.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1714, 412)。

  • dofbot_app_servo1_scroll_coodinate(Dofbotのサーボ1角度を調整するつまみの座標)

 以下の画像の赤枠の部分です。

スクリーンショット 2026-01-31 133219.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1158, 785)。

  • dofbot_app_servo2_scroll_coodinate(Dofbotのサーボ2角度を調整するつまみの座標)

 以下の画像の赤枠の部分です。

スクリーンショット 2026-01-31 133648.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1152, 822)。

  • dofbot_app_servo3_scroll_coodinate(Dofbotのサーボ3角度を調整するつまみの座標)

 以下の画像の赤枠の部分です。

スクリーンショット 2026-01-31 133959.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1155, 859)。

  • dofbot_app_servo4_scroll_coodinate(Dofbotのサーボ4角度を調整するつまみの座標)

 以下の画像の赤枠の部分です。

スクリーンショット 2026-01-31 134301.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1153, 897)。

  • dofbot_app_servo5_scroll_coodinate(Dofbotのサーボ5角度を調整するつまみの座標)

 以下の画像の赤枠の部分です。

スクリーンショット 2026-01-31 134728.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1148, 937)。

  • dofbot_app_servo6_scroll_coodinate(Dofbotのサーボ6角度を調整するつまみの座標)

 以下の画像の赤枠の部分です。

スクリーンショット 2026-01-31 135009.png

 マウスカーソルをアプリの該当箇所に当てて座標を調べます。

image.png

 (1149, 973)。

 一通り座標の確認が終わりましたらconfig.tomlの内容を更新します。手順通りに値を更新していきますと以下のようにdofbot_ip~dofbot_app_servo6_scroll_coodinateまでに一通りアプリの自動制御に必要な情報が入っていると思います。

[dofbot]
min_servo1=0
max_servo1=180
min_servo2=0
max_servo2=180
min_servo3=0
max_servo3=180
min_servo4=0
max_servo4=180
min_servo5=0
max_servo5=180
min_servo6=0
max_servo6=180
dofbot_ip="Dofbot本体ディスプレイに表示されたIPA"
dofbot_port=6000
dofbot_app_connect_button_coodinate=[1286, 763]
dofbot_check_network_coodinate=[898, 338]
dofbot_app_ip_input_coodinate=[917, 443]
dofbot_app_port_input_coodinate=[1111, 690]
dofbot_app_connect_submit_button_coodinate=[1115, 690]
dofbot_app_use_coodinate=[1714, 412]
dofbot_app_servo1_scroll_coodinate=[1158, 785]
dofbot_app_servo2_scroll_coodinate=[1152, 822]
dofbot_app_servo3_scroll_coodinate=[1155, 859]
dofbot_app_servo4_scroll_coodinate=[1153, 897]
dofbot_app_servo5_scroll_coodinate=[1148, 937]
dofbot_app_servo6_scroll_coodinate=[1149, 973]

 設定ファイルの更新が終わりましたら以下のコマンドでRPAサーバーを起動してみます。

python server/src/main.py

 サーバーの起動に成功しますと制御アプリ(Dofbot.exe)が自動で起動し、設定ファイルに設定した値に従ってシステム側でアプリの設定更新やロボットアームとの接続を行います。一通りのセットアップ作業が完了するとRPAサーバーを起動したPCではDofbotと接続完了後のアプリケーションが画面全体に表示され、dofbot_app_use_coodinateにマウスカーソルが位置している状態で待機状態になります。

3. 同一ネットワーク上の他端末からのリクエストを飛ばしてみる

 この状態になりましたら次は別端末からリクエストを送ってみることにします。まずはRPAサーバーを動かす予定のWindows PCのIPアドレスを知る必要があります。

 コマンドプロンプトで以下のコマンドを実行します。

ipconfig

 実行しますと以下のように情報が表示されます。

スクリーンショット 2026-01-31 141522.png

 この中のIPv4アドレス(赤枠部分)を使うことで同一ネットワーク上にある他端末からRPAサーバーを動かすWindowsにリクエストを送ることができます。

 別端末からPostmanを使ってリクエストを飛ばしてみることにしましょう。

 RPAサーバーでDofbotのアプリを制御するエンドポイントURLはapi/controllerですので、そちらにリクエストが飛ぶように設定をしていきます。命名規則についてはこちらも踏まえて考えましたが、api/を付けるのはお決まりですがバージョンを記載するかどうか相当悩みました。しかし、今後大幅な更新をするかどうかも未定でしたのでバージョンは記載しない方針にしました。

{
  "servo1": 0,
  "servo2": 0,
  "servo3": 0,
  "servo4": 0,
  "servo5": 0,
  "servo6": 0,
}

 PostmanからRPAサーバーに送る情報は以下の通りにしました。

スクリーンショット 2026-02-04 23.05.53.png

 RPAサーバーが正常に動いた場合200レスポンスが返り、アプリがその値に応じてパラメータが切り替わり、ロボットアームが「?」みたいな形になります。

 実際にリクエストを送ってみます。

スクリーンショット 2026-02-04 23.09.59.png

 200レスポンスが返ってきます。

image.png

 リクエストを送った後アプリの各サーボの角度が変更されました。想定していた値から誤差が生じているところはちらほらありますが、私の環境ですと増減値 × 125が一番無難な値で、それ以上大きくしたり小さくしたりするとスクロールが行われなかったり過剰にスクロールして想定していた値にならなかったりします。

IMG_9734.jpeg

 スマホから撮影したDofbot本体です。「?」マークっぽいこの形状以外と可愛い。

 サーボの角度の設定値に多少の誤差は出ますが、ひとまず動くことの確認はできましたので次はバーチャル嫁の作業に移ります。

続きはこちら

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?