MELFAに愛を込めて。

ぶんぶん人
公開 2026/01/06
更新 2026/01/21

あいさつ

皆さんは産業用ロボットを知っているでしょうか。聞いたことはあっても実際に触った経験がある人は少ないのかなと思っています。筆者も半年前まで触れたことがなくインターネットに転がっている情報の少なさに驚きました。
産業用ロボットは製造現場の生産活動を支えるロボットの総称で、三菱電機・ファナック・安川電機等の主要メーカが開発・製造をしています。
筆者は普段三菱電気MELFAシリーズ水平多関節(RH-3CRH4018-D)を使用して研究を行っています。MELFAシリーズのロボットは専用ソフトウェアであるRT ToolBox3 を用いて機器を操作します。専用言語MELFA-BASICでのプログラム作成・シミュレーションや実機のコントロールなど大半の操作はToolBox3上で可能です。MELFAは便利な機能も多くあり、頑丈で壊れにくく、頼りになるロボットですが、外部のソフトウェアとの連携が少し複雑です。
本記事では外部からロボットをコントロールするライブラリ作成についての話になります。

通信について

MELFAシリーズのロボットは外部とのデータをやり取りする場合、以下の2通りの手段が用意されています。

  1. MXTコマンドを用いたリアルタイム外部制御
  2. データリンク機能(SLMP通信)を用いた汎用的なデータ通信

MXTコマンドとSLMP通信は共通してTCP/IPで機器同士の通信を行います。両者とも使い方に違いがあるので軽く説明します。

MXTコマンド

MXTコマンドはサンプリング周期ごとにパケットをロボットコントローラへ送信することで、ロボットを任意の位置へ移動させたり、パケット送信時のモニタデータを取得できる機能です。
MXTコマンドを用いた通信の大きな特徴として、MXTコマンド実行時はロボットの制御権がロボットコントローラからパケットを送信しているユーザへ移るところが挙げられます。
通常、ロボットの動作はコントローラ内部で軌道計算が行われ目的地までの加減速のプランを計算し、算出したプランに基づいて逆運動学を計算します。しかし、MXTコマンドを用いたロボットの操作では、軌道計算をユーザに一任するためサンプリング周期毎に座標を指定して目的地までロボットを移動させる必要があります。
そのため、ロボットを任意の位置に移動させるには、加減速のプランを計算するユニットを別途作る必要があります。

ロボットコントローラ側で動作するMELFA-BASICのコードは2行で完結します。

1 Open "設定したPCのIPアドレス" As #1
2 Mxt 1, 0

'MXTコマンド'実行時MELFA-BASICの解析が止まり、終了用パケットを受け取るまでロボットコントローラは外部パケット受信モードで動作し続けます。

データリンク

データリンク機能は「CC-Link協会」が公開しているネットワーク規格SLMP通信を利用した機能です。MELFA-BASICの標準コマンド'INPUT'を使うことで容易に外部からの値を入力することができます。

1 Open "設定したPCのIPアドレス" As #1
2 INPUT #1, Mx, My, Mz, .....
3 P1 = (init_x, init_y, init_z,...... )
4 P1.X = Mx
5 P1.Y = My
6 P1.X = Mz
7 Mov P1 

位置変数P1の各成分をINPUTコマンドから受け取る値に代入することで任意の位置に移動させます。
データリンクでは軌跡計算をロボットコントローラ側で行うので、加減速のプランを作らずお手軽にロボットを操作できます。

Pythonライブラリを作るまで

作ったライブラリ は本来ロボットコントローラが計算する加減速のプラン計算を代わりに計算し、パケットを送信するMXTコマンドモードと位置変数の各要素に代入するデータリンク機能を用いた通信モードを有したライブラリです。
以下の手順で開発を進めていきました。

MXT

  1. 公式のマニュアル「イーサネット機器」を読む
  2. マニュアルの付録にベタ付してあるC++のヘッダファイルから構造体読み、PythonのSocketでフォーマット作って送る
  3. 過速度エラーの出ない範囲でのテストする
  4. S字カーブ加減速の実装する
  5. RT ToolBox3のシミュレーション「オシロ機能」から適当な2点間の移動で計測した値から、速度・加速度・ジャークを解析する

データリンク機能

  1. MELFA-BASIC側で位置変数の各要素に対応する変数をINPUTコマンドを用いて用意する
  2. MXTで使用した座標用のクラスを流用して座標指定を可能にする
  3. 正しく送信できているかを確認する

マニュアル読み編

インターネットに知見が転がっていなかったので、三菱電機公式のマニュアル「イーサネット機器」を読むしかありません。頑張りました。

C++の付録のプログラム

