JPH0784628A - 物体駆動時間低減方法及び多軸ロボット・システム - Google Patents

物体駆動時間低減方法及び多軸ロボット・システム

Info

Publication number
JPH0784628A
JPH0784628A JP6165516A JP16551694A JPH0784628A JP H0784628 A JPH0784628 A JP H0784628A JP 6165516 A JP6165516 A JP 6165516A JP 16551694 A JP16551694 A JP 16551694A JP H0784628 A JPH0784628 A JP H0784628A
Authority
JP
Japan
Prior art keywords
vertex
move
vertices
delta
velocity
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP6165516A
Other languages
English (en)
Other versions
JP2801528B2 (ja
Inventor
John S Batchelder
ジョン・サム・バチェルダー
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of JPH0784628A publication Critical patent/JPH0784628A/ja
Application granted granted Critical
Publication of JP2801528B2 publication Critical patent/JP2801528B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B19/00Programme-control systems
    • G05B19/02Programme-control systems electric
    • G05B19/18Numerical control [NC], i.e. automatically operating machines, in particular machine tools, e.g. in a manufacturing environment, so as to execute positioning, movement or co-ordinated operations by means of programme data in numerical form
    • G05B19/41Numerical control [NC], i.e. automatically operating machines, in particular machine tools, e.g. in a manufacturing environment, so as to execute positioning, movement or co-ordinated operations by means of programme data in numerical form characterised by interpolation, e.g. the computation of intermediate points between programmed end points to define the path to be followed and the rate of travel along that path
    • G05B19/4103Digital interpolation
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B33ADDITIVE MANUFACTURING TECHNOLOGY
    • B33YADDITIVE MANUFACTURING, i.e. MANUFACTURING OF THREE-DIMENSIONAL [3-D] OBJECTS BY ADDITIVE DEPOSITION, ADDITIVE AGGLOMERATION OR ADDITIVE LAYERING, e.g. BY 3-D PRINTING, STEREOLITHOGRAPHY OR SELECTIVE LASER SINTERING
    • B33Y30/00Apparatus for additive manufacturing; Details thereof or accessories therefor
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B33ADDITIVE MANUFACTURING TECHNOLOGY
    • B33YADDITIVE MANUFACTURING, i.e. MANUFACTURING OF THREE-DIMENSIONAL [3-D] OBJECTS BY ADDITIVE DEPOSITION, ADDITIVE AGGLOMERATION OR ADDITIVE LAYERING, e.g. BY 3-D PRINTING, STEREOLITHOGRAPHY OR SELECTIVE LASER SINTERING
    • B33Y50/00Data acquisition or data processing for additive manufacturing
    • B33Y50/02Data acquisition or data processing for additive manufacturing for controlling or regulating additive manufacturing processes
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B29WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
    • B29CSHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
    • B29C2948/00Indexing scheme relating to extrusion moulding
    • B29C2948/92Measuring, controlling or regulating
    • B29C2948/92504Controlled parameter
    • B29C2948/92571Position, e.g. linear or angular
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B29WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
    • B29CSHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
    • B29C2948/00Indexing scheme relating to extrusion moulding
    • B29C2948/92Measuring, controlling or regulating
    • B29C2948/92504Controlled parameter
    • B29C2948/9258Velocity
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B29WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
    • B29CSHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
    • B29C2948/00Indexing scheme relating to extrusion moulding
    • B29C2948/92Measuring, controlling or regulating
    • B29C2948/92504Controlled parameter
    • B29C2948/9258Velocity
    • B29C2948/926Flow or feed rate
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B29WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
    • B29CSHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
    • B29C2948/00Indexing scheme relating to extrusion moulding
    • B29C2948/92Measuring, controlling or regulating
    • B29C2948/92504Controlled parameter
    • B29C2948/92809Particular value claimed
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B29WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
    • B29CSHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
    • B29C2948/00Indexing scheme relating to extrusion moulding
    • B29C2948/92Measuring, controlling or regulating
    • B29C2948/92819Location or phase of control
    • B29C2948/92857Extrusion unit
    • B29C2948/92904Die; Nozzle zone
    • BPERFORMING OPERATIONS; TRANSPORTING
    • B29WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
    • B29CSHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
    • B29C2948/00Indexing scheme relating to extrusion moulding
    • B29C2948/92Measuring, controlling or regulating
    • B29C2948/92819Location or phase of control
    • B29C2948/9298Start-up, shut-down or parameter setting phase; Emergency shut-down; Material change; Test or laboratory equipment or studies
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/34Director, elements to supervisory
    • G05B2219/34132Choosing largest, major coordinate axis
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/40Robotics, robotics mapping to robotics vision
    • G05B2219/40466Plan for minimum time trajectory, at least one joint maximum torque
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/43Speed, acceleration, deceleration control ADC
    • G05B2219/43062Maximum acceleration, limit
    • GPHYSICS
    • G05CONTROLLING; REGULATING
    • G05BCONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
    • G05B2219/00Program-control systems
    • G05B2219/30Nc systems
    • G05B2219/43Speed, acceleration, deceleration control ADC
    • G05B2219/43201Limit speed to allowable speed for all axis

Landscapes

  • Engineering & Computer Science (AREA)
  • Manufacturing & Machinery (AREA)
  • Chemical & Material Sciences (AREA)
  • Materials Engineering (AREA)
  • Computing Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Automation & Control Theory (AREA)
  • Numerical Control (AREA)
  • Manipulator (AREA)

Abstract

(57)【要約】 【目的】 開ループ・ステッパ・モータで駆動させるロ
ボット(1)の最適な軌道及び速度を決定する方法、及
びたとえば高速プロトタイプ作成システム(10)に使
用するのに適した開ループ・ロボット・システムを提供
すること。 【構成】 この方法は、所望の軌道を定義する1組の頂
点のうちの各頂点の最大速度の偏向角計算と、どの頂点
も過大な速度をもたないように大域的に保証するための
ヒープ・ソートと、ロボットができるだけ速やかに直線
移動を実行することを保証する頂点追加技術とを利用す
る。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は全般的にモータの制御に
関し、具体的には、ロボット技術や迅速プロトタイプ作
成の応用分野で使用されるような、ステッパ・モータの
制御に関する。
【0002】
【従来の技術】高性能ロボット・システムは、位置セン
サ、速度センサ、加速度センサ、フィードバック計算と
フィードフォワード計算、信号濾波などの閉ループ制御
を使用することがある。フィードバックを使用すると、
2点間移動の速度及び精度の最適レベルに近い性能が可
能になる。
【0003】一例を挙げると、迅速プロトタイプ作成シ
ステム(RPS)用に適合され、フィードバックを使用
してx−y−z座標基準枠内の押出しノズルの位置を制
御するロボット・システムが、1991年1月3日出願
の米国特許出願第07/637570号(廃棄済み)の
継続出願である1993年3月22日出願のJ.S.バ
チェルダー(Batchelder)他の"Model Gener
ation System HavingClosed-Loop Extrusion Nozzle Po
sitioning"と題する、本出願人に譲渡された米国特許出
願第08/034180号に開示されている。
【0004】エンコーダと恐らくはタコメータを使用し
た、ロボット技術における一般に応用されるフィードバ
ック使用の例は、米国特許第4749347号に開示さ
れている。
【0005】しかし、低コストのロボット・アクチュエ
ータを得るには、フィードバック・センサとサーボ増幅
器を設けるための追加コストが法外なものとなる可能性
がある。
【0006】ロボットの応用分野では多軸運動の同期化
も必要となることがある。通常は米国特許第44159
67号に記載されているようなマスタ/スレーブ技術が
使用される。
【0007】しかし、2点間移動時間を最適化しても、
ある軌道に沿った全移動時間は最適化されない。特に興
味ある応用例では、本発明で対処する問題は、2つの簡
単な軌道の比較によって理解できる。
【0008】第1の事例では、それぞれ長さ0.01イ
ンチ(約0.25mm)の線分1000本を連結して直径
3.18インチ(約8.1cm)の円を作成する。各軸に
沿って発生し得る最終ステップ・サイズによる切捨て効
果を無視すれば、ロボットがこの円運動を行う最大速度
は、機構が正確に支持できる求心加速度の大きさによっ
て規定される。加速度が0.3gの典型的な場合、ロボ
ットは、縦方向の加速と減速に必要な部分を含めずに毎
秒13.6インチ(約34.5cm)の平均ピーク速度で
円を通過しなければならない。
【0009】第2の事例では、0.01インチ(0.2
5mm)の線分1000本が90度ずつ折れ曲がって階段
状となる。ステップ・サイズによってシステムの所望の
精度が設定されると仮定すると、90度の方向変更を1
回のモータ・ステップで達成しなければならない。やは
り加速度0.3gとし、典型的なステップ・サイズ0.
0003インチ(約0.76mm)とすると、コーナでの
速度は毎秒最大0.132インチ(約3.35cm)とな
る。ロボットがコーナ間の区間でできるだけ速く加速し
減速するとしても、平均最大速度は毎秒1.05インチ
(約2.67cm)であり、第1の事例よりも1桁以上遅
い。
【0010】明らかに、軌道の性質を決定するためにか
なりの距離を見越しておく必要がある。鋭い曲がり角が
あった場合、加速限界を越えないよう速度を十分に下げ
なければならない。また、ロボットの加速能力を最大限
に活用することが望ましい。すなわち、ロボットが常に
加速または減速していることが好ましい。
【0011】いくつかの既知の高性能ロボット制御装置
は、瞬間的な位置、速度、加速度を測定し、この情報を
今後の軌道に基づくフィードフォワード補正と共に使っ
て直線状の2点間移動を制御する。こうした実時間制御
装置は、現在使用できる最高速のデジタル信号処理ハー
ドウェアを使用しているが、せいぜい2点間移動を見越
すことしかできない。前の例で示されたように、こうし
た短い見通しの手法は、全体的に最大化された軌道に比
べて、軌道に沿って大きな移行時間を要する可能性があ
る。
【0012】
【発明が解決しようとする課題】本発明の一目的は、ロ
ボットの運動学的特性が、時間最適化された軌道の詳細
な特徴をどのように規定するかを正確に予見し、次いで
簡単な時間ベースの制御装置を使用して、この軌道の実
現に必要なアクチュエータ・パルス列を生成することに
ある。
【0013】本発明の他の目的は、ロボット移動の実行
前に軌道最適化を達成する方法及び装置を提供すること
である。
【0014】本発明の他の目的は、現在使用できるマイ
クロプロセッサ技術を利用して、1000回の直線状2
点間移動の見通し長さから全体的に最適化された軌道を
もたらせるようにする方法及び装置を提供することであ
る。
【0015】本発明の他の目的は、軌道をできるだけ速
やかに通過するように、基礎となるロボット・システム
の機械的拘束条件を越えずにモータ駆動シーケンスを最
適化するために、所望の軌道を事前処理する方法及び装
置を提供することである。
【0016】
【課題を解決するための手段】モータ駆動ロボットの全
体的に最適な軌道と速度を決定する方法により、上記そ
の他の問題が克服され、本発明の諸目的が達成される。
この方法では、各頂点ごとの最大速度の偏向角の計算
と、どの頂点も過大な速度をもたないように全体的に保
証するためのヒープ・ソートと、ロボットができるだけ
速やかに直線移動を実行することを保証する頂点加算技
術とを利用する。
【0017】さらに具体的には、本発明は、複数のモー
タによりn次元(ただしnは2以上)空間中で所定の軌
道に沿ってある物体を駆動するのに必要な時間を減らす
方法を提供する。軌道は、それぞれn次元空間内のある
位置を規定する座標を有する、複数の頂点によって定義
される。この方法は、(a)それぞれ1本の線分によっ
て少なくとも1つの他の頂点と分離され、所望の軌道を
定義する、1組の頂点を提供するステップと、(b)各
頂点ごとに、その頂点に対応する軌道中の1点を通って
その物体を並進運動させながら支持できる最大速度を決
定するステップと、(c)どの頂点でも最大速度を越え
ずに、最短時間でその物体軌道を通過させる、軌道に沿
った速度プロフィルを達成するために、必要ならば頂点
リストを修正するステップと、(d)修正済み頂点リス
トに従って複数のモータにその物体を並進運動させるた
めに、修正済み頂点リストをモータ駆動信号に変換する
ステップとを含む。
【0018】本方法に従って動作する開ループ・ロボッ
ト・システムの好ましい実施例では、モータは、駆動信
号パルスに応答してステップ間隔djずつ移動する、ス
テッパ・モータである。ただし、Jは自由度の数で、1
≦j≦Jである。その物体を軌道上の1点を通って頂点
i−1からiへさらにi+1へ並進運動させると、角度
θiだけ偏向することになる。本発明の一態様では、c
osθiの値を使って、最適速度を有する軸(マスタ軸
とも称する)に関連するステッパ・モータ用の駆動信号
パルス間の遅延時間を決定する。
【0019】修正ステップは、(a)所望の軌道に対応
する走行長さにわたって、トルクなどステッパ・モータ
の動的特性に従って決定される速度プロフィルを決定す
るステップと、(b)頂点対間での最大加速と最大減速
の作用をテストして、結果として生じる速度がその頂点
対の1つの頂点で所定の最大速度を越えるかどうか決定
するステップと、(c)頂点間で最大加速と最大減速が
使用できるように頂点の速度を調節し、必要ならばその
頂点対の頂点間に1つまたは複数の中間頂点を挿入する
ステップとを含む。
【0020】本発明の上記その他の特徴は、以下の本発
明の詳細な説明を添付の図面と併せ読めばより明らかに
なる。
【0021】
【実施例】図1は、高速プロトタイプ作成システム10
における本発明の適用を示す構成図である。ロボットを
番号1で全般的に示す。ロボット1は、複数のステッパ
・モータ(SM1−SM4)に結合された出力12a−
12dを有する、実時間制御装置12を含む。これらの
ステッパ・モータは通常の様式で動作して、入力パルス
に応答してシャフトの増分式回転(ステップ)をもたら
す。ステッパ・モータは、入力パルスに応答してアクチ
ュエータ素子の増分式線形運動をもたらす型式のもので
もよい。ステッパ・モータは、高速プロトタイプ作成工
程に使用されるツール14に機械的に結合されている。
例を挙げると、ツール14は、ポリマーなどの射出物の
供給源であるポンプ15に結合された押出しノズルであ
る。その最終結果として、射出物のビード16が制御下
で付着されて、当該の物体の三次元モデルを形成する。
図示したシステムは、移動度4のシステムであり、ツー
ル14がステッパ・モータSM1−SM3の作用によっ
てx−y−z座標の基準フレーム内で並進運動し、か
つ、ノズルの押出し速度がSM4によって制御される。
ステッパ・モータのうちの1つまたは複数を、製造中に
物体を支持する支持構造(図示せず)に機械的に結合で
きることを理解されたい。このタイプのシステムでは、
ツールはいくつかの自由度を有することができ、基礎と
なる支持構造も同様である。
【0022】各軸に沿ったステップ・サイズが、その軸
に沿った位置が決定される精度(ステップ・サイズの±
1/2)を規定する。偏向角の計算では、1/2ステッ
プ・サイズ程度の誤差は許容されるものと仮定し、した
がって、妥当な速度で有限の偏向角がナビゲートでき
る。ステッパ・モータの代わりに同期モータとエンコー
ダを使用するのが望ましい場合は、ステッパ・モータの
ステップ・サイズの代わりに閉ループ・システムの位置
決め誤差の2倍を使用するならば、やはり以下の分析が
適用される。
【0023】微小ステップ式ステッパ・モータを使用す
る場合、以下で使用する「ステップ」の語は「マイクロ
ステップ」を表すものと解釈すべきである。
【0024】ロボット1は、開ループ・システムであ
り、ツール14の位置決めを制御するために位置フィー
ドバックあるいはその他のタイプのフィードバックを使
用する必要がないことを指摘しておく。
【0025】また、ツール14として押出しノズルを使
用するのは例にすぎず、ツール14はたとえばステレオ
リソグラフィ・プロトタイプ作成システムで行われるよ
うに、フォトポリマを硬化させるためのレーザまたはレ
ーザ・ビームを方向付ける手段を備えることも可能なこ
とを理解されたい。またツール14は、たとえば材料塊
から材料を選択的に除去するために研磨材料の流れを方
向付ける、レーザやノズルなどの装置でもよい。
【0026】一般に、本発明の教示は、複雑な経路を
(非均一な速度で)速やかにナビゲートすることによっ
て性能が決定される、どんなロボット・システムにも有
利に適用できる。こうした応用例には、平床プロッタ、
ドラム・プロッタ、迷路探求、接着剤及びコークの塗
布、フィルムのパターン付け、はんだペーストの押出し
などが含まれる。本発明の教示はまた、利益は少なくな
るが、機械加工や塗装など一定の送り速度を必要とする
応用例にも使用できる。
【0027】すなわち、本発明の教示は、アディテイブ
法またはサブトラクティブ法によって動作する三次元プ
ロトタイプ作成システムに適用される。さらに本発明の
教示は、高速プロトタイプ作成システム以外の応用例、
特に物体を制御可能に位置決めしまたは並進運動させる
ことが望ましい応用例にも適用できる。
【0028】本発明の教示によれば、プロセッサ18
は、制御装置12の入力に結合された出力18aを有
し、ロボット1を最も効率よく利用するように最適化さ
れた頂点リストを提供する。プロセッサ18の動作は、
下記に詳しく説明する。プロセッサ18は、対話型計算
機支援設計(CAD)システムなどの供給源から頂点リ
ストを受け取る入力18bを有する。CADシステムか
ら出力される頂点リストは、ロボット1によって製造す
べき三次元物体の、少なくとも外側シェルと恐らくは内
部支持構造の指定とすることができる。オペレータの入
力に基づくこうした頂点リストの生成は当技術分野でよ
く知られており、したがってこれ以上詳しくは説明しな
い。一般に頂点リストは、ある頂点から次の頂点に至る
直線線分のシーケンスによって、システムの所望の動き
を指定する。
【0029】次に、ステッパ・モータで駆動されるロボ
ット1の所与の軌道に沿った最短時間の移動を決定する
ための現在好ましい方法について述べる。
【0030】この方法では、下記の条件が存在するもの
と仮定する。
【0031】1. ある物体に対する所望の直線軌道を
定義する、2次元、3次元またはさらに高次元の(追加
の自由度の)1組の頂点または点Vバーi=(xi
i、zi、p i...)(1≦i≦N)が与えられてい
る。
【0032】2. 物体の空間装置が、トルク曲線や時
間応答など既知の動的特性を有するステッパ・モータに
よって操作される。
【0033】3. ロボット操作装置の機械的特性が時
間に依存しない。
【0034】最初の目標は、ロボット1に所望の軌道を
できるだけ速やかに通過させることである。第2の目標
は、この工程をできるだけ低コストで達成することであ
る。この第2の目標から、開ループ(フィードバックな
し)ステッパ・モータ・システムが示唆される。コンピ
ュータ要件を最低レベルに保つため、関連する目標は、
最適制御シーケンス(すなわち、どのステッパ・モータ
がいつパルス動作するか)を予め決定しておいて、安価
な実時間制御装置12が所定のシーケンスを実行できる
ようにすることである。
【0035】この方法の現在好ましい実施例を図11と
12に示す。
【0036】この方法は、押出しノズルなどの物体を複
数のモータ(SM1−SM4など)によりn次元空間
(nは2以上)中の所定の軌道に沿って駆動させるのに
要する時間を減らす働きをする。軌道は、それぞれn次
元空間内のある位置を規定する座標を有し、互いに少な
くとも1つの他の頂点からある線分で分離された頂点の
リストによって定義される。頂点対は、軌道に沿って隣
接し、1本の直線線分で分離された、2個の頂点とみな
される。
【0037】この方法は、下記のステップを実行する。
【0038】(A)物体がある線分から次の線分へと駆
動される際に方向を変えるとき、各頂点ごとに維持でき
る最大速度を決定するステップ。
【0039】(B)最大速度の昇順に頂点をソートする
ステップ。
【0040】(C)最低速度の頂点と軌道中の次の頂点
とからなる頂点の対を検査するステップ。
【0041】(Da)次の頂点での決定された最大速度
が、最低速度の頂点からできるだけ速く加速することに
よって丁度達成されることが判明した場合、(Db)次
の頂点での決定された最大速度を、正しいものとマーク
するステップ。
【0042】(Dc)次の頂点での決定された最大速度
が、決定された最大速度よりも大きいことが判明した場
合、(Dd)次の頂点の最大速度を、最低速度の頂点か
らできるだけ速く加速することによって達成される値に
まで減らすステップと、(Db)次の頂点での減少後の
最大速度を、正しいものとマークするステップ。
【0043】次の頂点での決定された最大速度が、決定
された最大速度より小さいことが判明した場合、次のス
テップで、(De)次の頂点を、少なくとも1つの中間
頂点を後で追加すべきものとマークする。
【0044】この方法では次に、最低速度の頂点と軌道
中の前の頂点とからなる頂点の対を検査する。
【0045】(Ea)最低速度の頂点での決定された最
大速度が、前の頂点から最低速度の頂点へとできるだけ
速く減速することによって丁度達成されることが判明し
た場合、この方法は次のステップを実行する。(Eb)
前の頂点での最大速度を、正しいものとマークする。
【0046】(Ec)前の頂点での決定された最大速度
が、決定された最大速度より大きいことが判明した場
合、(Ed)前の頂点の最大速度を、前の頂点から最低
速度の頂点へとできるだけ速く減速することによって達
成される値に減少するステップと、(Eb)前の頂点の
減少後の最大速度を、正しいものとマークするステッ
プ。
【0047】前の頂点での決定された最大速度が、決定
された最大速度よりも低いことが判明した場合、(E
e)前の頂点を、少なくとも1つの中間頂点を後で追加
すべきものとマークする。
【0048】(F)次のステップでは、最大速度が最低
の頂点を頂点リストから除去し、(G)すべての頂点対
の検査が済んだかどうか判定する。
【0049】ステップGでノーの場合、方法はステップ
(B)ないし(G)を繰り返す。
【0050】ステップGでイエスの場合、(H)以前に
頂点を追加すべきものとマークした各頂点対の間に、前
の頂点からの最大加速及び次の頂点への最大減速に対応
する速度の、少なくとも1つの中間頂点を追加し、
(I)その結果得られた頂点リストから、得られた頂点
リストの各頂点で指示された速度が達成されるように物
体を軌道に沿って駆動させる、モータ制御信号のシーケ
ンスを決定する。
【0051】すなわち、得られた頂点リストが、プロセ
ッサ18からケーブル18aを経て制御装置12にダウ
ンロードされ、次いで制御装置12が頂点リストから、
ロボット1の、したがって製造ツール14の最適移動を
達成するためのSM1−SM4のステッパ・モータ・パ
ルス列を決定する。
【0052】図1では、モータはステッパ・モータであ
るので、第1の頂点対からの完全加速及び第2の頂点対
からの完全減速の結果、それらの頂点対を結合する線分
に沿った加速速度と減速速度が同じとなり、両方の頂点
から整数のステッパ・モータ・ステップ数であり、交点
での速度が最大許容速度より小さくなる位置が得られる
場合、ステップ(H)で単一の頂点を追加する。
【0053】頂点対間の線分に沿った完全加速とその後
の完全減速によって速度が最大許容速度に達する場合、
ステップ(H)で、速度が最初に最大許容速度に達す
る、その線分上の点に第1の頂点を追加し、完全加速の
結果、所定の最大速度で第2の頂点に達する、その線分
上の点に第2の頂点を追加する。
【0054】完全加速ランプと完全減速ランプが非整数
のステッパ・モータ・ステップ数の所で交差する場合、
ステップ(H)で、1ステッパ・モータ・ステップだけ
離れたその線分上の2個の頂点を追加し、その結果、加
速も減速も起こらなくなる。
【0055】高速プロトタイプ作成アプリケーション用
の前記の諸ステップを実施するC言語サブルーチンを、
付録A(move_compile())として添付す
る。得られた頂点リストは、サブルーチン(hau
l())により開ループ制御装置12によって実時間で
実行される。
【0056】実時間ステッパ・モータ制御装置12は、
軌道全体に沿って各モータSM1−SM4をどんな速度
でどの方向にパルス動作すべきかを知らなければならな
い。必ずしも必要ではないが、以下では、特定の線分上
で最大ステップ数を必要とする軸(以下ではその線分の
主軸と称する)に対するパルス間の時間を決定するため
に、制御装置12がソフトウェア遅延を実行するものと
仮定する。さらに、他の軸へのパルスが主軸パルスと同
時に発生され、線分に沿って均一に分配されるものと仮
定する。これは補間と切捨てによって行われる(hau
l()参照)。
【0057】この方法を実施する際の主要な特徴は、ヒ
ープ・ソートを使用して、第2に低速の頂点を見つけ、
隣接する2つの頂点の速度が変化した場合にそれらの頂
点を再ソートすることである。頂点がN個の場合、頂点
リストは、最大N−2回再ソートされる(ソートされる
数は各ソートごとに1ずつ減少する)。その結果、ソー
ト処理の効率が高いことが望ましい。ヒープ・ソートは
log(N)のソート時間をもたらし、最低速度の残り
の頂点(ヒープの上端)を識別する。適切なヒープ・ソ
ート・アルゴリズムは、R.セッジウィック(Sedg
ewick)著Algorithms、米国ニューヨー
ク、Addison−Wesley社、1988年刊、
ISBN 0−201−06673−4、pp.132
−139に開示されている。
【0058】この方法を実施する際のもう1つの重要な
時間節減特徴は、所与の頂点に関連する最大速度を決定
するための効率的で信頼性の高い手段である。
【0059】この点に関連して、ある頂点に接する両方
の線分のピタゴラス長が予め決定されているものと仮定
する。高速プロトタイプ作成の応用例では、各線分の長
さが追加または除去すべき材料の量を決定するので、一
般に上記のことが成り立つ。押出しヘッドを有する高速
プロトタイプ作成システムでは、所与の頂点で接続され
ている各線分について必要な押出しポンプ・ステップの
数が予め決定されているということになる。
【0060】3%rms精度の場合、次式が成立するこ
とに留意されたい。
【数1】max = {|x|、|y|、|z|}の最大値
【数2】
【0061】また、各軸が独立しており、各軸の時間応
答がほぼ同じであると仮定する。分子中の数字は数値フ
ィットから導かれる。
【0062】各ステップごとに軸iが距離diだけ移動
し、かつ軸iの定常開始からの平均加速度がaiである
場合、第1ステップをとるのに要する時間の関係式は次
式で表される。
【数3】
【0063】各軸上の負荷及び力は異なることがあり得
るが、ステップ間隔diは、すべての軸で応答時間τi
ほぼ同じになるように各軸ごとに調節することができ
る。
【0064】これらの仮定を用いると、各頂点に関連す
る速度を図3に示すように決定することができる。
【0065】頂点i−1からiにさらにi+1に移動す
る際、軌道はθiだけ偏向する。ただし、
【数4】
【0066】その頂点での加速のみが求心的である、す
なわち移動方向に沿った速度が一定
【数5】 であると仮定する。ただし、τは任意の軸についてステ
ップ当りの最短時間、dは最高速度の軸のステップ間隔
である。偏向角が小さい場合、平均求心加速度は次のよ
うになる。
【数6】
【0067】ステップ当たりの時間について解くと、次
式が得られる。
【数7】
【0068】
【数8】 はすべての軸で同じなので、パルス間の時間遅延は移動
方向とは無関係である。
【0069】線分が直線状である場合、cos(θi
は次のようにして求めることができる。
【数9】
【0070】求めたcos(θi)の値を使って、ルッ
クアップ・テーブルにインデックスして、最も速く移動
する軸(主軸とも称する)に関するパルス間の遅延時間
τiを得ることが好ましい。どの実軸よりも速い関連移
動を有する仮想軸を主軸と定義することもできることに
留意されたい。明らかに、頂点iの速度は次のようにな
る。
【数10】
【0071】各軸の応答時間が同じである、あるいは異
なる軸が独立している必要はない。こうした場合、所与
の頂点の速度の決定は同様であるが、より複雑である。
【0072】頂点速度の再設定に関して、ロボットがど
の頂点にもその頂点を巡回する際に最大速度より大きな
速度で達しないように保証する手順は、図4を参照する
と最もよく理解できる。図4にはx−yにおけるロボッ
ト軌道の例を示す。
【0073】所与の線分iについて、maxi = maximum
{|Xi|,|Yi|,|Zi|,|Pi|}とし、走行長i
【数11】 (全走行長と同様)と定義する。計算した頂点速度を走
行長に対してプロットしたグラフを図5に示す。
【0074】後の計算を容易にするため、やや標準的で
ない速度スケールを使用する。図6に示すようにモータ
のトルク曲線をトルク=Tstall−K・RPSとしてモ
デル化する場合、図7に示すように速度プロフィルは次
のようになることがわかる。
【数12】
【0075】制御装置12にマイクロプロセッサを使用
した好ましい実施例では、軸の速度は次のようになる。
【数13】v=d/(n・γd'
【0076】上式で、dはステップ間隔、γdは単一ソ
フトウェア遅延ループの時間、nは実行された遅延ルー
プの数である。
【0077】速度ランプは、遅延ループ・カウントのイ
ンデックス付きアレイ{ni}として仮定される。した
がって加速には、次のステップのたとえばnj+1個の遅
延ループの使用が必要である。したがって、離散数の速
度vjのみが使用できる。
【数14】vj=d/(njγd・
【0078】速度を整数のインデックス値で表し、移動
距離を累積主軸ステップで表す方法は、加速が必ず+4
5゜の斜線として現れ、同様に減速が−45゜の斜線と
なるので、有用である。その目的は、図8に示したタイ
プの、走行長に対する速度インデックスをもたらし、し
たがってすべての頂点を±45゜傾斜した線で連結する
ことである。図8に示した事例では、頂点9−10だけ
がそのように連結されている。
【0079】図9は、図11と12に関して述べたステ
ップC、D、Eを適用した結果を示す。隣接するどちら
かの頂点から公称加速度で達するには速すぎる頂点は、
より低速の頂点に再設定される。
【0080】最適な「正しい」速度をもつ頂点を決定
し、速い頂点の速度を必要に応じて再設定した後、次に
頂点の追加を実行する。線分がその開始頂点速度と終了
頂点速度の差に比べて長い場合、ロボット1をその線分
に沿ってまず加速させ次いで減速させることにより、時
間が節減される。これは、図10に示すように頂点11
−17を追加することと等価である。
【0081】離散的な速度インデックスと走行長だけが
有効なため、加速ランプと減速ランプが半整数の所で交
わるケースがある。
【0082】こうした場合、頂点5と6の間で、最も近
い整数値の所に2個の頂点(13と14)が追加され
る。
【0083】また、加速ランプと減速ランプが、ロボッ
トが達成できるよりも大きな速度で交わるケースもあ
る。指数的速度関係(図7)を使用する場合は、通常は
そうはならない。この場合、最大速度の所に2個の頂点
(たとえば頂点16と17)が挿入される。
【0084】move_compiler サブルーチン(付録A)が
繰り返し呼び出される。move_compiler サブルーチンが
呼び出されるたびに、新しく要求されたツール14の位
置が、大域変数(x-requested、y-requested、z-reques
ted)を介して供給される。これがシーケンス中で最初
の呼出しである場合、頂点0−2が初期設定される。要
求された移動が限界に違反しないかどうか検査する。必
要ならば、16ビット整数が使用できるようにそれをよ
り小さな一連の移動に分割する。必要なら、ピタゴラス
長を計算し、材料押出しポンプ・ステップを計算する。
次いで前の頂点の最大可能速度を計算する。move_compi
ler サブルーチンを呼び出すたびに、割り振られたメモ
リが満杯になるまで、あるいはルーチンがシーケンスの
終りを示すまで、上記の手順を繰り返す。
【0085】次に(ルーチン dump-it の後に)材料付
着を改善するための余分の移動が追加される。
【0086】次に、頂点をヒープ・ソート・アルゴリズ
ムにより最低速度によってソートする。
【0087】次に、最低速度の頂点に隣接する頂点を検
査して、速すぎないかあるいは遅すぎないか調べる。速
すぎる場合はその速度を減少させ、ヒープを再ソートす
る。次いで、最低速度の頂点をヒープから除去し、ヒー
プが空になるまでこの手順を繰り返す。
【0088】次に、加速とその後の減速を支持できる線
分に沿って1個または2個の頂点を追加する。
【0089】最後に、データがhaul()に送られ、
haul()はステッパーモータ・パルス・シーケンス
を実時間で生成する。
【0090】図2に、haul()ルーチンの動作がハ
ードウェアで(具体的にはブロック26)実施される、
本発明のもう1つの実施例を示す。
【0091】図2において、ロボット・システム20
は、軌道生成装置(図示せず)から出力された頂点リス
ト22を含む。頂点リストの出力22aは、移動コンパ
イラ24に頂点を提供し、移動コンパイラ24は、上記
に詳述した方法の諸ステップを実施する。移動コンパイ
ラ24の出力24aは、各軸に関するステップ数と、主
軸の速度とからなるリストである。ブロック26は、h
aul()ルーチンの諸機能を実施し、各軸に関する同
期パルス列を補間する。ブロック26の出力はフィード
バック・ブロック28に供給される。フィードバック・
ブロック28の出力28aはステッパ・モータ・ドライ
バ・ブロック30に供給される。ステッパ・モータ・ド
ライバ・ブロック30は、ステッパ・モータ1〜nを駆
動するための複数(n個)の出力を有する。
【0092】システム20はさらに、各ステッパ・モー
タごとに1個ずつ、計n個のエンコーダを含み、それら
のエンコーダの出力はエンコーダ・データ・ブロック3
2に供給される。ブロック32は、エンコーダの出力を
デジタル化し、このデータをフィードバック・ブロック
28に入力28bとして供給する。各エンコーダ出力は
関連するステッパ・モータの位置を表す。
【0093】一般に、スイッチSW1で示されるよう
に、システム20は、1つまたは複数のステッパ・モー
タを加速するとき開ループ(OL)構成で動作し、1つ
または複数のステッパ・モータを位置変更する必要があ
る場合は閉ループ(CL)構成で動作する。閉ループ動
作が必要になるのは、たとえば加速中または減速中にス
テッパ・モータをストールさせるべき場合である。
【0094】動作に際して、フィードバック・ブロック
28は、各軸の予想位置を、関連するエンコーダ・デー
タによって示されるその実際位置と比較する。2つの位
置が異なる場合、及び軸が主軸でない場合、及び軸のス
テップ速度が所定のしきい値より低い場合、フィードバ
ック・ブロック28によって、誤った軸を所望の位置に
復元するための補正ステップが出力される。
【0095】補間ブロック26は、haul()ルーチ
ンの諸機能を迅速に実行するアプリケーション固有集積
回路(ASIC)として実施できる。ブロック22と2
4は、ワークステーションなどの接続プロセッサ内に含
めることができ、その場合リンク24aはワークステー
ションと実際のロボットの補間ブロック26との間の通
信リンクとなる。フィードバック・ブロック28は、ス
テッパ・モータ駆動信号を出力し、予想位置と実際位置
を比較し、必要なとき補正ステップ・シーケンスを生成
する諸機能を実行する、独立したプロセッサで実施する
ことができる。
【0096】先に指摘したように、本発明の教示は高速
プロトタイプ作成システムに限定されるものではなく、
またステッパ・モータとのみの使用に限定されるもので
もない。たとえば、各モータがエンコーダまたは類似の
フィードバック・センサの使用による閉ループ制御を備
える、同期モータにも本発明の教示が使用できる。この
場合、最小分解可能距離(たとえば半ミル:参考1ミル
=1000分の1インチ=0.025mm)が「ステッ
プ・サイズ」として使用され、移動コンパイラから出力
されるコマンド・ストリームが、各同期モータとエンコ
ーダの組合せへの入力として使用される。本発明を使用
すると、閉ループ利得を減少させ、それによって、高速
で大域的に最適な位置決めを可能にするために必要な軌
道の事前処理という利点をもたらしながら、安定性を改
善することが可能になる。
【0097】以上、本発明をその好ましい実施例に関し
て具体的に図示し、記述してきたが、本発明の範囲及び
趣旨から逸脱することなくその形態及び細部に変更を加
えられることが当業者には理解されよう。
【0098】まとめとして、本発明の構成に関して以下
の事項を開示する。
【0099】(1)それぞれn次元空間(nは2以上)
内のある位置を定義する座標を有する複数の頂点によっ
て定義される、n次元空間中の所定の軌道に沿って、複
数のモータによってある物体を駆動するのに要する時間
を減らす方法であって、それぞれ少なくとも1個の他の
頂点から1本の線分によって分離された所望の軌道を定
義する1組の頂点を提供するステップと、各頂点につい
て、その頂点に対応する軌道上の1点を通って物体を並
進運動させながら支持できる最大速度を決定するステッ
プと、必要な場合、物体をどの頂点でも最大速度を越え
ずに最短時間で軌道を通過させる、軌道に沿った速度プ
ロフィルが達成されるように、頂点リストを修正するス
テップと、修正済み頂点リストをモータ駆動位置に変換
して、複数のモータに修正済み頂点リストに従って物体
を並進運動させるステップと、を含む方法。 (2)モータが、駆動信号パルスに応答してステップ距
離dを移動するステッパ・モータであり、軌道上の1点
を通って物体を頂点i−1からiを経てi+1に並進移
動させると角度θiの偏向が生じ、cosθiの値を使っ
て、最高速の移動を有する軸に関連するステッパ・モー
タについて駆動信号パルス間の遅延時間を決定すること
を特徴とする、上記(1)に記載の方法。 (3)前記修正ステップが、所望の軌道に対応する走行
長にわたって、ステッパ・モータの動的特性に従って速
度プロフィルを決定するステップと、頂点対間の最大加
速及び最大減速の作用をテストして、得られる速度がそ
の対の1つの頂点で決定された最大速度を越えるかどう
か判定するステップと、頂点間で最大加速及び最大減速
を使用できるように頂点の速度を調節し、必要ならばそ
の対の頂点間に1つまたは複数の中間頂点を挿入するス
テップと、を含むことを特徴とする、上記(2)に記載
の方法。 (4)動的特性がトルクであることを特徴とする、上記
(3)に記載の方法。 (5)それぞれn次元空間(nは2以上)内のある位置
を定義する座標を有し、他の少なくとも1つの頂点から
1本の線分によって分離された頂点のリストによって定
義される、n次元空間中の所定の軌道に沿って、複数の
モータによってある物体を駆動するのに要する時間を減
らす方法であって、(a)物体がある線分から次の線分
に駆動される際に方向を変えるとき、各頂点ごとに維持
できる最大速度を決定するステップと、(b)最大速度
の昇順に頂点をソートするステップと、(c)最低速の
頂点と軌道中の次の頂点とからなる頂点の対を検査する
ステップと、次の頂点における決定された最大速度が、
最低速の頂点からできるだけ速やかに加速することによ
って丁度達成されることが判明した場合に、(d)次の
頂点における決定された最大速度を、正しいものとマー
クするステップと、次の頂点における決定された最大速
度が、決定された最大速度より大きいことが判明した場
合に、(e)次の頂点の最大速度を、最低速の頂点から
できるだけ速やかに加速することによって達成される値
に減少させるステップと、(f)次の頂点における減少
後の最大速度を、正しいものとマークするステップと、
次の頂点における決定された最大速度が、決定された最
大速度より低いことが判明した場合に、(g)次の頂点
を、後で少なくとも1つの中間頂点を追加すべきものと
マークするステップと、(h)最低速の頂点と軌道中の
前の頂点とからなる頂点の対を検査するステップと、最
低速の頂点における決定された最大速度が、前の頂点か
ら最低速の頂点へできるだけ速やかに減速することによ
って丁度達成されることが判明した場合に、(i)前の
頂点における最大速度を、正しいものとマークするステ
ップと、前の頂点における決定された最大速度が、決定
された最大速度よりも大きいことが判明した場合に、
(j)前の頂点の最大速度を、前の頂点から最低速の頂
点へできるだけ速やかに減速することによって達成され
る値に減少させるステップと、(k)前の頂点の減少後
の最大速度を、正しいものとマークするステップと、前
の頂点における決定された最大速度が、決定された最大
速度より低いことが判明した場合に、(l)前の頂点
を、後で少なくとも1つの中間頂点を追加すべきものと
マークするステップと、(m)最大速度が最低の頂点を
頂点リストから除去するステップと、(n)すべての頂
点対が検査を終えたかどうか判定するステップと、
(o)ステップ(n)でノーの場合、ステップ(b)か
ら(n)までを繰り返すステップと、(p)ステップ
(n)でイエスの場合、前に頂点を追加すべきものとマ
ークした各頂点対の間に少なくとも1つの中間頂点を追
加するステップと、(q)得られた頂点リストの各頂点
で指示された速度を達成するように物体を軌道に沿って
駆動させるため、得られた頂点リストからモータ制御信
号のシーケンスを決定するステップと、を含む方法。 (6)モータがステッパ・モータであり、ステップ
(q)で、頂点対の第1の頂点からの完全加速及び頂点
対の第2の頂点への完全減速により、その頂点対を連結
する線分上で、加速速度と減速速度が同じで、両方の頂
点からの整数のステッパ・データ・ステップ数であり、
交点での速度が最大許容速度より小さくなる位置が得ら
れる場合に、単一の頂点を追加することを特徴とする、
上記(5)に記載の方法。 (7)頂点対間の線分に沿った完全加速とその後に続く
完全減速により速度が最大許容速度に達する場合に、ス
テップ(q)で、速度が最初に最大許容速度に達する線
分上の点に第1の頂点を追加し、完全加速の結果、第2
の頂点が決定された最大速度に達する線分上の点に第2
の頂点を追加することを特徴とする、上記(5)に記載
の方法。 (8)データがステッパ・モータであり、完全加速ラン
プと完全減速ランプが非整数のステッパ・モータ・ステ
ップ数で交差する場合に、ステップ(q)で、加速さも
減速さももたらさない1つのステッパ・モータ・ステッ
プで互いに分離された、線分上の2個の頂点を追加する
ことを特徴とする、上記(7)に記載の方法。 (9)ステップ(b)がヒープ・ソートによって実施さ
れることを特徴とする、上記(5)に記載の方法。 (10)モータがステッパ・モータであり、軌道上の1
点を通って物体を頂点i−1からiを経てi+1に並進
運動させると、角度θiの偏向が生じ、ステップ(a)
でcosθiの値を使って、頂点iについての最大速度を決
定することを特徴とする、上記(5)に記載の方法。 (11)それぞれn次元空間(nは2以上)内のある位
置を定義する座標を有する複数の頂点によって定義され
る、n次元空間中の所定の軌道に沿って、ある物体を制
御可能に位置決めするための複数のモータを有する多軸
ロボット・システムであって、それぞれ他の少なくとも
1つの頂点から1本の線分によって分離された、所望の
軌道を定義する1組の頂点を事前処理する手段を備え、
前記事前処理手段が、各頂点について、その頂点に対応
する軌道上の1点を通って物体を並進運動させながら支
持できる最大速度を決定する手段と、必要な場合、物体
をどの頂点でも最大速度を越えずに最短時間で軌道を通
過させる、軌道に沿った速度プロフィルが達成されるよ
うに、頂点リストを修正する手段と、修正済み頂点リス
トをモータ駆動信号に変換して、複数のモータに修正済
み頂点リストに従って物体を並進運動させる手段と、を
含むロボット・システム。 (12)モータが、駆動信号パルスに応答してステップ
距離dを移動するステッパ・モータであり、軌道上の1
点を通って物体を頂点i−1からiを経てi+1に並進
移動させると角度θiの偏向が生じ、前記決定手段が、
最高速の移動を有する軸に関連するステッパ・モータに
ついて駆動位置パルス間の遅延時間に決定するために使
用されるcosθiの値を決定する手段を含むことを特徴と
する、上記(11)に記載のロボット・システム。 (13)前記修正手段が、所望の軌道に対応する走行長
にわたって、ステッパ・モータの動的特性に従って速度
プロフィルを決定する手段と、頂点対間の最大加速及び
最大減速の作用をテストして、得られる速度がその対の
1つの頂点で決定された最大速度を越えるかどうか判定
する手段と、前記テスト手段の動作に応答して、頂点間
で最大加速及び最大減速を使用できるように頂点の速度
を調節し、必要ならばその対の頂点間に1つまたは複数
の中間頂点を挿入する手段とを備えることを特徴とす
る、上記(12)に記載のロボット・システム。 (14)動的特性がトルクであることを特徴とする、上
記(13)に記載のロボット・システム。 (15)物体が3次元構造を製作するためのツールであ
り、頂点リストが3次元構造の少なくとも一部分を定義
することを特徴とする、上記(11)に記載のロボット
・システム。 (16)製作ツールが、軌道に沿って射出物のビードを
押し出すための押出しノズルであることを特徴とする、
上記(15)に記載のロボット・システム。 (17)さらに、前記モータのそれぞれに関連するフィ
ードバック・センサ手段と、前記フィードバック・セン
サ手段に応答して、前記モータのうちの1つまたは複数
を、位置決め誤差を補償するように制御可能に再位置決
めする手段とを備えることを特徴とする、上記(11)
に記載のロボット・システム。
【0100】
【発明の効果】本発明によれば、ロボットの運動学的特
性が、時間最適化された軌道の詳細な特徴をどのように
規定するかを正確に予見し、次いで簡単な時間ベースの
制御装置を使用して、この軌道の実現に必要なアクチュ
エータ・パルス列を生成することができ、ロボット移動
の実行前に軌道最適化を達成する方法及び装置を提供す
ることができ、現在使用できるマイクロプロセッサ技術
を利用して、1000回の直線状2点間移動の見通し長
さから全体的に最適化された軌道をもたらすようにする
方法及び装置を提供することができ、軌道をできるだけ
速やかに通過するように、基礎となるロボット・システ
ムの機械的拘束条件を越えずにモータ駆動シーケンスを
最適化するために、所望の軌道を事前処理する方法及び
装置を提供することができる。 付録A ファイル名 JOGMTR.CPP include <stdio.h> include <conio.h> include <math.h> include <stdlib.h> include <dos.h> include <c:\heap\jog.h> 3つの構造アレイmove_position, move_delta, move_parms はそれぞれ12バイ ト 長。 truct global_position { signed long x ; //エンコーダ比較に必要 signed long y ; //ステップによる絶対位置 signed long z ; }far move_position [1503]; truct { //印刷すべき頂点の空間位置を与える構造 signed short x ; signed short y ; signed short z ; signed short p ; signed short max ; signed short templat; //モータ方向を設定する }far move_delta[1503]; enum accelerations { not_defined, decelerate, coast, accelerate }; enum vertex_adding { un_tested, correct, add_a_vertex }; truct { signed short last ; // 直前の頂点のインデックス signed short next ; // 直後の頂点のインデックス signed short start_speed; // no_op インデックス;この頂点に至る線分の // 開始時の速度 signed short end_speed; // この頂点での no_op インデックス signed int acc : 4 ; // // 0 = 未定義、1 = 減速、2 = 慣性運動、3 = 加速 unsigned int left_tested :4; // 隣接する頂点の状況比較 signed int flow :2; // 1 ポンピング、-1 吸収、ゼロ なし unsigned int corner :4; // コーナリング運動を追加する unsigned int lift :2; // z移動との関係を断つ unsigned int phantom :2; // 実際には移動しない unsigned int inspect :2; // 任意選択で層の最後に unsigned int delay :1; // 頂点に達した後 unsigned int encode :1; // エンコーダを読み取る unsigned int correct :2; // 希望する場合は固定する unsigned int matloc :4; // 0 裸、1 左にマット、2 右にマット、3 unsigned int quality :4; // 0 最高速、2 最低速 } far move_parms[1530]; signed short far speed_table{8197]; // 余弦偏向を速度に変換する signed short far no_op[16390]; // ランプ遅延ルックアップ・テーブル signed short vertex_count;// 全頂点+2(ヘッド・トークンとテール・トークン signed short heap_count; // ヒープの総数 signed short next_v; // 次の開いた頂点位置のアドレス signed short this_v; // 現頂点位置のアドレス signed short max_M = 1500; // 最大許容ヒープ // for add_move() signed long temp_request[4], max_temp_request; // for set_velocity() coat hypotenuse_xyzp_steps; coat last_hypotenuse_xyzp_steps; move_parms[heap[k]].spead はヒープ中の k 番目のエントリまたはキーの速 度 インデックス signed short heap[2003]; // ヒープの順序付け inverse[i] は、i 番目のvelocity_index のヒープ・アレイ内へのインデック ス signed short inverse[2003]; // 各頂点のヒープ位置 したがって、最小速度はヒープの最初のメンバー: in_box[heap[1]] == smallest velocity Let heap[1] == k Then inverse[k] = 1. // // どの velocity_index も <1 でないことを必要とし、したがって 0 をシーケ // ンス値として使用できる。 // // move_parms[]とmove_delta[]は、ガントリを操作するための最終移動コマン ド // 情報をすべて含む2つの構造である。定義により、move_...[1]は、シーケン // ス開始時の静止ノズルの位置を記述するものと仮定する。これは、速度イン デ // ックスが0の唯一の移動である(一般に、これは pqupheap() に留保された 監 // 視値である)。また、シーケンス中の最後の移動(このシーケンスは //move_... [1] の後に追加される vertex_count である)の指定速度は1であ // る。終了移動は、速度1のインデックス vertex_count+2 の所に追加される 。 // 機能が現れるようにするための機能的プロトタイプ・ // これらは move_compiler() ルーチンのみに使用される。 void set_acceleration ( signed short ); void add_move ( signed short ); void add_parms ( signed short ); void set_velocity ( signed short ); signed short add_vertex_before ( signed short ); void add_deltas ( signed short ); void pqconstruct ( void ); void pqdownheap ( signed short ); void pqinsert ( signed short ); void pqupheap ( signed short ); void pqremove ( void ); void compute_hysteresis ( signed short ); void set_template ( signed short ); signed short haul ( void ); short unsigned limit_recovery ( void ); void dump_parms ( FILE * ); void data_checker ( void ); // // 移動コンパイラは間接ヒープ・ソートの一例である。 // // Robert Sedgewick 著 ALGORITHMS pp. 132-139 から抜粋。 // signed short move_compile ( int terminate ) { // i は検査中の現頂点 // j は i の次の頂点 // h は i の前の頂点 // k はループ・カウンタ用 // h_i は h と i の間に挿入される頂点 // i_j は i と j の間に挿入される頂点 static signed short h, i, j, k, h_i, i_j; // max_delta_... はどの軸もとる大部分のステップである。 static signed short max_delta_h_i, max_delta_h_ii; // 長セグメントが再分割されつつある場合、スプライスは真である; static char splice; signed short d, e, v, n_loops; static char initialize = 1; signed short haul_return, temporary_vertex_count; static float steps_to_inches_squared[3]; static float hypotenuse_xyz_steps, hypotenuse_xyz_inches; signed long p_requested; static long signed temporary_layer; if (initialize) { initialize = 0; temporary_layer = layer_count; add_parms(0); for (k=0; k<3; k++) { temp_request[k] = 0; steps_to_inches_squared[k] = (float) inches_per_step[k]* (float) inches_per_step[k]; } temp_request[3] = 0; hypotenuse_xyzp_steps = 1000000.; // cos (偏向)を強制的にゼロにす る last_hypotenuse_xyzp_steps = 1000000.; move_parms[0].next = 1; move_parms[0].last = 0; move_position[0].x = x_stage; move_position[0].y = y_stage; move_position[0].z = z_stage; move_parms[0].left_tested = correct; move_parms[0].inspect = 0; move_parms[0].start_speed = speed_table[2]; move_parms[0].end_speed = speed_table[2]; set_acceleration(0); move_parms[0].flow = flow_cmd; move_delta[0].templat = dio_template|p_plus_mask; // [1] は始動移動構造 move_parms[1].next = 2; move_parms[1].last = 0; add_move(1); move_parms[1].left_tested = correct; move_parms[1].inspect = 0; move_parms[1].start_speed = speed_table[2]; move_parms[1].end_speed = speed_table[2]; set_acceleration(1); move_delta[1].templat = dio_template|p_plus_mask; move_parms[1].flow = flow_cmd; // [2] は最初の有効な頂点移動構造 move_parms[2].next = 3; move_parms[2].last = 1; add_move(2); move_parms[2].left_tested = correct; move_parms[2].start_speed = speed_table[2]; move_parms[2].end_speed = speed_table[2]; set_acceleration(2); move_delta[2].templat = dio_template|p_plus_mask; move_parms[2].flow = flow_cmd; vertex_count = 2; this_v = 2; next_v = 3; } // 早期に終了すべきかどうかテストして調べる if (terminate ||(temporary_layer != layer_count)) goto dump_it; // ソフトウェア限界外の移動かどうかテストする haul_return = 256; if (x_limit_minimum > x_requested) haul_return += x_minus_limit; if (x_limit_maximum < x_requested) haul_return += x_plus_limit; if (y_limit_minimum > y_requested) haul_return += y_minus_limit; if (y_limit_maximum < y_requested) haul_return += y_plus_limit; if (z_limit_minimum > z_requested) haul_return += z_minus_limit; if (z_limit_maximum < z_requested) haul_return += z_plus_limit; if (haul_return != 256) return haul_return; else haul_return = 0; // 指令された移動をデータ構造 move_delta[], move_parms[],move_position // []中にロードする。 // vertex=1 は出発点として留保する // vertex=vertex_count は終了点として使用する // next_v は次の開いた頂点位置pliced_line:// 計算された p_requested 中で
ポンプ・ステップを導出するtemp_request[0] = x_requested - move_position
[this_v].x;temp_request[1] = y_requested - move_position[this_v].y;temp_
request[2] = z_requested - move_position[this_v].z;hypotenuse_xyz_inches
= 0.;hypotenuse_xyz_steps = 0.;for (k=0; k<3; k++){hypotenuse_xyz_steps
+= (float)(temp_request[k]*temp_request[k]);hypotenuse_xyz_inches += st
eps_to_inches_squared[k]*hypotenuse_xyz_steps;}hypotenuse_xyz_inches =
(float)sqrt((double)hypotenuse_xyz_inches);// 流れがないと、正常な p_req
uested に0を掛けることになるp_requested = (long signed)(bead_diameter*b
ead_diameter*(double)flow_cmd*hypotenuse_xyz_inches*p_steps_per_cubic_in
ch);temp_request[3] = p_requested;// 速度計算のため全斜辺を計算するlast_
hypotenuse_xyzp_steps = hypotenuse_xyzp_steps;hypotenuse_xyzp_steps = (f
loat)sqrt((double)hypotenuse_xyz_steps +(double)(p_requested*p_requeste
d));// セグメントを再分割する必要があるかどうか検出するmax_temp_request
= 0;// max_temp_request より多くのステップをとる軸があるかどうか調べる{i
f(labs(temp_request[k])>(long signed)segment_limit)if(max_temp_request<l
abs(temp_request[k])){splice = k;max_temp_request = temp_request[k];}}//
そうである場合、部分移動に入るif(max_temp_request!=0){temp_request[spli
ce] = (temp_request[splice]> 0.)?(long signed)segment_limit: (long signe
d)(-segment_limit);hypotenuse_xyzp_steps = 0.;for(k=0; k<4; k++)if(k!=sp
lice)temp_request[k] = (temp_request[splice]*temp_request[k])/max_temp_r
equest;for(k=0; k<4; k++)hypotenuse_xyzp_steps += (float)(temp_request
[k]*temp_request[k]);hypotenuse_xyzp_steps = (float)sqrt((double)hypoten
use_xyzp_steps);}add_move(next_v);set_velocity(this_v);set_acceleration
(this_v);if((!move_parms[next_v].phantom)&&move_delta[next_v].max){// 移
動がファントム移動でない場合、あるいは何らかの運動が存在する場// 合、セ
ーブするthis_v = next_v;vertex_count++;next_v++;}// 必要ならば長セグメン
トの残り部分に読み込むif(max_temp_request!=0)goto spliced_line;// リスト
がほぼ満杯の場合、あるいは光学データ・リストが満杯の場合、シー// ケンス
を終了する。そうでない場合は、単に戻ってその後の移動を待つ。if((!optics_
list_full)&&(next_v<(max_M>>2)))return 0;ump_it:// 移動がない場合は、早
期にクイットするif(vertex_count==2){initialize = 1;return 0;}// 最後の実
際移動は速度インデックス=2で終わらなければならないtemp_request[k] = 0;
add_move(next_v);move_parms[next_v].inspect = 0;move_parms[next_v].left_
tested = correct;move_parms[this_v].end_speed = speed_table[2];move_parm
s[this_v].start_speed =move_parms[move_parms[this_v].last].end_speed;set
_acceleration(this_v);move_parms[next_v].start_speed = speed_table[2];mo
ve_parms[next_v].end_speed = speed_table[2];set_acceleration(next_v);mov
e_delta[next_v].templat = dio_template;move_parms[next_v].flow = flow_cm
d;next_v++;// [vertex_count+1] は終了移動構造add_move(next_v);move_parms
[next_v].next = next_v;move_parms[next_v].last = next_v;move_parms[next_
v].inspect = 0;move_parms[next_v].left_tested = correct;move_delta[next_
v].templat = dio_template;move_parms[next_v].start_speed = speed_table
[2];move_parms[next_v].end_speed = speed_table[2];set_acceleration(next_
v);move_parms[next_v].flow = flow_cmd;// next_v をオープン・メモリを指す
ように位置決めし直すnext_v++;// リストを走査し、z-リフト、逆吸引、事前ポ
ンピング、コーナ鋭角化、// 待機、その他の後端追加移動を追加するtemporary
_vertex_count = vertex_count;h = 2;for(k=1; k<temporary_vertex_count; k+
+){ // h は前の頂点、 i は現頂点、j は次の頂点i = move_parms[h].next;j
= move_parms[i].next;// did bead shut off at vertex i?if((move_parms
[i].flow==1)&&(move_parms[j].flow==0)&&(bead_lift_steps||bead_cut_of
f)){i_j = add_vertex_before(j); // 別の頂点に固着するmove_parms[i_j].in
spect = 0;move_delta[i_j].x = 0;move_delta[i_j].y = 0;move_delta[i_j].z
= bead_lift_steps;move_delta[i_j].p = -bead_cut_off;move_delta[i_j].max
= (bead_lift_steps>bead_cut_off)?bead_lift_steps: bead_cut_off;move_delt
a[j].z -= bead_lift_steps;if(move_delta[j].max<bead_lift_steps)move_delt
a[j].max = bead_lift_steps;move_position{i_j].x = move_position[i].x;mov
e_position{i_j].y = move_position[i].y;move_position{i_j].z = move_posit
ion[i].z +(signed long)bead_lift_steps;set_template(i_j);set_template
(j);move_parms[i_j].end_speed = speed_table[2];set_acceleration(i_j);mov
e_parms[j].start_speed = speed_table[2];set_acceleration(i_j);move_parms
[i_j].flow = -1;h = i;i = i_j;}// ビートは頂点 i で始動したか?if((move_
parms[i].flow==0)&&(move_parms[j].flow==1)&&(bead_lift_steps||bead_sta
rt_up)){ // 追加された頂点からドロップダウンし、事前ポンピングするh_i =
add_vertex_before(i); // 別の頂点に固着するmove_parms[h_i].inspect =
0;move_position{h_i].x = move_position[i].x;move_position{h_i].y = move_
position[i].y;move_position{h_i].z = move_position[i].z +(signed long)be
ad_lift_steps;move_delta[h_i].x = move_delta[i].x;move_delta[h_i].y = mo
ve_delta[i].y;move_delta[h_i].z = bead_lift_steps + move_delta[i].z;move
_delta[h_i].p = 0;move_delta[h_i].max = abs(move_delta[h_i].x);if(abs(mo
ve_delta[h_i].y)>move_delta[h_i].max)move_delta[h_i].max = abs(move_delt
a[h_i].y);if(abs(move_delta[h_i].z)>move_delta[h_i].max)move_delta[h_i].
max = abs(move_delta[h_i].z);move_delta[i].x = 0;move_delta[i].y = 0;mov
e_delta[i].z = -bead_lift_steps;move_delta[i].p = bead_start_up;move_del
ta[i].max = (bead_lift_steps>bead_start_up)?bead_lift_steps: bead_start_
up;set_template(h_i);set_template(i);move_parms[h_i].end_speed = speed_t
able[2];set_acceleration(h_i);move_parms[i].start_speed = speed_table
[2];set_acceleration(i);move_parms[h_i].flow = 0;move_parms[i].flow = 1;
h = h_i;}// ビートは頂点 i で鋭角コーナを曲がったか?if((move_parms[i].c
orner){// 当面は何もしない}h = i;}// 速度によるソートの準備としてヒープ
を生成するpqconstruct();// 最低速の頂点に隣接する頂点が単純加速ランプで
達することができるか検査// するfor(k=1; k<=vertex_count; k++){i = heap
[1];// ヒープ上端の左隣のリンクがテスト済みか調べるif(move_parms[i].left
_tested==un_tested){// h は付着シーケンス中で i の直前にあるより高速の頂
点h = move_parms[i].last;// 前の点から減速すると前の速度インデックスが可
能になるかどうか// 調べるd = move_parms[i].end_speed + move_delta[i].ma
x;e = move_parms[h].end_speed;if(d==e) // 前の頂点が丁度可能なだけの速
さ{ // テスト済みで発見済みとマークするmove_parms[i].left_tested =
correct;goto test_right;}if(d>e) // 前の頂点が可能なよりも遅い{
// 後で頂点を追加すべきものとマークするmove_parms[i].left_tested = add
_a_vertex;goto test_right;}// ここの場合、前の速度をドロップする必要があ
るmove_parms[h].end_speed = d;set_acceleration(h);i = move_parms[h].nex
t; // これはコンパイラ・バグを見つけるため// に入れるmove_parms[i].star
t_speed = d;set_acceleration(i);move_parms[i].left_tested = correct;//
左隣が前にその速度がテスト済みか調べる// そうである場合、後で追加の頂点
を加えなければならないif(move_parms[h].left_tested != un_tested)move_par
ms[h].left_tested = add_a_vertex;// 必要に応じて、左隣をヒープの上方に向
けるpqupheap(inverse[h]);}test_right:// ヒープ上端の右隣のリンクがテスト
済みか調べる// j は付着シーケンス中で i の直後にあるより速い頂点j = move
_parms[i].next;if(move_parms[j].left_tested==un_tested){// 次の頂点へ加
速すると次の速度インデックスが可能になるかどうか// 調べるd = move_parms
[i].end_speed + move_delta[j].max;e = move_parms[j].end_speed;if(d>e)
// 次の頂点が可能なよりも遅い{ // 後で頂点を追加すべきものとマー
クするmove_parms[j].left_tested = add_a_vertex;goto test_done;}if(d==e)
// 次の頂点が丁度可能なだけの速さ{ // テスト済みで発見済みとマー
クするmove_parms[j]/left_tested = correct;goto test_done;}// ここの場
合、次の速度をドロップする必要があるmove_parms[j].end_speed = d;set_acce
leration(j);move_parms[move_parms[j].next].start_speed = d;set_accelerat
ion(move_parms[j].next);move_parms[j].left_tested = correct;// 右隣が前
にその速度がテスト済みか調べる。// そうである場合、後で追加の頂点を加え
なければならない。if(move_parms[move_parms[j].next].left_tested != un_te
sted)move_parms[move_parms[j].next].left_tested = add_a_vertex;// 必要に
応じて右隣をヒープの上方に向けるpqupheap(inverse[j]);}test_done:// 上端
のまたは最低速の頂点をヒープから除去し、やり直すpqremove();}// このと
き、必要な余分の頂点を追加するh = 2; // 最初の頂点を見つけるtemp
orary_vertex_count = vertex_count;for(k=1; k<=temporary_vertex_count; k+
+){i = move_parms[h].next; // h は最後の頂点if(move_parms[i].left_tes
ted == add_a_vertex){// 2つの頂点を追加する必要があるか調べる。頂点から
のランプが整// 数速度で互いに出合わない場合、あるいは最大速度を越える速
度で// 出合う場合はそうである。d = move_parms[i].end_speed + move_parms
[h].end_speed+ move_delta[i].max;v = d>>1;v = (v > max_ramp_steps)? max_
ramp_steps: v;max_delta_h_ii = d - 2*v;max_delta_h_i = (d - 2*move_parms
[h].end_speed- max_delta_h_ii)>>1;if(!max_delta_h_i){if(!max_delta_h_ii)
// 頂点 h の速度を複数回リセットするので、今は中間頂点は// 必要でない。
{move_parms[i].left_tested = correct;goto add_done;}else{max_delta_h_i =
max_delta_h_ii;max_delta_h_ii = 0;}}// max_delta_h_i は、h 頂点から頂点
h_i で限界速度vに達するた// めのステップ数。// max_delta_h_ii は、頂点
h_i から h_i と i の間の頂点に行くた// めのステップ数。// max_delta_h_i
i!=0 の場合、2つの頂点が必要。// 最初の頂点を挿入するh_i = add_vertex_b
efore(i);if(next_v > max_M) // check for memory overflow{printf("Addi
ng vertices caused memory overflow.\n");return 1;}// ここで、i と h の
間にある頂点 n の位置と速度を計算する。// h 番目の頂点と i 番目の頂点か
らのランプがどこで交差するか見つ// けるmove_delta[h_i].max = max_delta_h
_i;move_parms[h_i].end_speed = v;set_acceleration(h_i);move_parms[i].sta
rt_speed = v;set_acceleration(i);add_deltas(i);if(!max_delta_h_ii) //
1頂点分だけスキップするgoto add_done;// 加速と慣性運動だけで減速はない
かどうか調べるif(move_parms[h_i].end_speed == move_parms[i].end_speed)go
to add_done;// 慣性運動と減速しかないかどうか調べるif(move_parms[h_i].en
d_speed == move_parms[h].end_speed)goto add_done;h = h_i; // n が前
の頂点となるh_i = add_vertex_before(i);move_delta[h_i].max = max_delta_h
_ii;move_parms[h_i].end_speed = v;set_acceleration(h_i);add_deltas(i);ad
d_done:move_parms[i].left_tested = correct;}if(debug_optional)dump_parms
(optional_stream);h = i; // h が前の頂点になる}// 移動しない高速
度の頂点を除去するi = move_parms[1].next;temporary_vertex_count = vertex
_count;for(k=1; k<=temporary_vertex_count; k++){// 頂点を追加したときの
丸め誤差から、すべての個別構成要素が0のとき// maxは非ゼロとなり得る。//
必要に応じて有効な頂点を検査リストに移す。if( (move_delta[i].x == 0)&&
(move_delta[i].y == 0)&&(move_delta[i].z == 0)&&(move_delta[i].p == 0)&&
(move_parms[i].start_speed > speed_table[2])){vertex_count--;move_parms
[move_parms[i].last].next = move_parms[i].next;move_parms[move_parms[i].
next].last = move_parms[i].last;}if((move_parms[i].inspect > 0)&&(!optic
s_list_full))add_to_inspection_list(move_position[i].x,move_position[i].
y, move_position[i].z);i = move_parms[i].next;}// シーケンスを図形表示す
る// エラーの有無を検査するif(debug_checker){data_checker();haul_return
= 0;}// そうでない場合、移動を実行するelsehaul_return = haul();// 次に新
しい頂点シーケンスを開始するinitialize = 1;return haul_return;}void set_
acceleration( signed short i){move_parms[i].acc = coast;if(move_parms
[i].start_speed>move_parms[i].end_speed)move_parms[i].acc = decelerate;i
f(move_parms[i].start_speed<move_parms[i].end_speed)move_parms[i].acc =
accelerate;return;}// 頂点 i に関するデルタおよび位置構造に移動データを
追加するため、add_mo// ve(i) を呼び出す。temp_request[] は定義済みと仮
定。void add_move( signed short i){move_parms[i].last = i-1;move_parms
[i].next = i+1;add_parms(i);move_position[i].x = temp_request[0] + move_
position[i-1].x;move_position[i].y = temp_request[1] + move_position[i-
1].y;move_position[i].z = temp_request[2] + move_position[i-1].z;move_de
lta[i].x = (short signed)temp_request[0];move_delta[i].y = (short signe
d)temp_request[1];move_delta[i].z = (short signed)temp_request[2];move_d
elta[i].p = (short signed)temp_request[3];move_delta[i].max = abs(move_d
elta[i].x);if(abs(move_delta[i].y)>move_delta[i].max)move_delta[i].max =
abs(move_delta[i].y );if(abs(move_delta[i].z)>move_delta[i].max)move_de
lta[i].max = abs(move_delta[i].z);if(abs(move_delta[i].p)>move_delta[i].
max)move_delta[i].max = abs(move_delta[i].p);set_template(i);compute_hys
teresis(i);return;}// 頂点 i に関する move_parms[i] フラグをセットするvo
id add_parms( signed short i ){move_parms[i].left_tested = un_tested;mov
e_parms[i].flow = flow_cmd;move_parms[i].corner = 0;move_parms[i].phanto
m = 0;move_parms[i].inspect = inspect_cmd;move_parms[i].delay = 0;move_p
arms[i].encode = 0;move_parms[i].correct = 0;move_parms[i].lift = 0;move
_parms[i].matloc = 0;move_parms[i].quality = 0;return;}// 頂点 i に関す
る最高速度のインデックスを見つけるため。// 頂点 i に接近する線分用の斜辺
が hypotenuse_xyzp_steps 中にある。// 前の線分用の斜辺は、last_hypotenus
e_xyzp_steps 中になければならない。move_parms[i].next が有効でなければな
らない。void set_velocity( signed short i ){float cos_angle, float_inde
x;signed short j, v;move_parms[i].start_speed = move_parms[move_parms
[i].last].end_speed;if((hypotenuse_xyzp_steps==0.)||(last_hypotenuse_x
yzp_steps==0.)){ // どちらかの移動が長さゼロの場合、最低速度を使用するmo
ve_parms[i].end_speed = 1;return;}j = move_parms[i].next;cos_angle = ((f
loat)move_delta[i].x*(float)move_delta[j].x +(float)move_delta[i].y*(flo
at)move_delta[j].y +(float)move_delta[i].z*(float)move_delta[j].z +(floa
t)move_delta[i].p*(float)move_delta[j].p)\(hypotenuse_xyzp_steps*last_h
ypotenuse_xyzp_steps);if(cos_angle>=1.) cos_angle = 0.9999;float_index =
2./(1.-cos_angle);if(float_index>8196.)v = 8196;elsev = (short signed)f
loat_index;move_parms[i].end_speed = speed_table[v];return;}// i 番目の
頂点と i の直前の頂点の間に頂点を挿入する。next_v が空の場所を// 指し、a
cc が両方の初期頂点からその新しい頂点へ向かうと仮定する。signed short ad
d_vertex_before( signed short i ){short signed k, return_value;// 頂点は
i 番目の頂点の前に行くと仮定move_parms[next_v].next = i;k = move_parms
[i].last;move_parms[next_v].last = k;move_parms[i].last = next_v;move_pa
rms[k].next = next_v;add_parms(next_v);move_parms[next_v].start_speed =
move_parms[k].end_speed;return_value = next_v;next_v++;vertex_count++;re
turn return_value;}// 頂点 h が i の前に挿入された後、まず h に次いで i
に行くために要するス// テップ数を区分する。void add_deltas( signed short
i ){float ratio;double product;signed short h;h - move_parms[i].last;if
((move_delta[i].max<1)||(move_delta[h].max<1)){printf("Vertex %i has l
ength %i.\n",i, move_delta[i].max);printf("Vertex %i has length %i.\
n",h, move_delta[h].max);if(debug_motors){fprintf(motors_stream,"Vertex
%i has length %i.\n",i, move_delta[i].max);fprintf(motors_stream,"Verte
x %i has length %i.\n",h, move_delta[h].max);dump_parms(motors_strea
m);}return;}ratio = (float)move_delta[h].max/(float)move_delta[i].max;//
丸め誤差に注意することproduct = (double)(ratio*(float)move_delta[i].x);
move_delta[h].x = (signed short)floor(product+0.5);move_delta[i].x -= mo
ve_delta[h].x;product = (double)(ratio*(float)move_delta[i].y);move_delt
a[h].y = (signed short)floor(product+0.5);move_delta[i].y -= move_delta
[h].y;product = (double)(ratio*(float)move_delta[i].z);move_delta[h].z =
(signed short)floor(product+0.5);move_delta[i].z -= move_delta[h].z;pro
duct = (double)(ratio*(float)move_delta[i].p);move_delta[h].p = (signed
short)floor(product+0.5);move_delta[i].p -= move_delta[h].p;move_delta
[h].max = abs(move_delta[h].x);// 悪い比率を選んだ場合、最大値が正しいか
検査するif(abs(move_delta[h].y)>move_delta[h].max)move_delta[h].max = ab
s(move_delta[h].y);if(abs(move_delta[h].z)>move_delta[h].max)move_delta
[h].max = abs(move_delta[h].z);if(abs(move_delta[h].p)>move_delta[h].ma
x)move_delta[h].max = abs(move_delta[h].p);move_delta[i].max -= move_del
ta[h].max;move_parms[h].left_tested = correct;move_parms[i].left_tested
= correct;move_position[h].x = move_position[i].x - (long signed)move_de
lta[i].x;move_position[h].y = move_position[i].y - (long signed)move_del
ta[i].y;move_position[h].z = move_position[i].z - (long signed)move_delt
a[i].z;set_template(h);compute_hysteresis(h);return;}// velocity_index
の値が連続する in_box 構造中にロードされていると仮定す// ると、pqconstru
ct は隣接するポインタを割り当て、(ヒープ・インデックス// から in_box を
指す)アレイ heap[]と(in_box インデックスからヒープを指// す)inverse[]
とをソートする。void pqconstruct( void ){signed short k, i;// ヒープ中
に初期ゼロ速度の移動 [1] を含めるheap_count = vertex_count;// ヒープ・イ
ンデクシング・アレイを初期設定する// 注:ヒープ [0] は pqupheap() 用に留
保されている。// 注:ヒープの上端はヒープ [1] でなければならない。i = mo
ve_parms[1].next;for(k=1; k<=heap_count; k++){heap[k] = i;inverse[i] =
k;i = move_parms[i].next;}for(k=heap_count>>1; k>=1; k--)pqdownheap(k);}
// pqdownheap は、ヒープ中の k 番目のエントリに関連する速度をその子につ
い// てテストする。その方が大きい場合は、それを子のうちで小さい方と交換
し、// その後、次の1対の子について再度テストする。void pqdownheap( sign
ed short k ){signed short j, v;v = heap[k];while( k<= (heap_count>>1) )
// >>1 は右に1シフトまたは2で割るを意// 味する{j = k + k;if(j<heap_c
ount)// j は2つの子のうち小さい方を指すif(move_parms[heap[j]].end_speed
>move_parms[heap[j+1]].end_speed) j++;if(move_parms[v].end_speed<=move_p
arms[heap[j]].end_speed)goto done;// j にある子がテスト・エントリよりも
小さい場合は、その子をヒー// プ上のより高い位置(最小値に近い位置)に再
割当てするheap[k] = heap[j];// 逆ルックアップを適当に修正するinverse[hea
p[j]] = k;// その子の子と突き合わせてテストする準備をするk = j;}done://
in_box[v] がそのどちらの子よりも小さい場合は、それをヒープ中のその// 位
置に割り当てる。heap[k] = v;inverse[v] = k;return;}// 既存のヒープに in_
box[v] を追加するため、それを最後の開いたブランチに// 仮留めし、その道を
進ませるvoid pqinsert( signed short v ){heap_count++;heap[heap_count] =
v;pqupheap(heap_count);}// ある要素をヒープの上方に(値が最小の構成要素
の方に)向かわせるため、監// 視インデックスをヒープ [0] に割り当てること
から始める。注:これは0が// 最小許容 velocity_index よりも小さいことが
必要。void pqupheap( signed short k ){signed short v;v = heap[k];// マス
タ親に固有 in_box を割り当てるheap[0] = max_M;inverse[max_M] = 0;// その
親に全体で最低の速度を割り当てるmove_parms[max_M].end_speed = 0;// ヒー
プ中の k 番目の要素をその親と突き合わせて検査するwhile(move_parms[heap[k
>>1]].end_speed>=move_parms[v].end_speed){// 親の方が大きい場合、親を子
の位置に置くheap[k] = heap[k>>1];// 逆アレイを整えるinverse[heap]k]] =
k;// 続いて次の親と比較するk = k>>1;}// 親より大きい場合は、最終位置に割
り当てるheap[k] = v;// 逆アレイを整えるinverse[v] = k;}ヒープの一番上の
メンバーをヒープから取り出すため:void pqremove( void ){heap[1] = heap[h
eap_count];heap_count--;pqdownheap(1);return;}// 頂点 i 用の移動方向テン
プレートを設定するvoid set_template( signed short i ){move_delta[i].temp
lat = dio_template;move_delta[i].templat |= (move_delta[i].x>=0)?x_plus
_mask: x_minus_mask;move_delta[i].templat |= (move_delta[i].y>=0)?y_plu
s_mask: y_minus_mask;move_delta[i].templat |= (move_delta[i].z>=0)?z_pl
us_mask: z_minus_mask;move_delta[i].templat |= (move_delta[i].p>=0)?p_p
lus_mask: p_minus_mask;return;}// ステッパ・モータ中の磁気メモリを補償す
るため、必要に応じて追加のステッ// プを適用し、あるいは適用するステップ
を減らす。// 前の頂点に適用されたステップを除去し、現頂点に適用可能なス
テップを追加// する。void compute_hysteresis( signed short i ){signed sh
ort h, index;signed short last, current;h = move_parms[i].last;index =
(move_position[h].x-pole_offset[0])%steps_between_poles[0];if(x_plus_mas
k)last = (x_plus_mask&move_delta[h].templat)?plus_v_hysteresis[0][inde
x]: minus_v_hysteresis[0][index];elselast = (x_minus_mask&move_delta[h].
templat)?minus_v_hysteresis[0][index]: plus_v_hysteresis[0][index];index
= (move_position[i].x-pole_offset[0])%steps_between_poles[0];if(x_plus_
mask)current = (x_plus_mask&move_delta[i].templat)?plus_v_hysteresis[0]
[index]: minus_v_hysteresis[0][index];elsecurrent = (x_minus_mask&move_d
elta[i].templat)?minus_v_hysteresis[0][index]: plus_v_hysteresis[0][inde
x];move_delta[i].x += current - last;index = (move_position[h].y-pole_of
fset[1])%steps_between_poles[1];if(y_plus_mask)last = (y_plus_mask&move_
delta[h].templat)?plus_v_hysteresis[1][index]: minus_v_hysteresis[1][ind
ex];elselast = (y_minus_mask&move_delta[h].templat)?minus_v_hysteresis
[1][index]: plus_v_hysteresis[1][index];index = (move_position[i].y-pole
_offset[1])%steps_between_poles[1];if(y_plus_mask)current = (y_plus_mask
&move_delta[i].templat)?plus_v_hysteresis[1][index]: minus_v_hysteresis
[1][index];elsecurrent = (y_minus_mask&move_delta[i].templat)?minus_v_hy
steresis[1][index]: plus_v_hysteresis[1][index];move_delta[i].y += curre
nt - last;index = (move_position[h].z-pole_offset[2])%steps_between_pole
s[2];if(z_plus_mask)last = (z_plus_mask&move_delta[h].templat)?plus_v_hy
steresis[2][index]: minus_v_hysteresis[2][index];elselast = (z_minus_mas
k&move_delta[h].templat)?minus_v_hysteresis[2][index]: plus_v_hysteresis
[2][index];index = (move_position[i].z-pole_offset[2])%steps_between_pol
es[2];if(z_plus_mask)current = (z_plus_mask&move_delta[i].templat)?plus_
v_hysteresis[2][index]: minus_v_hysteresis[2][index];elsecurrent = (z_mi
nus_mask&move_delta[i].templat)?minus_v_hysteresis[2][index]: plus_v_hys
teresis[2][index];move_delta[i].z += current - last;return;}// HAUL()
は、ステッパ・モータの1つを実際に走らせるただ3つのルーチンの// 1つで
ある。SQUIRT()とLIMIT_RECOVERY()が他の2つである。//// HAUL() は、構造 m
ove_parms 及び move_delta 中に頂点のリストを予想す// る。それが実行する
頂点の数は、大域 vertex_count で与えられる。HAUL()// は、move_parms[1].n
ext が最初に実行すべき実際の移動を指すものと仮定す// る;move_parms.next
ポインタは、頂点のシーケンス全体を読み出すのに使用// される。//// デー
タに対して限界についての検査は行われない。x_stage, y_stage, z_stage (ス
テップ単位で表した現位置の長カウンタ)は各頂点で更新される。stage_positi
on[] は、移動シーケンス全体の最後に更新される。実行が成功の場合は、0が
返される。機械的限界にぶつかった場合は、limit_switches が返される。signe
d short haul( void ){unsigned short direction_template, temporary_mask;u
nsigned short register i_loop;signed short x_step, y_step, z_step, p_ste
p;signed short vertex, acc, i_v, speed_index;signed short return_value,
loop_count;signed long maximum_delta, i;signed long delta_x_h, delta_y_
h, delta_z_h, delta_p_h;signed long x_steps_taken, y_steps_taken;signed
short z_steps_taken, p_steps_taken;signed long delay_counter;後からくる
ものに対して、Slo_Syn 移動制御装置は、CW/CCW 線がハイにアサートされたと
きと、最初のパルスがくる可能性があるときの間に、時間遅延を必要とする。1
または2 outw()時間では十分でない。したがって、移動用の方向テンプレートを
設定し、ソフトウェア遅延を行い、次いでモータ駆動パルスを送る。
*/x_steps_taken = 0;y_ste
ps_taken = 0;z_steps_taken = 0;p_steps_taken = 0;if((limit_switches=inp
(io_address))>limit_test)goto limit_reached;if(debug_motors) /* 要
求された場合、モータ移動を記録する */{i_v = move_parms[1].next;fprintf
(motors_stream,"vertex delta-x delta-y ");fprintf(motors_stream,"delta-z
delta-p speed ");fprintf(motors_stream,"acceleration template (x,y,z)\
r\n");for(vertex=1; vertex<=vertex_count; vertex++){fprintf(motors_stre
am,"v%i x%i y%i z%i p%i ss%i es%i a%i t%X",vertex, move_delta[i_v].x,mov
e_delta[i_v].y, move_delta[i_v].z,move_delta[i_v].p, move_parms[i_v].sta
rt_speed,move_parms[i_v].end_speed,move_parms[i_v].acc_2, move_delta[i_
v].templat);fprintf(motors_stream," (%li,%li,%li)",move_position[i_v].
x, move_position[i_v].y,move_position[i_v].z);fprintf(motors_stream,"
(%.3lf,%.3lf,%.3lf)\r\n",(double)move_position[i_v].x*inches_per_step
[0],(double)move_position[i_v].y*inches_per_step[1],(double)move_positio
n[i_v].z*inches_per_step[2],i_v = move_parms[i_v].next;}}i_v = move_parm
s[1].next;_disable(); /* 持続期間中割込みをキルする */// 移動
のリストを実行するfor(vertex=1; vertex<=vertex_count; vertex++){maximum
delta = (signed long)move_delta[i_v].max;delta_x_h = (signed long)abs(mo
ve_delta[i_v].x);delta_y_h = (signed long)abs(move_delta[i_v].y);delta_z
_h = (signed long)abs(move_delta[i_v].z);delta_p_h = (signed long)abs(mo
ve_delta[i_v].p);x_steps_taken = 0;y_steps_taken = 0;z_steps_taken = 0;p
_steps_taken = 0;direction_template = move_delta[i_v].templat;// acc = -
1 減速、0慣性運動、1加速acc = move_parms[i_v].acc - 2;speed_index = mo
ve_parms[i_v].start_speed;for(i=1;i<=maximum_delta;i++){x_step=( (i*delt
a_x_h > maximum_delta*x_steps_taken)? 1: 0 );y_step=( (i*delta_y_h > max
imum_delta*y_steps_taken)? 1: 0 );z_step=( (i*delta_z_h > maximum_delta*
z_steps_taken)? 1: 0 );p_step=( (i*delta_p_h > maximum_delta*p_steps_tak
en)? 1: 0 );temporary_mask = (x_step*x_pulse_mask)|(y_step*y_pulse_mas
k)|(z_step*z_pulse_mask)|(p_step*p_pulse_mask);/* 方向テンプレートをセ
ットする */outp(io_address, direction_template);next_step:loop_count =
no_op[speed_index] -((i==1)? outer_calculation_delay: inner_calculation_
delay);for(i_loop=loop_count; i_loop!=0; i_loop--);/* 少なくとも1台のモ
ータにパルスを送る */outp(io_address,temporary_mask|direction_templat
e);// 入出力ポートを回復させるfor(i_loop=9; i_loop!=0; i_loop--);outp(io
_address,direction_template);for(i_loop=9; i_loop!=0; i_loop--);if((limi
t_switches=inp(io_address))>limit_test)if(limit_recovery()) goto limit_r
eached;x_steps_taken += (signed long)x_step;y_steps_taken += (signed lon
g)y_step;z_steps_taken += (signed long)z_step;p_steps_taken += (signed l
ong)p_step;speed_index += acc;}x_stage += (long signed)move_delta[i_v].
x;y_stage += (long signed)move_delta[i_v].y;z_stage += (long signed)move
_delta[i_v].z;next_vertex:i_v = move_parms[i_v].next;}_enable();
/* 割込み処理を復元する */delay_counter=0;while(delay_counter<settli
ng_time){delay_counter += 40000;for(i_loop=40000; i_loop!=0; i_loop--);}
stage_position[0] = (double)x_stage*inches_per_step[0];stage_position[1]
= (double)y_stage*inches_per_step[1];stage_position[2] = (double)z_stag
e*inches_per_step[2];return 0;limit_reached:x_stage += (x_requested>x_st
age)? x_steps_taken: (-x_steps_taken);y_stage += (y_requested>y_stage)?
y_steps_taken: (-y_steps_taken);z_stage += (z_requested>z_stage)? z_step
s_taken: (-z_steps_taken);if(limit_recovery())cprintf(" 回復不能な限界条
件。");return limit_switches;}// limit_recovery() は、ステージを機械式限
界スイッチから外すために呼び出// す。スイッチのトリップに基づいて、モー
タ方向マスクとパルス・マスクがセ// ットされる。タイムアウトまであるいは
限界がトリップ解除されるまでステー// ジは移動される。大域 x_stage, y_sta
ge, z_stage と stage_position[] が// 更新される。Short unsigned limit_re
covery( void ){short unsigned register i_loop;long signed timeout, j;uns
igned short direction_template, pulse_mask;if(limit_flag) return 0;for(t
imeout=0; timeout < limit_timeout; timeout++){direction_template = dio_t
emplate;pulse_mask = 0;if(limit_switches & x_plus_limit){direction_templ
ate |= x_minus_mask;pulse_mask |= x_pulse_mask;x_stage -= 1;}elseif(li
mit_switches & x_minus_limit){direction_template |= x_plus_mask;pulse_m
ask |= x_pulse_mask;x_stage += 1;}if(limit_switches & y_plus_limit){dir
ection_template |= y_minus_mask;pulse_mask |= y_pulse_mask;y_stage -=
1;}elseif(limit_switches & y_minus_limit){direction_template |= y_plus_
mask;pulse_mask |= y_pulse_mask;y_stage += 1;}if(limit_switches & z_plu
s_limit){direction_template |= z_minus_mask;pulse_mask |= z_pulse_mas
k;z_stage -= 1;}elseif(limit_switches & z_minus_limit){direction_templat
e |= z_plus_mask;pulse_mask |= z_pulse_mask;z_stage += 1;}outp(io_addr
ess,direction_template);for(i_loop=5; i_loop!=0; i_loop--);outp(io_addre
ss,direction_template|pulse_mask);for(i_loop=5; i_loop!=0; i_loop--);ou
tp(io_address,direction_template);for(i_loop=no_op[0]; i_loop!=0; i_loop
--);limit_switches = inp(io_address);if(limit_switches <= limit_test) br
eak;}stage_position[0] = (double)x_stage*inches_per_step[0];stage_positi
on[1] = (double)y_stage*inches_per_step[1];stage_position[2] = (double)z
_stage*inches_per_step[2];if(limit_switches > limit_test)return 1;return
0;}void squirt( int profile ){short unsigned pump_no_op;short unsigned
register i_loop;short unsigned direction_template;long signed i, j, step
s;static long signed i_ramp_limit;/* profile = 0 = ramp_up_and_down *//*
profile = 1 = ramp_up *//* profile = 2 = run *//* profile = 3 = ramp_do
wn *//* ポンピング用の正しいステップ・カウント */steps = 1000;direction_
template = dio_template + p_plus_mask;for(i=1; i<steps; i++){outp(io_add
ress,direction_template);if((i<max_ramp_steps)&&(2*i<steps)&&((profile==
ramp_up_and_down)||(profile==ramp_up))){pump_no_op = no_op[i];i_ramp_l
imit = i;goto next_step;} /* ランプダウン */if((( /* run_r
amp_cycles に達する最初のケース */((i+max_ramp_steps)>steps)&&((2*max_ra
mp_steps)<=steps))||(2*(i+1)>steps))&& /* 限界に達しない第2のケー
ス */((profile==ramp_up_and_down)||(profile==ramp_down))){pump_no_op =
no_op[steps-i-1];goto next_step;}/* 全速 */pump_no_op = no_op[i_ramp_li
mit];t_step:for(i_loop=pump_no_op; i_loop!=0; i_loop--);outp(io_address,
direction_template+p_pulse_mask);for(i_loop=5; i_loop!=0; i_loop--);outp
(io_address,direction_template);}return;}/* no-op アレイを初期設定する、
12/92 記事参照 */t set_up_no_op( void ){double a, t, velocity;int return
value;signed short i;/* a は一時的変数であり、tan (最大許容角) */a = po
w(acceleration_peak*G*inches_per_step[0],0.5)/velocity_maximum;return_va
lue = 0;t = 0.;no_op[0] = (signed short)max_loop_count;no_op[1] = (signe
d short)max_loop_count;if(debug_ramp){fprintf(ramp_stream,"turn angle at
highest speed is %1f\r",180./pi*atan(a));fprintf(ramp_stream,"start lo
op count is %i\r",no_op[0]);fprintf(ramp_stream,"start velocity is %1f
\r",velocity_minimum);fprintf(ramp_stream,"acceleration time is %1f\
r",acceleration_time);fprintf(ramp_stream,"io call rate is %1f\r\r",io
_call_rate);fprintf(ramp_stream,"time, velocity, count, index\r");}for
(i=2; i<=(long signed)max_ramp_length; i++){t += (double)no_op[i-1]/io_c
all_rate; /* seconds */velocity = velocity_minimum +(velocity_maximum -
velocity_minimum)*(1. - exp(-t/acceleration_time));no_op[i] = (short si
gned)(inches_per_step[0]*io_call_rate/velocity);if(debug_ramp)fprintf(ra
mp_stream,"%1f %f %i %i\r\n",t, velocity, no_op[i], i);max_ramp_steps
= i; /* 全速に循環する */if(no_op[i]<=min_loop_count) break;}// ア
レイの残り部分を記入するfor(i=max_ramp_steps; i<=(long signed)max_ramp_l
ength; i++)no_op[i] =min_loop_count;if(outer_calculation_delay>(min_loop
_count+2)){printf("Calculation delay > minimum step time.\n");return 1
3;}if(max_ramp_steps>(short unsigned)(max_ramp_length-2)){printf("Warnin
g: ramp step memory limit reached.\n");min_loop_count = no_op[max_ramp_
steps];return_value += 2;}printf("Min and Max x speeds are %1f and %1f i
nches persecond.\n", velocity_minimum, velocity_maximum);return_value +
= 1;if(debug_ramp)fpringf(ramp_stream,"run ramp cycles is %i\r",max_ram
p_steps);make_speed_table();return return_value;}// no_op アレイのセット
アップ後、頂点速度を設定するためのルックアップ// ・テーブルを初期設定で
きるvoid make_speed_table( void ){double tau, cos_angle, delay;short sig
ned k, n, i, j, m;tau = sqrt((sqrt(2.)*inches_per_step[0])/(G*accelerati
on_peak));for(k=1; k<8197; k++){cos_angle = 1. - 2./(double)k;delay = ta
u*pow((1.-cos_angle),0.25);n = (short signed)(delay*io_call_rate);if(n>m
ax_loop_count) n = max_loop_count;if(n<min_loop_count) n = min_loop_coun
t;// 適当な no_op インデックスを求めて探索するi = max_ramp_length >> 1;j
= i >> 1;for(m=0; m<13; m++){if(n>=(no_op[i]))i -= j;elsei += j;j = j >
> 1;}if(n>no_op[i]) i--;speed_table[k] = i;if(debug_ramp)fprintf(ramp_st
ream,"For cos_angle &1f velocity index is%i\r\n", cos_angle, i);}speed
_table[0] = 1;return;}void dumb_parms( FILE *stream ){short signed i, j;
i = 1;for(j=1; j<=vertex_count; j++){i = move_parms[i].next;fprintf(stre
am,"v%i x%i y%i z%i p%i ss%i es%i a%i t%X",i, move_delta[i].x,move_delta
[i].y, move_delta[i].z,move_delta[i].p, move_parms[i].start_speed,move_p
arms[i].end_speed,move_parms[i].acc-2, move_delta[i].templat);fprintf(st
ream,"lt%i mx%i (%li, %li, %li)\r\n",move_parms[i].left_tested, move_d
elta[i].max,move_position[i].x, move_position[i].y,move_position[i].z);f
printf(stream,"last%i next%i flow%i phant%i insp%i",move_parms[i].last,
move_parms[i].next,move_parms[i].flow, move_parms[i].phantom,move_parms
[i].inspect);fprintf(stream," (%.3lf,%.3lf,%.3lf)\r\n",(double)move_p
osition[i].x*inches_per_step[0],(double)move_position[i].y*inches_per_st
ep[0],(double)move_position[i].z*inches_per_step[0],}}// エネーブルされ
た場合、この検査ルーチンは、haul() に置き換わる。// 下記の場合を除き、モ
ータにステップを失わせることになるあらゆるケースを// 見つけるべきであ
る:// 初期頂点速度の計算が誤っている// ランプ加速が誤っている//
雑音またはその他の電子的機械的問題// 注:ヒステリシス補正を加えるとき
は、検査合計ならびに move_position と// move_delta の比較をディスエーブ
ルすべきである。void data_checker( void ){signed long x_steps_taken, y_s
teps_taken, j;signed long vertex_x_steps, vertex_y_steps, vertex_z_spte
s,vertex_p_steps;signed short z_steps_taken, p_steps_taken;signed short
x_step, y_step z_step, p_step;short signed i, h, mx, vertex;char dump_ve
rtex;fprintf(checker_stream,"Layer %li checking set of %ivertices.\r\
n", layer_count, vertex_count);vertex_x_steps = 0;vertex_y_steps = 0;ver
tex_z_steps = 0;vertex_p_steps = 0;i = move_parms[1].next;for(vertex=1;
vertex<=vertex_count; vertex++){dump_vertex = 0;h = i;i = move_parms[h].
next;// 各軸における変化が絶対位置を反映しているか?if( (((long signed)m
ove_delta[i].x + move_position[h].x)!=move_position[i].x)||(((long sig
ned)move_delta[i].y + move_position[h].y)!=move_position[i].y)||(((lon
g signed)move_delta[i].z + move_position[h].z)!=move_position[i].z) )-{f
printf(checker_stream," old (x,y,z) + deltas != new(x,y,z)\r\n");dump_
vertex = 1;}// これは無視できる移動か?if((!move_delta[i].max)&&(move_pa
ms[i].end_speed>2)){fprintf(checker_stream," zero length move\r\n");du
mp_vertex = 1;}// h の最終速度が i の開始速度と一致するか?if(move_parms
[i].start_speed !=move_parms[h].end_speed){fprintf(checker_stream," old
end speed !=new start speed\r\n");dump_vertex = 1;}// i の最大値が何れ
かの軸に沿った最大ステップと本当に等しいか?mx = abs(move_delta[i].x);mx
= (abs(move_delta[i].y)>mx)? abs(move_delta[i].y): mx;mx = (abs(move_de
lta[i].z)>mx)? abs(move_delta[i].z): mx;mx = (abs(move_delta[i].p)>mx)?
abs(move_delta[i].p): mx;if(mx != move_delta[i].max){fprintf(checker_str
eam," maximum not a true maximum\r\n");dump_vertex = 1;}// 最大値が最
長許容線分より大きいか?if(move_delta[i].max>segment_limit){fprintf(chec
ker_stream," segment too long. Limit is %i\r\n",segment_limit);dump_v
ertex = 1;}// i の開始速度 + acc.*max = i の最終速度か?if((move_parms
[i].start_speed +(move_parms[i].acc-2)*move_delta[i].max) !=move_parms
[i].end_speed){fprintf(checker_stream," can't accel from start to end\r
\n");dump_vertex = 1;}// 加速が 1, 2, 3 以外か?if((move_parms[i].acc<
1)||(move_parms[i].acc>3)){fprintf(checker_stream," illegal accelerati
on\r\n");dump_vertex = 1;}// 速度は限界内か?if((move_parms[i].end_spe
ed>max_ramp_steps){fprintf(checker_stream," excessive velocity\r\n");d
ump_vertex = 1;}// アレイ・サイズは限界内か?if(i>max_M){fprintf(checker
_stream," array out of range.%i should be %i\r\n", i, max_M);dump_vert
ex = 1;}// 何かの問題が検出された場合、その頂点をダンプアウトするif(dump
_vertex){fprintf(checker_stream," Vertex %i, location %i, next %i,last %
i\r\n", vertex, i, move_parms[i].next, h);fprintf(checker_stream," (d
x,dy,dz,dp)(%i,%i,%i,%i)max=%i\r\n",move_delta[i].x, move_delta[i].y,
move_delta[i].z,move_delta[i].p, move_delta[i].max);fprintf(checker_stre
am," start %i end %i acc %i temp%x\r\n",move_parms[i].start_speed,
move_parms[i].end_speed,move_parms[i].acc-2, move_delta[i].templat);fpri
ntf(checker_stream," left tested%i position(%li,%li,%li)\r\n,move_parm
s[i].left_tested,move_position[i].x, move_positon[i].y,move_position[i].
z);fprintf(checker_stream," flow %i phantom %i inspect %i",move_parms
[i].flow, move_parms[i].phantom,move_parms[i].inspect);fprintf(checker_s
tream," and position in inches=(%.3lf,%.3lf,%.3lf)\r\n",(double)move_p
osition[i].x*inches_per_step[0],(double)move_position[i].y*inches_per_st
ep[0],(double)move_position[i].z*inches_per_step[0]);}x_steps_taken = 0;
y_steps_taken = 0;z_steps_taken = 0;p_steps_taken = 0;// 正しい数のステ
ップが実際にとられたかどうか検査する// 各軸について累計検査合計を行うfor
(j=1;j<=move_delta[i].max;j++){x_step=((j*(signed long)abs(move_delta
[i].x))> ((signed long)move_delta[i].max*x_steps_taken))? 1: 0;y_step=
((j*(signed long)abs(move_delta[i].y))> ((signed long)move_delta[i].max*
y_steps_taken))? 1: 0;z_step=((j*(signed long)abs(move_delta[i].z))> ((s
igned long)move_delta[i].max*z_steps_taken))? 1: 0;p_step=((j*(signed lo
ng)abs(move_delta[i].p))> ((signed long)move_delta[i].max*p_steps_take
n))? 1: 0;x_steps_taken += (signed long)x_step;y_steps_taken += (signed
long)y_step;z_steps_taken += (signed long)z_step;p_steps_taken += (signe
d long)p_step;vertex_x_steps += (move_delta[i].x>0)? x_step: -x_step;ver
tex_y_steps += (move_delta[i].y>0)? y_step: -y_step;vertex_z_steps += (m
ove_delta[i].z>0)? z_step: -z_step;vertex_p_steps += (move_delta[i].p>0)
? p_step: -p_step;}if((long signed)abs(move_delta[i].x)!=x_steps_taken)f
printf(checker_stream,"Vertex %i: |dx|=%i, was actually%i\r\n", i, a
bs(move_delta[i].x), x_steps_taken);if((long signed)abs(move_delta[i].y)
!=y_steps_taken)fprintf(checker_stream,"Vertex %i: |dy|=%i, was actual
ly%i\r\n", i, abs(move_delta[i].y), y_steps_taken);if((long signed)abs
(move_delta[i].z)!=z_steps_taken)fprintf(checker_stream,"Vertex %i: |dz
|=%i, was actually%i\r\n", i, abs(move_delta[i].z), z_steps_taken);if
((long signed)abs(move_delta[i].p)!=p_steps_taken)fprintf(checker_strea
m,"Vertex %i: |dp|=%i, was actually%i\r\n", i, abs(move_delta[i].p),
p_steps_taken);}if( ((move_position[1].x + vertex_x_steps)!=move_positi
on[i].x) ||((move_position[1].y + vertex_y_steps)!=move_position[i].y)
||((move_position[1].z + vertex_z_steps)!=move_position[i].z) ){fprin
tf(checker_stream," move check sum error\r\n");fprintf(checker_strea
m," expected (%li,%li,%li),got (%li,%li,%li)\r\n",move_position[i].x,
move_position[i].y, move_position[i].z,move_position[1].x + vertex_x_ste
ps,move_position[1].y + vertex_y_steps,move_position[1].z + vertex_z_ste
ps,}return;}
【図面の簡単な説明】
【図1】本発明による製造ツールを位置決めするロボッ
トを含む高速プロトタイプ作成システムの構成図であ
る。
【図2】本発明の他の実施例の構成図である。
【図3】本発明で使用する速度決定技術を示す図であ
る。
【図4】複数の頂点を含む、ロボット用の所望の軌道の
例を示す図である。
【図5】計算された頂点速度をプロットしたグラフであ
る。
【図6】ステッパ・モータのトルク曲線を示すグラフで
ある。
【図7】図6のトルク曲線の速度プロフィルを示すグラ
フである。
【図8】速度インデックスを走行長さに対してプロット
したグラフである。
【図9】図11及び12の流れ図の1ステップを適用し
た後の、速度インデックスを走行長さに対してプロット
した、改訂後のグラフである。
【図10】図11及び12の流れ図に従って頂点を追加
した後の速度インデックスを走行長さに対してプロット
した、別の改訂後のグラフである。
【図11】本発明の現在好ましい方法を示す流れ図であ
る。
【図12】本発明の現在好ましい方法を示す流れ図であ
る。
【符号の説明】
1 ロボット 10 高速プロトタイプ作成システム 12 実施例時間制御装置 14 ツール 15 ポンプ 16 ビード

