産業用ロボットの教示方法とその応用
Back to Top
この記事は夏のリレー連載2025 9日目の記事です。
筆者は現在ロボットを利用したシステム開発(ロボットSI)を行っています。ロボットを動かすプログラム(ロボット言語)やロボットと連携して制御を行うプログラム(C#等)を開発しています。ロボットってどうやってプログラムを記述するのか、PC環境からどのようにしてロボットと連携を取ることができるのかについて紹介します。
一般的なロボットプログラムの作成方法
#産業用ロボットは一般的には教示操作盤[1]を使ってロボットプログラムを作成します。
- ロボットのTCP[2]を目標位置に合わせる
- TCPをX,Y,Z軸に沿って移動させたり、ロボットの各関節角度を調整することで位置を合わせます
- 現在の位置を教示点[3]として取り込み、移動方法(移動速度や補間[4]方法 等)を指示する
- 「移動命令を追加」などのボタンを押して移動方法を指定する
- その他の命令を指示する
- ロボットプログラムが提供する特別な命令(数学関数、処理待ち、同期処理、座標変換など)を指示する
- ハンドグリッパーの開閉や外部デバイスと連携する場合はIO[5]で信号操作する
- フロー命令(逐次実行、条件分岐、繰り返しなど)を記述する
- 変数を定義し、状態管理する
教示操作盤を使って教示することはソフトウェアエンジニアがIDEでプログラム編集を行うことに似ています。
教示操作盤で教示したプログラムはロボットが接続されているロボットコントローラ[6]で実行され、その動作を再現します。これをティーチング・プレイバックと呼びます。
また、実際にロボットを動かしながらプログラムを作成するためオンラインティーチング方式とも呼ばれています。
ロボットで定型の処理を行いたい場合はティーチング・プレイバックで行います。非常に高い精度(±0.1mm以下など)で正確に指定された位置を辿ります。自動化された生産ラインでは一般的な方式です。
一方、教示点のデータがロボットプログラムと共に書き込まれている[7]ため、教示点を修正したり、教示位置を追加・削除するにはロボットプログラムを修正する必要があります。
教示データ毎にプログラムを作ることになるためロボットプログラムが複数になりメンテナンス性が悪くなることがあります。
ティーチングの種類
#ティーチングには様々な種類があります。
オンラインティーチング
#教示操作盤を使って実際にロボットを動かしながらロボットプログラムを作成するティーチングです。
メリット
#- ティーチングの基本
- どのような産業用ロボットもオンラインティーチングが可能
デメリット
#- ロボットがある現場に行って、ロボットを優占してプログラムを作成する
- 生産ラインを止める必要がある
- 実機を動かすことになるため衝突など細心の注意を払って行う必要がある
オフラインティーチング
#ロボットがない環境でシミュレータ等を利用してティーチングを行います。シミュレータ環境上でロボットと教示操作盤ソフトを動作させてロボットプログラムティーチングします。
メリット
#- 机上でロボットプログラムを作成することができる
- シミュレータ上でロボットの動作確認ができるので安全
- 各PCにシミュレータ環境を構築すれば複数人が同時にロボットプログラムを作成することができる
- ロボットプログラム自体をエディタ等で記述し、それをシミュレータ上にインポートして動作確認ができる
デメリット
#- 生産ラインとロボットの位置や使用するハンド・ツール類の設定を合わせておく必要がある
- IOなどで外部システムと連携する場合、外部システムを模擬するスタブを作る必要がある
- シミュレータを利用する際のライセンス料が高額(シミュレータ自体は無料だが、買い切り、年間サブスクリプションなど)
ダイレクトティーチング
#ロボットアームを直接手で動かして教示し、ロボットプログラムを作成します。オンラインティーチングの一種なのでメリット・デメリットはオンラインティーチングと同様になります。協働ロボット(人と一緒に作業ができるロボット)ではダイレクトティーチングできるものが多いです。
メリット
#- 直感的に操作できる
- 教示点の設定であれば教示操作盤がなくてもティーチングが可能
デメリット
#- 直接手で動かすためロボットアームの位置や姿勢の精度が作業者に左右される
ティーチングレス
#最近ではAIにより自動的に教示が行えるティーチングレス環境もあるそうです。
ティーチングの使い分け
#生産現場ではオペレータはオンラインティーチングが基本かと思います。一方、ロボットSIを行う場合はシミュレータ環境を利用して開発を行うためオフラインティーチングを利用することが多いです。我々ソフトウェアエンジニアは教示を行うのが目的でなくロボットを活用した自動化システムの開発が目的のため使い慣れたIDEやエディタでロボットプログラムを記述することに慣れています。そのため生産現場のオペレータに比べてティーチングや教示操作盤操作があまり得意ではありません😅
ロボットプログラムの実行方式
#ティーチングにより作成されたロボットプログラムはロボットコントローラが解釈して実行します。
- プレイバック方式
- ティーチングした内容をそのまま再現する方式
- ロボットプログラムをコンパイルしてバイナリ形式に変換し、ロボットコントローラが直接実行する
- 産業用ロボットで一般的な実行方式
- スクリプト方式
- スクリプト(ロボットプログラム)をインタープリターが1行ずつ解釈しながら実行する方式
- 柔軟性や開発のしやすさが求めれれる協働ロボットなどで利用される
- 文脈単位でスクリプトを自動生成して実行させるといった使い方ができる
- プレイバック方式に比べて処理速度が劣る傾向がある
プレイバック方式はC#などのコンパイル型言語、スクリプト方式はPythonなどのスクリプト言語と同じ実行方式と思っていただければ間違いありません。
コンパイルと言っても自動で瞬間的に行われるため、あまり意識する必要はありません。
ただし、どちらの実行方式もロボットベンダーの独自言語です。C#やPythonなどでロボット言語が記述できたらどれだけ便利かといつも思うのですが、できない理由があります。
ロボットプログラムは各行を上から順番に逐次実行されているように見えますが実は違います。教示点間の移動方法を補間するために内部的にはプログラムを先読みする必要があります。
現在の位置 → A点 → B点 → C点とロボットアームを移動させる場合、下表のような設定になります。
プログラム行 | 補間 | 教示点 | 座標 | 速度 | ショートカット距離 |
---|---|---|---|---|---|
1 | 直線 | A点 | (0,0,0) | 10mm/sec | 0mm |
2 | 直線 | B点 | (10,0,0) | 10mm/sec | 10mm |
3 | 直線 | C点 | (10,-20,0) | 30mm/sec | 0mm |
TCPの軌跡としては下図のようになります。 左図はB点のショートカットが0mmの場合、右図はB点のショートカットが10mmの場合の例です。ショートカットが0mmの場合はその教示点で一時停止します。ショートカットを指定することでTCPの軌跡が滑らかになり、速度も滑らかに10mm/secから30mm/secに加速します。また距離も短くなるためサイクルタイムが短くなります。
一般的なプログラム言語は処理対象の行に記載された命令を実行することしかせず先読みを行いません。一方、ロボットプログラムでは2行目を実施する(TCPがA点からB点へ向かう)ときの軌跡を計算するにはAとBだけではなくCの情報も読む必要があります。各教示点間の距離や位置関係、移動速度、どれだけショートカットするかなどの情報が必要になり2行目を実行するには3行目を読んでおく必要があります。
また、A点 → B点に移動中はB点に到着するまでは2行目の処理が継続中です。ここで「A点からB点に移動中に80%の位置に達したらデジタル信号を送信したい」場合は非同期処理でデジタル信号送信タスクを実行することになります。
こうなるとロボットプログラムは複雑な記述が必要になってきますが、オペレータが理解できるよう(オペレータはソフトウェアエンジニアではありません)に、教示操作盤で教示できるように、シンプルな記述にすべきであるため独自言語にならざるを得なくなります。
ロボット制御API
#ロボットをPCなどから制御したい場合があります。例えば、
「PCに接続されたカメラでワーク[8]を撮影し、PC上で画像解析して、ワークの位置・姿勢を算出し、その情報をロボットに転送してロボットハンドで把持する」と言ったことが挙げられます。
このとき、PCからロボットコントローラを介して、ロボットプログラムが参照している教示データの位置・姿勢の値を書き換える必要があります。
これを行うのが各ベンダーが提供しているロボット制御APIになります。PC上に構築したアプリケーションからロボット制御APIライブラリを参照して利用します。
ロボット制御APIを利用することでロボットプログラムの実行環境にアクセスできます。
ここには変数、ロボットの状態、プログラムの状態などが管理されているため、これらの値を参照したり、変数を書き換えるといったことができます。
ポイントはロボットプログラムを書き換える必要が無いという点です。
ロボットプログラムは「変数に代入されているワークの位置・姿勢に応じてロボットを移動させ、ワークを積み上げる」といった手順のテンプレートをプログラムしておき、実行時にロボット制御APIを通して変数を書き換えることで環境に応じた制御を実施します。
ロボットプログラムの言語仕様やロボットを制御するためのメカニズムは各社各様なので変数の扱いやロボットの制御単位に大きな違いがあることに注意が必要です。
FANUC社のロボット
#FANUC社は日本を代表する産業用ロボットベンダーです。コーポレートカラーが黄色で有名です。
ロボット言語
#レジスタという概念があり、位置データや数値や文字はすべてグローバルな領域で各データ型毎に決まったサイズの1次元配列で管理されています。
どのロボットプログラムからも参照・更新ができ便利な半面、グローバル変数として扱うため誤ってデータ更新してしまい、他のプログラムがエラーになる可能性がある点で注意が必要です。
1つのロボットプログラムから複数のロボットを別々に制御したり、複数のロボットを同期を取って制御させることが簡単にできます。
ロボット制御API
#RobotInterfaceと呼ばれており.NETやC++のライブラリとして提供されています。効率良くデータ転送ができるようにDataTableという概念で利用するレジスタの管理ができます。
非常にシンプルで便利なライブラリですがなぜかプロダクトには記載がありません。営業担当者に直接問い合わせる必要がありました。
ABB社のロボット
#スイスに本社を置く多国籍企業です。産業用ロボットの他に電力、重工業など幅広いソリューションを提供しています。
ロボット言語
#ロボット毎に1つのタスク(ロボットプログラム実行スレッド)が割り当たり、そのタスクにロボットプログラムをロードして実行します。2台のロボットを制御するには各ロボット用のロボットプログラムを作成し、別々のタスクでロボットプログラムを実施することになります。そのため柔軟にロボットを制御できますが、ロボット間での同期制御がFANUCに比べて難易度が高いように思います。
ローカル変数やグローバル変数の他、タスクスコープの変数も定義できます。グローバル変数やタスク変数は永続化でき、ロボットプログラムのライフサイクルよりも長く利用できます。そのためFANUCのレジスタと同じような概念で変数を定義してロボットプログラムを作成することも可能です。
ロボット制御API
#PC-SDKと呼ばれており.NETライブラリとして提供されています。FANUCのRobotInterface以上に様々なことができ、教示操作盤でできることとほぼ同等のことができると思われます。ただし、クラスライブラリが膨大なのに比べマニュアルの読みやすさやサンプルコードが少ないといった印象です。
Universal Robots社のロボット
#UR(Universal Robots)社は協働ロボットで有名なデンマークの企業です。
ロボット言語
#Pythonに似たスクリプト言語でロボットプログラムを記述します。
UR社はロボット制御APIの仕様は公開していますがおそらくライブラリとして公開していません。
ロボット制御API
#ロボット制御APIを使って記述したスクリプトをロボットコントローラにソケット通信で転送してロボットコントローラ側でスクリプトを実行させる方式を採用しています。
そのため、簡単に実行させることができますが、都度、スクリプトの転送処理が発生しますので動的に頻繁にデータを更新して利用するといった処理は若干不得手です。
ただし、回避策はあり、スクリプトの中でソケット通信を行いPCと連携させるといった使い方ができます。
まとめ
#ロボットの教示方法やロボット制御APIを利用して連携するイメージが湧きましたでしょうか?他にもロボットと連携するにはROS/ROS2[9]を利用することも多いです。現在ではAIを使ってロボットを制御したり、クラウド連携するようなシステムが構築されています。今後はさらにAIと融合したロボットシステムが活用されていくと思うと夢が膨らみますね。🤖👏
教示を行うタブレットのような端末。教示ペンダント、ティーチングペンダント、単にペンダントと呼ぶこともある ↩︎
Tool Center Point、ロボットハンドの先端にある動作点 ↩︎
教示点は3次元座標(X,Y,Z)、姿勢(RX,RY,RZまたはクォータニオン)、ロボット形態情報(関節軸の方向)等が含まれる変数を表す ↩︎
A点からB点までTCPを 直線 で移動させるか、TCPをA点からB点を経由してC点に 円弧 で移動させるかなど ↩︎
デジタル入力(DI)、デジタル出力(DO)、アナログ入力(AI)、アナログ出力(AO)など ↩︎
ロボットの関節にはサーボモーターが取り付けてあり、ロボットコントローラが適切な位置や回転速度を計算してサーボモーター(関節)を動かす ↩︎
移動命令と教示点データは分離して記録されており、移動命令から教示点データ配列のインデックスを指定するのが一般的 ↩︎
ロボットが作業を行う対象物・加工物を指す。英語のworkpieceの略語として使われる ↩︎
ロボットOSではなくロボット開発を容易にするオープンソースのフレームワークでソフトウェア開発に必要なツールやライブラリが揃っています ↩︎