マニュアル「イーサネット機器」には付録として、C++のファイルとヘッダーファイルがあります。このサンプルコードはキーボードからの入力でロボットを動かすことでき、ライブラリを作るときに参考になりました。このサンプルコードは問題なく使うことができますが、ロボットを任意の座標へ移動させることができません。

S字カーブ加減速の実装について

MXTコマンド用の加減速プランの設計についてです。Mitsubishi MELFAの加減速では通常のS字カーブ加減速とは異なり、加減速中のジャークを細かく制御することで、タクトタイムを落とすことなく振動を軽減することのできるアドバンスドS字カーブ加減速が実装されています。
しかし、このアドバンスドS字カーブ加減速のアルゴリズム等の詳しい情報は公開されていないため、アドバンスドS字カーブ"風"加減速で実装を進めました。
S字カーブ加減速には変数「始点位置・終点位置」「移動距離」、リミッタ「最大速度・最大加速度・最大ジャーク」が必要です。
リミッタのパラメータが未知なので、RT ToolBox3の「オシロ機能」で位置・速度・加速度・ジャークのリミッタを解析しました。
アドバンスドS字カーブ風加減速を使った移動は以下の通りになりました。

余談1

筆者は当初MXTコマンドを根本から勘違いしており、MXTコマンドで任意の座標データを送れば、加減速のプランをいい感じに空気を読んで作って移動してくれると思っていました。しかし、過速度エラーなどさまざまな問題が発生して思うように動いてくれませんでした。正しいパケットの送り方だと思い込んでいる筆者はWiresharkとfloatの変換するサイト を駆使し、パケットの中に含まれる座標周りの値とサンプルコードから送られたパケットを読み比べていました。
現在地から0.1 mm動かすパケットを送ってみると普通に動くことを発見し、そこから順調に開発が進みました。後にマニュアルを読むとちゃんとサンプリング周期ごとに移動すると書いてあり絶望しました。

余談2

付録のサンプルコードには思うところが多々あり、メンバ変数をもっと適切な型で宣言するべきでは...や、PDFにコードを貼らないでほしい...、普通に配布してくれ...などなど、コード書いてるときにストレスにしかならない部分が多々あったのでちょっとだけ気をつけて欲しいなぁ〜って思いました。

余談3

加減速についてはかなりふんわり適当な実装になっています。今回テストで動かしたアドバンスドS字カーブ風加減速では、それっぽい7区間のジャークができていますが、加速度が一瞬0 m/s^2 になっているポイントがありました。謎です。

uvを使ったPyPIへの公開

MXT・データリンク機能でロボットを任意の座標に移動可能となったので、ここからはuvを使ったライブラリの公開についてです。
この辺りはuv公式のドキュメントを読みつつ進めていきました。以降は所々で上手くいかなったので備忘録として残していきます。

uv build

標準ライブラリをpyproject.tomlのdependenciesに記述してしまうとビルドに失敗してしまうことがありました。

テスト環境へ公開と動作確認

TestPyPIへパブリッシュした後、動作確認pipインストールで転けることがあります。
TestPyPIのパッケージリポジトリが更新されていないため、比較的新しい(?)バージョンのライブラリを使うとエラーが発生する。

 × No solution found when resolving dependencies:
  ╰─▶ Because only numpy<2 is available and melfapy==0.1.10 depends on numpy>=2, we can conclude that melfapy==0.1.10 cannot be used.
      And because you require melfapy==0.1.10, we can conclude that your requirements are unsatisfiable.

      hint: Pre-releases are available for `numpy` in the requested range (e.g., 2.4.0.dev0), but pre-releases weren't enabled (try:`--prerelease=allow`)

テストpipインストール時に、--extra-index-urlでPyPIのURLを追加すると解決できた。

uv pip install --index-url https://test.pypi.org/simple \
            --extra-index-url https://pypi.org/simple \
            <対象のライブラリ>

様々なエラーを乗り越え、実際にPyPIに公開することができました。

さいごに

今回はMELFAを外部から操作するライブラリmelfapyの作成についてでした。筆者は産業用ロボットの知識がゼロの状態で作り始めてしまったので、かなり苦労しました。何一つ言うことを聞いてくれないMELFA君に苦戦しながら進めていきましたが、今ではMELFAの各関節に愛情が芽生えています。加減速については謎で、ミステリアスなところも愛おしい。
今まで使ってみたかったけど機会が無かったPydanticや、今筆者の中でいちばん居心地の良いuvなど様々な物を取り入れて作ることができて良かったです。
MELFAを使う機会があれば是非使ってみてください。
https://github.com/bunbunjin/melfapy

© 2022 - 科学発明研究会