Claims (17)

    【特許請求の範囲】
  1. 【請求項1】それぞれn次元空間(nは2以上)内のあ
    る位置を定義する座標を有する複数の頂点によって定義
    される、n次元空間中の所定の軌道に沿って、複数のモ
    ータによってある物体を駆動するのに要する時間を減ら
    す方法であって、 それぞれ少なくとも1個の他の頂点から1本の線分によ
    って分離された所望の軌道を定義する1組の頂点を提供
    するステップと、 各頂点について、その頂点に対応する軌道上の1点を通
    って物体を並進運動させながら支持できる最大速度を決
    定するステップと、 必要な場合、物体をどの頂点でも最大速度を越えずに最
    短時間で軌道を通過させる、軌道に沿った速度プロフィ
    ルが達成されるように、頂点リストを修正するステップ
    と、 修正済み頂点リストをモータ駆動位置に変換して、複数
    のモータに修正済み頂点リストに従って物体を並進運動
    させるステップと、 を含む方法。
  2. 【請求項2】モータが、駆動信号パルスに応答してステ
    ップ距離dを移動するステッパ・モータであり、軌道上
    の1点を通って物体を頂点i−1からiを経てi+1に
    並進移動させると角度θiの偏向が生じ、cosθiの値を
    使って、最高速の移動を有する軸に関連するステッパ・
    モータについて駆動信号パルス間の遅延時間を決定する
    ことを特徴とする、請求項1に記載の方法。
  3. 【請求項3】前記修正ステップが、 所望の軌道に対応する走行長にわたって、ステッパ・モ
    ータの動的特性に従って速度プロフィルを決定するステ
    ップと、 頂点対間の最大加速及び最大減速の作用をテストして、
    得られる速度がその対の1つの頂点で決定された最大速
    度を越えるかどうか判定するステップと、 頂点間で最大加速及び最大減速を使用できるように頂点
    の速度を調節し、必要ならばその対の頂点間に1つまた
    は複数の中間頂点を挿入するステップと、 を含むことを特徴とする、請求項2に記載の方法。
  4. 【請求項4】動的特性がトルクであることを特徴とす
    る、請求項3に記載の方法。
  5. 【請求項5】それぞれn次元空間(nは2以上)内のあ
    る位置を定義する座標を有し、他の少なくとも1つの頂
    点から1本の線分によって分離された頂点のリストによ
    って定義される、n次元空間中の所定の軌道に沿って、
    複数のモータによってある物体を駆動するのに要する時
    間を減らす方法であって、(a)物体がある線分から次
    の線分に駆動される際に方向を変えるとき、各頂点ごと
    に維持できる最大速度を決定するステップと、(b)最
    大速度の昇順に頂点をソートするステップと、(c)最
    低速の頂点と軌道中の次の頂点とからなる頂点の対を検
    査するステップと、 次の頂点における決定された最大速度が、最低速の頂点
    からできるだけ速やかに加速することによって丁度達成
    されることが判明した場合に、(d)次の頂点における
    決定された最大速度を、正しいものとマークするステッ
    プと、 次の頂点における決定された最大速度が、決定された最
    大速度より大きいことが判明した場合に、(e)次の頂
    点の最大速度を、最低速の頂点からできるだけ速やかに
    加速することによって達成される値に減少させるステッ
    プと、(f)次の頂点における減少後の最大速度を、正
    しいものとマークするステップと、 次の頂点における決定された最大速度が、決定された最
    大速度より低いことが判明した場合に、(g)次の頂点
    を、後で少なくとも1つの中間頂点を追加すべきものと
    マークするステップと、(h)最低速の頂点と軌道中の
    前の頂点とからなる頂点の対を検査するステップと、 最低速の頂点における決定された最大速度が、前の頂点
    から最低速の頂点へできるだけ速やかに減速することに
    よって丁度達成されることが判明した場合に、(i)前
    の頂点における最大速度を、正しいものとマークするス
    テップと、 前の頂点における決定された最大速度が、決定された最
    大速度よりも大きいことが判明した場合に、(j)前の
    頂点の最大速度を、前の頂点から最低速の頂点へできる
    だけ速やかに減速することによって達成される値に減少
    させるステップと、(k)前の頂点の減少後の最大速度
    を、正しいものとマークするステップと、 前の頂点における決定された最大速度が、決定された最
    大速度より低いことが判明した場合に、(l)前の頂点
    を、後で少なくとも1つの中間頂点を追加すべきものと
    マークするステップと、(m)最大速度が最低の頂点を
    頂点リストから除去するステップと、(n)すべての頂
    点対が検査を終えたかどうか判定するステップと、
    (o)ステップ(n)でノーの場合、ステップ(b)か
    ら(n)までを繰り返すステップと、(p)ステップ
    (n)でイエスの場合、前に頂点を追加すべきものとマ
    ークした各頂点対の間に少なくとも1つの中間頂点を追
    加するステップと、(q)得られた頂点リストの各頂点
    で指示された速度を達成するように物体を軌道に沿って
    駆動させるため、得られた頂点リストからモータ制御信
    号のシーケンスを決定するステップと、 を含む方法。
  6. 【請求項6】モータがステッパ・モータであり、ステッ
    プ(q)で、頂点対の第1の頂点からの完全加速及び頂
    点対の第2の頂点への完全減速により、その頂点対を連
    結する線分上で、加速速度と減速速度が同じで、両方の
    頂点からの整数のステッパ・データ・ステップ数であ
    り、交点での速度が最大許容速度より小さくなる位置が
    得られる場合に、単一の頂点を追加することを特徴とす
    る、請求項5に記載の方法。
  7. 【請求項7】頂点対間の線分に沿った完全加速とその後
    に続く完全減速により速度が最大許容速度に達する場合
    に、ステップ(q)で、速度が最初に最大許容速度に達
    する線分上の点に第1の頂点を追加し、完全加速の結
    果、第2の頂点が決定された最大速度に達する線分上の
    点に第2の頂点を追加することを特徴とする、請求項5
    に記載の方法。
  8. 【請求項8】データがステッパ・モータであり、完全加
    速ランプと完全減速ランプが非整数のステッパ・モータ
    ・ステップ数で交差する場合に、ステップ(q)で、加
    速さも減速さももたらさない1つのステッパ・モータ・
    ステップで互いに分離された、線分上の2個の頂点を追
    加することを特徴とする、請求項7に記載の方法。
  9. 【請求項9】ステップ(b)がヒープ・ソートによって
    実施されることを特徴とする、請求項5に記載の方法。
  10. 【請求項10】モータがステッパ・モータであり、軌道
    上の1点を通って物体を頂点i−1からiを経てi+1
    に並進運動させると、角度θiの偏向が生じ、ステップ
    (a)でcosθiの値を使って、頂点iについての最大速
    度を決定することを特徴とする、請求項5に記載の方
    法。
  11. 【請求項11】それぞれn次元空間(nは2以上)内の
    ある位置を定義する座標を有する複数の頂点によって定
    義される、n次元空間中の所定の軌道に沿って、ある物
    体を制御可能に位置決めするための複数のモータを有す
    る多軸ロボット・システムであって、 それぞれ他の少なくとも1つの頂点から1本の線分によ
    って分離された、所望の軌道を定義する1組の頂点を事
    前処理する手段を備え、前記事前処理手段が、 各頂点について、その頂点に対応する軌道上の1点を通
    って物体を並進運動させながら支持できる最大速度を決
    定する手段と、 必要な場合、物体をどの頂点でも最大速度を越えずに最
    短時間で軌道を通過させる、軌道に沿った速度プロフィ
    ルが達成されるように、頂点リストを修正する手段と、 修正済み頂点リストをモータ駆動信号に変換して、複数
    のモータに修正済み頂点リストに従って物体を並進運動
    させる手段と、 を含むロボット・システム。
  12. 【請求項12】モータが、駆動信号パルスに応答してス
    テップ距離dを移動するステッパ・モータであり、軌道
    上の1点を通って物体を頂点i−1からiを経てi+1
    に並進移動させると角度θiの偏向が生じ、前記決定手
    段が、最高速の移動を有する軸に関連するステッパ・モ
    ータについて駆動位置パルス間の遅延時間に決定するた
    めに使用されるcosθiの値を決定する手段を含むことを
    特徴とする、請求項11に記載のロボット・システム。
  13. 【請求項13】前記修正手段が、 所望の軌道に対応する走行長にわたって、ステッパ・モ
    ータの動的特性に従って速度プロフィルを決定する手段
    と、 頂点対間の最大加速及び最大減速の作用をテストして、
    得られる速度がその対の1つの頂点で決定された最大速
    度を越えるかどうか判定する手段と、 前記テスト手段の動作に応答して、頂点間で最大加速及
    び最大減速を使用できるように頂点の速度を調節し、必
    要ならばその対の頂点間に1つまたは複数の中間頂点を
    挿入する手段とを備えることを特徴とする、請求項12
    に記載のロボット・システム。
  14. 【請求項14】動的特性がトルクであることを特徴とす
    る、請求項13に記載のロボット・システム。
  15. 【請求項15】物体が3次元構造を製作するためのツー
    ルであり、頂点リストが3次元構造の少なくとも一部分
    を定義することを特徴とする、請求項11に記載のロボ
    ット・システム。
  16. 【請求項16】製作ツールが、軌道に沿って射出物のビ
    ードを押し出すための押出しノズルであることを特徴と
    する、請求項15に記載のロボット・システム。
  17. 【請求項17】さらに、前記モータのそれぞれに関連す
    るフィードバック・センサ手段と、前記フィードバック
    ・センサ手段に応答して、前記モータのうちの1つまた
    は複数を、位置決め誤差を補償するように制御可能に再
    位置決めする手段とを備えることを特徴とする、請求項
    11に記載のロボット・システム。
