CHANGELOG
このファイルは本プロジェクトの変更履歴を記録します。
v0.1.2 - 2026-09-09
Fixed
Dobot MG400 のモーション実行結果判定を修正。
JointMovJ/MovJ/MovLのコマンド受付成功だけでmove()を成功扱いしていた問題を修正。blocking モーションでは
Sync()後にロボットのエラー状態を確認し、実行中にアラームが発生した場合はFalseを返すよう変更。Feedback の
ErrorStatusとGetErrorID()を用いて、コマンド受付後に発生した実行エラーを検出するよう変更。モーションコマンド自体の応答が失敗した場合についても、従来どおり失敗として扱う。
Dobot のアラーム情報取得・表示を修正。
GetErrorID()の返却値を単純な整数列へ平坦化せず、Controller / Servo の区分を保持して解析するよう変更。Controller と Servo で同一の alarm ID が存在した場合に、alarm 定義が上書きされ得る実装を修正。
エラー表示に alarm ID と発生元を含めるよう変更。
alarm 定義の
jpを優先して日本語表示し、利用できない場合は既存言語へフォールバックするよう変更。descriptionに加えてsolutionを取得・表示するよう変更。alarm 定義に存在しない情報を補完・推測せず、定義されている内容のみ表示する。
GetErrorID()の生レスポンスログを整理。内部解析用の入れ子配列を通常の
INFOログへ出力しないよう変更。GetErrorID()の生レスポンスはDEBUGレベルへ変更。通常運用時は、解析・整形済みのアラーム情報を表示する。
Refactored
dobot_tcp.pyに集中していたエラー処理をdobot_error.pyへ分離。DobotErrorManagerを追加。GetErrorID()の取得・解析を分離。Controller / Servo alarm の識別処理を分離。
alarm JSON の読み込み・索引処理を分離。
エラー説明文の生成処理を分離。
Feedback
ErrorStatusを利用したモーションエラー判定を分離。モーション直後のエラー監視処理を分離。
DobotTcpの公開エラーAPIは互換性を維持。get_error()get_error_code()get_error_count()get_error_info()get_error_description()get_current_error_info()error_codeerror_description
上記APIは維持し、内部処理のみ
DobotErrorManagerへ委譲する構成へ変更。
Compatibility
メーカー提供の
dobot_api.pyは変更しない。既存の
DobotTcp公開インターフェースを維持する。
v0.1.1 - 2026-09-09
変更
MG400 の実機状態取得を整理。
current_positionは Dashboard APIGetPose()から取得。current_angleは Dashboard APIGetAngle()から取得。servo_onは Feedback のEnableStatusから取得。busy_statusは Feedback のRunningStatus/JogStatusから判定。state()は基本的な running state として Feedback のRunningStatusを使用。DOBOT 固有の
RobotMode()は running state と混同せず別扱いとした。
MG400 の4軸座標と公開6成分座標の変換を整理。
Cartesian 座標
[x, y, z, r]を[x, y, z, 0, 0, rz]として扱う。関節値は MG400 の4軸値を6成分I/Fへ変換し、J5/J6を
0.0とする。User / Tool 座標系定義について4軸MG400に合わせた変換を実装。
Tool 座標系操作を実装。
set_tool_define()/set_tool()を実装。get_tool_define()/get_tool()を実装。Tool 定義取得時は現在のTool番号を退避し、対象Toolを選択してFeedbackから取得後、元のToolへ復帰する。
Work 座標系を MG400 の User 座標系として実装・整理。
User 座標系定義の取得・設定をMG400の座標表現に合わせた。
速度関連I/Fを整理。
直線移動速度率は
SpeedLを使用。関節移動速度率は
SpeedJを使用。グローバル速度倍率は
SpeedFactorを使用。MG400 APIで同義機能を確認できない減速度・拡張加減速度について、ダミー値を返さないよう整理。
approach()を基準座標+オフセットによる移動として実装。Digital I/O の役割を整理。
Digital Input は
DI()から取得。Output と Input の読み出しを混同しないよう修正。
未対応I/Fの扱いを整理。
実装されていない機能について
None、0、空文字列などのダミー値で実装済みに見せないよう修正。MG400 APIで同義機能を確認できないものは明示的に未対応とした。
DOBOT固有機能と共通I/Fの意味が一致しない場合、名前が近いAPIへ機械的に割り当てないよう整理。
take_arm()/give_arm()をMG400用の互換no-opとして修正。MG400には独立したアーム制御権取得・解放操作がないため、ロボットへコマンドを送信せず
Trueを返す。EnableRobot()/DisableRobot()への誤った読み替えは行わない。
Dobot実装内のコメント・docstringを整理。
他ロボット、他コントローラ、他API固有の名称・説明をDobot実装から除去。
コメントとdocstringをMG400/Dobot実装自身の仕様・動作だけで説明する形に統一。
方針
共通I/Fの名前だけを根拠にDOBOT APIを割り当てず、I/Fが表す意味を維持して実装する。
MG400で同義の機能が存在しない場合は、別の機能で代用して意味を変えない。
意図的な互換no-opと未実装を区別する。
メーカー提供コードを直接変更せず、Dobot制御層側で必要な実装・変換を行う。
v0.1.0 - 2026-09-08
v0.0.0 から、DOBOT MG400 を共通I/Fで制御するための構成整理と、 実機での基本モーション制御確認までを行った。
共通I/Fと実装層
DobotCtrlをロボット制御の共通公開I/Fとして整理。MG400固有の実装を
DobotTcpに分離。DOBOT固有機能は
DobotTcp側で扱い、DobotCtrlの共通I/Fを維持する構成とした。Cartesian pose は共通I/Fで
[x, y, z, rx, ry, rz]とし、 MG400の[x, y, z, r]ではr = rzとして変換するよう整理。Joint poseについても共通I/FとMG400の4軸表現の変換を整理。
DOBOT公式APIと拡張API
ベンダー提供の
dobot_api.pyは変更せず使用。DobotApiExt、DobotApiDashboardExt、DobotApiMoveExtを ベンダークラスの継承・拡張層として使用する構成とした。DobotTcpは拡張API層を経由してDOBOT公式APIを使用。Dashboard 29999、Move 30003、リアルタイムステータス 30004 の接続を整理。
API通信をloggerへ統合し、
[DobotApi][CONN]、[DobotApi][TX]、[DobotApi][RX]として記録するよう整理。DobotTcpの制御ログとAPIレベルの通信ログを区別。
基本制御
EnableRobot()/DisableRobot()による制御を共通I/Fから利用可能にした。speed / acceleration 設定をMG400のDashboard APIへ接続。
PTP / LINE をMG400の
MovJ()/MovL()に対応。TCP/IPコマンドの戻り値を処理し、受付結果を上位へ返す構成を整理。
Work / User座標系
共通I/FのWork座標系とMG400のUser座標系の対応を整理。
change_work()とMG400のUser(index)の対応を実装。MG400のUser座標系定義・取得を共通I/FのWork座標系操作へ対応させた。
モーション制御
move()は共通I/Fの6成分poseを受け、MG400の4成分poseへ変換して送信。blocking / non-blocking を
is_asyncで選択できる構成とした。wait_for_complete()ではTCP/IP Moveポートの独立したSync()を使用。
blocking / non-blocking の最終修正
開発途中で、DobotStudio Proのスクリプト命令にある
SYNC=0 / SYNC=1 を、TCP/IP 30003ポートの MovJ() / MovL() の
動的引数として送信する実装が混入した。
実機では MovJ(...,SYNC=1) に対してTCP/IP応答が即座に返り、
共通I/Fで要求するblocking動作にならなかったため、この方式を廃止した。
v0.1.0 の実装は次のとおり。
is_async=True
MovJ(...) / MovL(...)
-> コマンド受付
-> return
is_async=False
MovJ(...) / MovL(...)
-> コマンド受付
-> Sync()
-> モーション完了
-> return
これにより、DobotStudio Proスクリプト側の SYNC オプションと、
TCP/IP API側の独立した Sync() コマンドを分離した。
v0.1.0 時点の実機確認
local direct-control の blocking サンプル:動作確認済み。
local direct-control の non-blocking サンプル:動作確認済み。
上記を v0.1.0 の基本モーション制御の基準実装とする。
v0.0.0
初期開発版。
DOBOT MG400制御コードの構成、共通I/F、TCP/IP通信、 モーション制御の開発を開始。
2026-09-08 - 初回記録
DOBOT MG400 制御パッケージについて、ここまでに行った設計・実装・修正内容を初回履歴として整理しました。
共通 I/F と MG400 実装を分離
公開制御 I/F を DobotCtrl、MG400 固有実装を DobotTcp に分離しました。
DobotCtrl
共通公開 I/F
|
v
DobotTcp
MG400 固有実装
DobotCtrl は共通 I/F の公開だけを担当し、TCP/IP API の呼び分け、座標変換、リアルタイム状態取得などは DobotTcp へ委譲します。
DOBOT 固有で共通 I/F に含める必要のない機能は DobotTcp 側に置く方針としました。
vendor dobot_api.py を直接変更しない構成へ変更
DOBOT が提供する dobot_api.py は vendor コードとしてそのまま保持する方針としました。
追加処理は派生クラス側へ置きます。
DobotApiExt
DobotApiDashboardExt
DobotApiMoveExt
接続処理、logger による TX/RX/CONN 出力などを vendor コードから分離しました。
MG400 の 3 ポート接続を実装
DobotTcp で次の 3 接続を管理する構成としました。
29999 Dashboard
30003 Motion
30004 リアルタイムステータス
30004 番ポートは専用スレッドで受信し、1440 byte のフレームを蓄積・解析して最新状態を保持します。
ログ出力を logger に統一
制御層からの出力は logger を使用する方針としました。
[DobotApi][CONN]
[DobotApi][TX]
[DobotApi][RX]
[DobotTcp]
[DobotStatus]
接続、送信、受信、状態変化、エラーを区別できるようにしました。
Motor ON/OFF を MG400 API に対応
共通 I/F のモータ制御を次の MG400 API に対応させました。
turn_on_motor() -> EnableRobot()
turn_off_motor() -> DisableRobot()
reset_error() -> ClearError()
take_arm() / give_arm() はモータ ON/OFF とは分離しました。
MG400 TCP/IP API には TakeArm / GiveArm と同じ制御権概念を確認できないため、これらは共通 I/F を保つ no-op としています。
共通座標表現を 6 成分へ統一
Cartesian 座標の共通 I/F を次の 6 成分としました。
[x, y, z, rx, ry, rz]
MG400 の 4 成分
[x, y, z, r]
とは次のように変換します。
r = rz
rx = 0
ry = 0
MG400 から共通 I/F へ返す場合は、
[x, y, z, 0, 0, r]
へ展開します。
Joint も共通 I/F では 6 成分とし、MG400 の 4 軸値を
[j1, j2, j3, j4, 0, 0]
へ展開します。
move() の MG400 変換を実装
基本移動について次の変換を実装しました。
P + PTP -> MovJ
P + LINE -> MovL
J + PTP -> JointMovJ
MG400 API の SYNC を共通 I/F の is_async に対応させました。
is_async=True -> SYNC=0
is_async=False -> SYNC=1
motion_mode と path_blend を分離
軌道種別 PTP / LINE / CIRCLE / SPLINE と、経路通過条件 path_blend を別概念として扱うよう整理しました。
DOBOT の CP は共通 I/F の path_blend と同じ意味ではないため、機械的な path_blend -> CP 変換は行わないこととしました。
動作完了判定を実装
30004 番ポートの実行状態を使用して、
motion_complete()
get_motion_complete()
wait_for_complete()
を実装しました。
移動命令が受付成功したことと、物理動作が完了したことを分離して扱います。
現在位置・現在角度取得を実装
30004 番ポートから、
tool_vector_actual
q_actual
を読み、共通 I/F の 6 成分へ変換して返すようにしました。
順運動学・逆運動学を実装
MG400 API を使って次を対応させました。
p2j() -> InverseSolution()
j2p() -> PositiveSolution()
Work 座標系を User 座標系として実装
共通 I/F の Work 座標系を MG400 の User 座標系で実装する方針を確定しました。
役割を次のように分離しています。
set_work() User 座標系を定義する
change_work() 定義済み User 座標系を選択する
get_current_work_no() 現在の User 番号を取得する
get_work() User 座標系定義を取得する
change_work() は既存の
User(index)
を使用します。
get_current_work_no() は 30004 番ポートの
userCoordinate
を使用します。
get_work() は 30004 番ポートの
user
を使用します。
set_work() は MG400 マニュアルに定義されている
SetUser(index,{x,y,z,r})
を使用する実装を追加しました。
vendor dobot_api.py に SetUser() の Python wrapper が存在しなくても vendor ファイルは変更せず、DobotTcp から TCP/IP
command を送る構成としました。
共通 I/F の 6 成分 Work 定義
[x, y, z, rx, ry, rz]
から MG400 の
{x,y,z,r}
へ変換し、r = rz としています。
rx / ry が 0 でない Work 座標系は 4 軸 MG400 では表現できないため拒否します。
Tool 座標系選択を実装
現在の Tool 番号選択と取得を、
Tool(index)
toolCoordinate
に対応させました。
Tool 定義そのものの取得・変更についてはまだ未実装です。
I/O を実装
共通 I/F の I/O を次へ対応させました。
get_IO() -> 30004 digital_input_bits
set_IO() -> DO(index,status)
エラー取得と説明表示を実装
GetErrorID() によるエラー ID 取得と、DOBOT 提供 alarm JSON を用いたエラー説明検索を実装しました。
API command の戻り値先頭が 0 でない場合に、エラー ID と説明を logger へ出力します。
FastAPI 層の構成を整理
DobotCtrl を device class として FastAPI の自動 dispatch へ渡す構成を採用しました。
同期クライアントと非同期クライアントは HTTP 呼び出し方式の違いとして分離し、ロボット移動の is_async とは別概念として扱います。
テストスクリプトを各 I/F 単位へ分割
各公開メソッド・property を個別に確認する実行スクリプトを用意しました。
PyCharm が test_*.py を自動テストとして認識するため、実機確認用途では check_*.py 形式へ変更する運用としました。
各スクリプトは共通ヘルパーへ依存せず、単独で実行可能な構成を採用しています。
未実装 I/F を明示
未実装または部分実装の I/F については、メソッド直前のコメントで理由を明示する方針としました。
特に、
MG400 の物理構造上できないこと
現在の公開 API に直接対応するものが確認できないこと
意味変換がまだ実装できていないこと
単に現時点で未実装であること
を区別して記述します。
現在確認されている主な未実装・部分実装
halt()hand_stop()path_blendの MG400 実動作への変換独立
decel外部軸速度・加速度・減速度
dev()の完全な座標変換意味move()のCIRCLE/SPLINEapproach()rotate()run_script()の project name 解決hand 制御
autocal()controller / servo log I/F
Tool 定義の取得・設定
direct_modetaskオブジェクト実機 version 取得
2026-09-08 の実機確認
MG400 10.170.10.63 への接続、EnableRobot()、SpeedFactor(30)、AccL(30)、AccJ(30) の成功を確認しました。
リアルタイムステータスから、例えば次の形式で現在位置を取得できることも確認しました。
[x, y, z, 0.0, 0.0, rz]
従来のローカルサンプルが MG400 ネイティブの 4 成分
[x, y, z, r]
を move() へ渡していたため、共通 I/F の 6 成分チェックで拒否されることを確認しました。
今後のサンプルでは、
[x, y, z, 0, 0, rz]
を使用します。