JP6165516A 1993-09-09 1994-07-18 物体駆動時間低減方法及び多軸ロボット・システム Expired - Fee Related JP2801528B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US119260 1993-09-09
US08/119,260 US5426722A (en) 1993-09-09 1993-09-09 Method for optimizing the motion of a multi-axis robot

Publications (2)

Publication Number Publication Date
JPH0784628A true JPH0784628A (ja) 1995-03-31
JP2801528B2 JP2801528B2 (ja) 1998-09-21

Family

ID=22383419

Family Applications (1)

Application Number Title Priority Date Filing Date
JP6165516A Expired - Fee Related JP2801528B2 (ja) 1993-09-09 1994-07-18 物体駆動時間低減方法及び多軸ロボット・システム

Country Status (4)

Country Link
US (1) US5426722A (ja)
EP (1) EP0642893B1 (ja)
JP (1) JP2801528B2 (ja)
DE (1) DE69417323T2 (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20200108351A (ko) * 2018-02-05 2020-09-17 크리에이트 아이티 리얼 에이피에스 3d 물체 인쇄용 프린터
JP2021144444A (ja) * 2020-03-11 2021-09-24 オムロン株式会社 制御装置、方法およびプログラム
CN116572257A (zh) * 2023-07-13 2023-08-11 湖南尖山智能科技有限责任公司 机械臂控制方法、装置、系统、存储介质及机械臂

Families Citing this family (66)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07261821A (ja) * 1994-03-16 1995-10-13 Fanuc Ltd 負荷による撓みを考慮したロボット軌道計画方法
US5740327A (en) * 1994-12-27 1998-04-14 Nec Corporation Method of and apparatus for robot tip trajectory control
DE19600882C1 (de) * 1996-01-12 1997-09-04 Heesemann Juergen Verfahren zur dezentralen Steuerung eines Motorantriebs
US6853877B1 (en) 1996-09-06 2005-02-08 Nomadic Technologies Method and apparatus for mobile robot motion control
US6073056A (en) * 1997-04-08 2000-06-06 Larry J. Winget Method and system for building a data model of a physical part in a data format useful for and reproduction of the part
IL121458A0 (en) * 1997-08-03 1998-02-08 Lipsker Daniel Rapid prototyping
US5920679A (en) * 1997-08-25 1999-07-06 The Research Foundation Of State University Of New York Apparatus and method for computer-aided low-harmonic trajectory planning for computer-controlled machinery
US6358453B1 (en) 1998-04-09 2002-03-19 Prosthetic Design, Inc. Modular distal plate for rapid manufacturing of a prosthetic limb socket
US6212968B1 (en) * 1998-07-29 2001-04-10 Janome Sewing Machine Co., Ltd, SCARA robot
US6028410A (en) * 1999-01-11 2000-02-22 Stratasys, Inc. Resonance detection and resolution
US6054077A (en) * 1999-01-11 2000-04-25 Stratasys, Inc. Velocity profiling in an extrusion apparatus
DE19930087C5 (de) * 1999-06-30 2011-12-01 Inos Automationssoftware Gmbh Verfahren und Vorrichtung zur Regelung der Vorhalteposition eines Manipulators eines Handhabungsgeräts
DE19944607A1 (de) * 1999-09-17 2001-03-22 Isg Ind Steuerungstechnik Gmbh Satzübergreifende Geschwindigkeitsführung bei einer numerisch gesteuerten Werkzeugmaschine oder einem Roboter
EP1226019B1 (en) 1999-11-05 2004-03-03 Z Corporation Methods of three-dimensional printing
US8806319B1 (en) * 2000-04-12 2014-08-12 Ptc Inc. Method and apparatus for linking non-geometric data to geometric elements of a CAD file independent of the proprietary CAD file format
US6901681B2 (en) * 2001-11-05 2005-06-07 Chrispatrick A. Bueno Siding installation tool, kit and method
US7437201B2 (en) * 2003-01-14 2008-10-14 Cullen Christopher P Electric motor controller
US7776529B2 (en) * 2003-12-05 2010-08-17 Life Technologies Corporation Methine-substituted cyanine dye compounds
KR100586994B1 (ko) * 2004-09-07 2006-06-08 삼성전자주식회사 로봇제어장치 및 그 제어방법
US7236166B2 (en) * 2005-01-18 2007-06-26 Stratasys, Inc. High-resolution rapid manufacturing
JP5306811B2 (ja) * 2005-05-11 2013-10-02 ライフ テクノロジーズ コーポレーション 2本鎖dnaへの高い選択性を有する蛍光化学物質及びそれらの使用
US7369917B2 (en) * 2006-01-17 2008-05-06 National Instruments Corporation System and method for automatic sorting of elements in drawing specifications for efficient tracing using motion control
US7403833B2 (en) * 2006-04-03 2008-07-22 Stratasys, Inc. Method for optimizing spatial orientations of computer-aided design models
US7680555B2 (en) * 2006-04-03 2010-03-16 Stratasys, Inc. Auto tip calibration in an extrusion apparatus
DE102006028327B3 (de) 2006-06-20 2008-01-31 Siemens Ag Robotergesteuerte Aufzeichnungsvorrichtung, insbesondere für die Aufzeichnung von Röntgenbilddaten, sowie zugehöriges Verfahren
US20080006966A1 (en) * 2006-07-07 2008-01-10 Stratasys, Inc. Method for building three-dimensional objects containing metal parts
WO2008073297A2 (en) 2006-12-08 2008-06-19 Z Corporation Three dimensional printing material system and method using peroxide cure
US8167999B2 (en) 2007-01-10 2012-05-01 3D Systems, Inc. Three-dimensional printing material system with improved color, article performance, and ease of use
US7968626B2 (en) 2007-02-22 2011-06-28 Z Corporation Three dimensional printing material system and method using plasticizer-assisted sintering
US8050786B2 (en) * 2007-07-11 2011-11-01 Stratasys, Inc. Method for building three-dimensional objects with thin wall regions
US8858856B2 (en) 2008-01-08 2014-10-14 Stratasys, Inc. Method for building and using three-dimensional objects containing embedded identification-tag inserts
US7917243B2 (en) * 2008-01-08 2011-03-29 Stratasys, Inc. Method for building three-dimensional objects containing embedded inserts
US8070473B2 (en) * 2008-01-08 2011-12-06 Stratasys, Inc. System for building three-dimensional objects containing embedded inserts, and method of use thereof
US20090192644A1 (en) * 2008-01-30 2009-07-30 Meyer Thomas J Method and system for manufacturing an article using portable hand-held tools
US8442661B1 (en) * 2008-11-25 2013-05-14 Anybots 2.0, Inc. Remotely controlled self-balancing robot including a stabilized laser pointer
US8095491B1 (en) * 2008-12-08 2012-01-10 The United States Of America As Represented By The Secretary Of The Navy Optimization technique using heap sort
KR101689793B1 (ko) * 2010-01-25 2017-01-09 삼성전자 주식회사 모터 제어장치 및 모터 제어 방법
WO2011112760A2 (en) * 2010-03-11 2011-09-15 Stratasys, Inc. Optical encoder
US8926484B1 (en) 2010-03-29 2015-01-06 Stratasys, Inc. Head tool changer for use with deposition-based digital manufacturing systems
US8788096B1 (en) 2010-05-17 2014-07-22 Anybots 2.0, Inc. Self-balancing robot having a shaft-mounted head
US8419996B2 (en) 2010-12-22 2013-04-16 Stratasys, Inc. Print head assembly for use in fused deposition modeling system
US8663533B2 (en) 2010-12-22 2014-03-04 Stratasys, Inc. Method of using print head assembly in fused deposition modeling system
US9238329B2 (en) 2010-12-22 2016-01-19 Stratasys, Inc. Voice coil mechanism for use in additive manufacturing system
US8465111B2 (en) 2010-12-22 2013-06-18 Stratasys, Inc. Print head for use in fused deposition modeling system
US8647102B2 (en) 2010-12-22 2014-02-11 Stratasys, Inc. Print head assembly and print head for use in fused deposition modeling system
US9108360B2 (en) 2011-09-23 2015-08-18 Stratasys, Inc. Gantry assembly for use in additive manufacturing system
US9050788B2 (en) 2011-12-22 2015-06-09 Stratasys, Inc. Universal adapter for consumable assembly used with additive manufacturing system
US9073263B2 (en) 2011-12-22 2015-07-07 Stratasys, Inc. Spool assembly for additive manufacturing system, and methods of manufacture and use thereof
US8985497B2 (en) 2011-12-22 2015-03-24 Stratasys, Inc. Consumable assembly with payout tube for additive manufacturing system
US9321608B2 (en) 2011-12-22 2016-04-26 Stratasys, Inc. Spool assembly with locking mechanism for additive manufacturing system, and methods of use thereof
HUP1200012A2 (en) 2012-01-05 2013-07-29 Pazmany Peter Katolikus Egyetem Traction mechanism
US9205690B2 (en) 2012-03-16 2015-12-08 Stratasys, Inc. Automated calibration method for additive manufacturing system, and method of use thereof
US9364986B1 (en) 2012-05-22 2016-06-14 Rapid Prototype and Manufacturing LLC Method for three-dimensional manufacturing and high density articles produced thereby
US11110648B2 (en) * 2012-07-31 2021-09-07 Makerbot Industries, Llc Build material switching
US9090428B2 (en) 2012-12-07 2015-07-28 Stratasys, Inc. Coil assembly having permeable hub
EP3037903A1 (de) * 2014-12-22 2016-06-29 Siemens Aktiengesellschaft Verfahren zum Betrieb eines technischen Systems, Steuerungsvorrichtung, Computerprogrammprodukt sowie ein technisches System
JP6659238B2 (ja) * 2015-05-28 2020-03-04 ライフロボティクス株式会社 ロボット装置及びステッピングモータ制御装置
US10399326B2 (en) 2015-10-30 2019-09-03 Stratasys, Inc. In-situ part position measurement
FR3051782B1 (fr) * 2016-05-24 2018-07-06 Fmc Technologies Sa Dispositif de commande de deplacement, procede et dispositif d'acquisition et de calcul pour celui-ci, ainsi que bras articule de chargement de fluide le comportant.
US10875244B2 (en) 2017-05-17 2020-12-29 Slice Engineering LLC Adaptable high-performance extrusion head for fused filament fabrication systems
US11203156B2 (en) 2018-08-20 2021-12-21 NEXA3D Inc. Methods and systems for photo-curing photo-sensitive material for printing and other applications
AU2019377511B2 (en) 2018-11-09 2024-02-01 NEXA3D Inc. Three-dimensional printing system
CA3130312C (en) 2019-03-18 2023-08-01 NEXA3D Inc. Method and system for additive manufacture
US10967573B2 (en) 2019-04-02 2021-04-06 NEXA3D Inc. Tank assembly and components thereof for a 3D printing system
CN114296404A (zh) * 2021-12-18 2022-04-08 成都乐创自动化技术股份有限公司 一种计算五轴点胶机加工轨迹速度的方法
JP2023159641A (ja) * 2022-04-20 2023-11-01 セイコーエプソン株式会社 外部機器からの指令を用いてロボットの経路を生成する経路生成方法、及び、ロボット制御システム

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS5325779A (en) * 1976-08-23 1978-03-09 Hitachi Seiko Ltd Speed operating method in numeric control unit
JPH02137006A (ja) * 1988-11-18 1990-05-25 Mitsubishi Electric Corp 速度制御装置

Family Cites Families (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB1189959A (en) * 1965-09-03 1970-04-29 Olivetti & Co Spa Improvements in Numerical Control Devices
USRE30132E (en) * 1973-07-09 1979-10-30 Unimation, Inc. Program control system for manipulator
JPS57120112A (en) * 1980-12-22 1982-07-27 Fujitsu Ltd Locus control method of arm
US4415967A (en) * 1981-06-02 1983-11-15 Automation Industries, Inc. Multi-axis controller
US4506335A (en) * 1982-06-10 1985-03-19 Cincinnati Milacron Inc. Manipulator with controlled path motion
US4617502A (en) * 1983-06-30 1986-10-14 Hitachi, Ltd. Method and apparatus for controlling a robot hand along a predetermined path
US4623971A (en) * 1983-06-30 1986-11-18 Cincinnati Milacron Inc. Machine control with motor velocity constraint
JPH0799486B2 (ja) * 1984-04-27 1995-10-25 松下電器産業株式会社 角加速度制御方法
US4629860A (en) * 1984-10-30 1986-12-16 Lindbom Torsten H Robotic apparatus and method for automatically moving a tool through three dimensions and manually to an extended position
US4618808A (en) * 1985-01-30 1986-10-21 International Business Machines Corporation Electromagnetic actuator system using stepper motor with closed loop position sensing, electronic commutation and dynamic position and anomaly correction
US4639878A (en) * 1985-06-04 1987-01-27 Gmf Robotics Corporation Method and system for automatically determining the position and attitude of an object
US4749347A (en) * 1985-08-29 1988-06-07 Viljo Valavaara Topology fabrication apparatus
JPS6261104A (ja) * 1985-09-11 1987-03-17 Fanuc Ltd 水平関節型ロボツトの加減速制御方式
JP2580584B2 (ja) * 1986-03-07 1997-02-12 セイコーエプソン株式会社 プリンタのキヤリツジ制御方法
US4829219A (en) * 1986-11-20 1989-05-09 Unimation Inc. Multiaxis robot having improved motion control through variable acceleration/deceleration profiling
US4773025A (en) * 1986-11-20 1988-09-20 Unimation, Inc. Multiaxis robot control having curve fitted path control
US4769583A (en) * 1987-05-01 1988-09-06 General Motors Corporation Motion control system with minimum time path generation
US4843287A (en) * 1987-12-31 1989-06-27 Westinghouse Electric Corp. Path contriving system for look-ahead sensor in a robotic control system
US4925312A (en) * 1988-03-21 1990-05-15 Staubli International Ag Robot control system having adaptive feedforward torque control for improved accuracy
JP2676397B2 (ja) * 1989-01-05 1997-11-12 株式会社エイ・ティ・アール視聴覚機構研究所 動的システムの運動軌道生成方法
JP2742104B2 (ja) * 1989-08-29 1998-04-22 ファナック株式会社 数値制御装置の送り速度制御方法
US5179514A (en) * 1990-08-08 1993-01-12 The Research Foundation Of State University Of New York Method and apparatus for trajectory control of robot manipulators or the like
JPH04111006A (ja) * 1990-08-30 1992-04-13 Kobe Steel Ltd ロボットの経路補間方法
JP2597778B2 (ja) * 1991-01-03 1997-04-09 ストラタシイス,インコーポレイテッド 三次元対象物組み立てシステム及び組み立て方法
DE59105175D1 (de) * 1991-01-18 1995-05-18 Siemens Ag Steuerung zur Bewegungsführung eines Werkzeugs einer numerisch gesteuerten Maschine.
FR2682905B1 (fr) * 1991-10-28 1995-12-01 Commissariat Energie Atomique Procede de generation de trajectoire pour un systeme robotise.

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS5325779A (en) * 1976-08-23 1978-03-09 Hitachi Seiko Ltd Speed operating method in numeric control unit
JPH02137006A (ja) * 1988-11-18 1990-05-25 Mitsubishi Electric Corp 速度制御装置

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20200108351A (ko) * 2018-02-05 2020-09-17 크리에이트 아이티 리얼 에이피에스 3d 물체 인쇄용 프린터
JP2021512810A (ja) * 2018-02-05 2021-05-20 クリエイト・イット・リアル・アンパルツセルスケープCreate It Real Aps 3dオブジェクトをプリントするためのプリンタ
US11675332B2 (en) 2018-02-05 2023-06-13 Create It Real A/S Printer for printing a 3D object
JP2021144444A (ja) * 2020-03-11 2021-09-24 オムロン株式会社 制御装置、方法およびプログラム
CN116572257A (zh) * 2023-07-13 2023-08-11 湖南尖山智能科技有限责任公司 机械臂控制方法、装置、系统、存储介质及机械臂
CN116572257B (zh) * 2023-07-13 2023-09-22 湖南尖山智能科技有限责任公司 机械臂控制方法、装置、系统、存储介质及机械臂

Also Published As

Publication number Publication date
JP2801528B2 (ja) 1998-09-21
EP0642893A2 (en) 1995-03-15
EP0642893A3 (en) 1996-05-01
US5426722A (en) 1995-06-20
DE69417323T2 (de) 1999-08-26
EP0642893B1 (en) 1999-03-24
DE69417323D1 (de) 1999-04-29

Similar Documents

Publication Publication Date Title
JP2801528B2 (ja) 物体駆動時間低減方法及び多軸ロボット・システム
US6028410A (en) Resonance detection and resolution
CN103080859B (zh) 轨迹控制装置
CN113635301B (zh) 一种六轴机械臂运动速度控制改进方法
US6163124A (en) Robot controller
EP0077177A1 (en) Numerical control method and arrangement
CN101362513A (zh) 基于三个定位器的飞机部件位姿调整协同控制方法
JP2019166622A (ja) ロボット制御装置、ロボット制御方法、プログラム
JP2019166623A (ja) ロボット制御装置、ロボット制御方法、プログラム
CN110716451A (zh) 一种基于实时操作系统和fpga的仿真转台前馈控制方法
CN107645979A (zh) 用于使机器人手臂的运动同步的机器人系统
US6747434B2 (en) Methods and devices for controlling stepper motors
JP2001216008A (ja) ロボット制御方法
CN113867272A (zh) 一种基于切线矢量的用于数控系统椭圆弧及圆弧的速度规划方法
JPH10286788A (ja) 軌跡制御装置
JPH06274220A (ja) Nc装置
JPH0677910B2 (ja) 産業用ロボツトの制御方法
JP2002132854A (ja) 電子カム装置および電子カム装置におけるカムデータの作成方法
JPH02144705A (ja) ロボットアームの制御方法
JP2001331208A (ja) 直交座標型移動装置の物体の移動制御方法
JP7024752B2 (ja) 制御システムおよび制御プログラム
CN116901445A (zh) 基于ecs的建筑3d打印线段平滑过渡控制方法和系统
CN116766352A (zh) 建筑3d打印线条积瘤消除的算法优化控制与施工方法
JPH08137537A (ja) 制御指令生成装置
JP2638467B2 (ja) ロボット制御装置

Legal Events

Date Code Title Description
R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20080710

Year of fee payment: 10

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20080710

Year of fee payment: 10

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090710

Year of fee payment: 11

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100710

Year of fee payment: 12

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110710

Year of fee payment: 13

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120710

Year of fee payment: 14

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120710

Year of fee payment: 14

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130710

Year of fee payment: 15

LAPS Cancellation because of no payment of annual fees