JP6633467B2 - 行動制御システム、行動制御方法、プログラム - Google Patents
行動制御システム、行動制御方法、プログラム Download PDFInfo
- Publication number
- JP6633467B2 JP6633467B2 JP2016139010A JP2016139010A JP6633467B2 JP 6633467 B2 JP6633467 B2 JP 6633467B2 JP 2016139010 A JP2016139010 A JP 2016139010A JP 2016139010 A JP2016139010 A JP 2016139010A JP 6633467 B2 JP6633467 B2 JP 6633467B2
- Authority
- JP
- Japan
- Prior art keywords
- unit
- control
- void
- robot
- target
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims description 116
- 239000011800 void material Substances 0.000 claims description 408
- 230000009471 action Effects 0.000 claims description 76
- 230000008030 elimination Effects 0.000 claims description 17
- 238000003379 elimination reaction Methods 0.000 claims description 17
- 238000012545 processing Methods 0.000 description 74
- 230000008569 process Effects 0.000 description 45
- 238000004364 calculation method Methods 0.000 description 36
- 230000006399 behavior Effects 0.000 description 32
- 230000015572 biosynthetic process Effects 0.000 description 20
- 230000006870 function Effects 0.000 description 20
- 238000010586 diagram Methods 0.000 description 11
- 238000004891 communication Methods 0.000 description 10
- 230000008859 change Effects 0.000 description 8
- 230000010391 action planning Effects 0.000 description 6
- 230000001276 controlling effect Effects 0.000 description 6
- 238000012986 modification Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 230000008901 benefit Effects 0.000 description 4
- 238000012790 confirmation Methods 0.000 description 4
- 238000011160 research Methods 0.000 description 4
- 230000000694 effects Effects 0.000 description 3
- 238000005259 measurement Methods 0.000 description 3
- 230000002787 reinforcement Effects 0.000 description 3
- 230000009466 transformation Effects 0.000 description 3
- 230000007423 decrease Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000012423 maintenance Methods 0.000 description 2
- 239000013598 vector Substances 0.000 description 2
- 241000224489 Amoeba Species 0.000 description 1
- 238000010521 absorption reaction Methods 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 238000006073 displacement reaction Methods 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000001125 extrusion Methods 0.000 description 1
- 239000012530 fluid Substances 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 238000010008 shearing Methods 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
Landscapes
- Control Of Position, Course, Altitude, Or Attitude Of Moving Bodies (AREA)
- Manipulator (AREA)
Description
まず、行動制御システム及び方法の理論的背景について説明する。以下、行動制御の対象である制御対象物が、ロボットである場合を例に挙げて説明するが、制御対象物は、制御の対象となり得るものであれば、ロボット以外であってもよい。
多数のロボットが協調して開始位置における隊列形成状態から、各ロボットが接した状態を維持しつつ移動を行い、目標位置での隊列形成を行う任務は、例えば図1に例示するような、互いに接する面同士をスライドさせて移動していくことが可能な立方体型のロボットの使用を想定する。図2に示すように、壁で区切られた部屋(ただし図中、壁を省略する)においての開始位置から目標位置まで複数のロボットの移動によって実現するものである。
それぞれのロボットi(iはロボット番号を表すi=0,1,2,3,…,p-1)の初期位置を(Xr0[i],Yr0[i],Zr0[i])とし、目標位置を(Xre[i],Yre[i],Zre[i])とするとき、本問題は、初期位置に配置されたロボットが、目標位置まで移動するための行動計画を求めることと定義できる。目標位置(Xre[i],Yre[i],Zre[i])の集合をGとする。
iをロボット番号としたとき、ロボットiの各状態(ロボットの位置と行動)は離散値で表現される。部屋をX,Y,Zの直交座標系からなる3次元空間で表すと、X軸、Y軸、Z軸をそれぞれ離散化表現した値により各位置を表現する。つまり、部屋(3次元空間)は格子で区切られ、各格子が各位置に対応する。また、各格子において、障害物の「ある/なし」が予め設定されている。
また、行動主体は部屋に配置されている各ロボットとなる。ロボットi(iはロボット番号)の行動aは、静止、縦横高さ方向への1格子分の移動、の計7種類のうちのいずれかを取る。例えば、a∈{0,1,2,3,4,5,6}として、
0: 静止
1: 三次元空間内でX軸正方向に1格子だけ移動する
2: 三次元空間内でY軸正方向に1格子だけ移動する
3: 三次元空間内でX軸負方向に1格子だけ移動する
4: 三次元空間内でY軸負方向に1格子だけ移動する
5: 三次元空間内でZ軸正方向に1格子だけ移動する
6: 三次元空間内でZ軸負方向に1格子だけ移動する
とする。
このような任務環境における状態空間は、ロボット数×3の次元数の状態を持ち、かつ選択可能な行動数は、ロボットの行動(=7通り)のロボット数乗だけ存在する。例えば、ロボット数が50で、部屋の縦横高さ方向の格子数がそれぞれ20であるとすれば状態数は20の150乗個にもなり、探索計算に要する資源の量は膨大なものとなる。さらにロボット数が1台増えるごとに、その状態数は8000倍増加していくことになる。本実施形態の[問題設定]の項で説明したように、ロボット同士が接しているという拘束条件を取り入れる場合、ロボットのお互いの移動を考慮したうえで探索計算行わなければならないために、根本的な計算量の削減は難しく、複数ロボットを使用する場合の大きな問題となっている。
そこで、本実施形態では、これらの計算負荷の問題を解決するための方策の一つとして、ロボットの動作決定における探索計算を二つに分けることとする。ここでそのための準備として、ある隊列Gaをなしているロボットが、次になすべき隊列の形状としてGbを考える。隊列Gaと隊列Gbの間には、隊列Gaにて存在し、隊列Gbにて存在しない位置にあるロボットと、隊列Gbにて存在し隊列Gaにて存在しない位置にあるロボットがある。前者を尾部ロボットとし、後者を頭部ロボットとする。本実施形態では、ちょうど、頭部ロボット位置にあるロボットが、ロボット群の移動において先頭を務め、尾部ロボットが、移動の最後尾を務めるロボットになるように、隊列Gaと隊列Gbを定義する。
これらの二つの探索計算の計算負荷の軽減のため、本実施形態では、ボイド制御の考え方を導入する。まず、ここでいうボイドとは、あるロボットが別の位置に移動した後に、元いた位置にできる空隙のことである。別の言い方をすると、ボイドとは、ロボットの移動する方向と反対の方向に移動する仮想的な存在である。こうした群ロボットの隊列形成問題においては、複数のロボットの動作に着目するがゆえに、その探索計算量が爆発してしまうが、視点を変えて、ボイドの動きに着目すれば、多数のロボットの動作計画の問題を単一のボイドの動作計画として考えることができ、探索計算負荷の軽減に適している。
さらに、本実施形態では、図5に示すように、8つの田の字状に隣接したロボットを一つの単位とし(ロボット単位)、ロボットは、この田の字型のロボット単位を維持しつつ移動を行うとする。言い換えると、8台毎に1つのロボット単位を構成し、1つのロボット単位を構成する8台のロボットはそれぞれ3つの方向において1つのロボット単位を構成する他のロボットと隣接した状態を維持しつつ移動を行う。このロボット単位の集団は、互いにロボット単位ごとに一面を共有し、接しながら移動をするように制御される。
Xri1 = 2 ×Xr_unit[j]
Yri1 = 2 ×Yr_unit[j]
Zri1 = 2 ×Zr_unit[j]
Xri2 = 2 ×Xr_unit[j] + 1
Yri2 = 2 ×Yr_unit[j]
Zri2 = 2 ×Zr_unit[j]
Xri3 = 2 ×Xr_unit[j]
Yri3 = 2 ×Yr_unit[j] + 1
Zri3 = 2 × Zr_unit[j]
Xri4 = 2 ×Xr_unit[j] + 1
Yri4 = 2 ×Yr_unit[j] + 1
Zri4 = 2 ×Zr_unit[j]
Xri5 = 2 ×Xr_unit[j]
Yri5 = 2 ×Yr_unit[j]
Zri5 = 2 ×Zr_unit[j] + 1
Xri6 = 2 ×Xr_unit[j] + 1
Yri6 = 2 ×Yr_unit[j]
Zri6 = 2 ×Zr_unit[j] + 1
Xri7 = 2 ×Xr_unit[j]
Yri7 = 2 ×Yr_unit[j] + 1
Zri7 = 2 ×Zr_unit[j] + 1
Xri8 = 2 ×Xr_unit[j] + 1
Yri8 = 2 ×Yr_unit[j] + 1
Zri8 = 2 ×Zr_unit[j] + 1
である。
本実施形態では、ロボットが動作を開始する前にあらかじめ、2つの動作計画のために使用する任務空間内の各位置単位の入口位置単位PeUからのマンハッタン距離の計算を行う。そのために、まず、任務空間内の各位置単位(X,Y,Z)にて、入口位置単位PeUからの各位置単位へのマンハッタン距離δ[X][Y][Z]を以下の計算手続きで求める。なお、以下において、説明を簡単にするため「位置単位」を単に「位置」ともいい、「入口位置単位PeU」を単に「入口位置Pe」ともいう。
(1)各位置(X,Y,Z)において、next[a][X][Y][Z]を用意し、隣接する行動aの方向に障害物があるか、もしくは位置(X,Y,Z)が入口位置Pe以外の目標位置の集合GU内の位置の場合に、隣接する行動aの方向の位置が目標位置の集合GUの外であるか、もしくは位置(X,Y,Z)が目標位置の集合GU外の場合に、隣接する行動aの方向の位置が入口位置Pe以外の目標位置の集合GU内の位置である場合には、next[a][X][Y][Z]←0とし、それ以外の場合はnext[a][X][Y][Z]←1とする。すなわち、next[a][X][Y][Z]=0は位置(X,Y,Z)において行動aを実行できないことを、next[a][X][Y][Z]=1は位置(X,Y,Z)において行動aを実行できることを意味する。
(2)状態空間内の各位置(X,Y,Z)のマンハッタン距離δ[X][Y][Z]を状態空間内の格子数より大きな値s_maxに初期化する。
(3)入口位置Peのマンハッタン距離δを0に初期化する。
(4)入口位置Pe以外の、各位置(X,Y,Z)の全行動aについて、next[a][X][Y][Z]の値が0ではない場合の、行動aによって位置(X,Y,Z)から移動した先の位置(X’,Y’,Z’)でのマンハッタン距離δ[X’][Y’][Z’]を調べ、その最小値に1を加えた値が、現在のδ[X][Y][Z]よりも小さい場合は、その値をδ[X][Y][Z]に代入する。
(5)上述の(4)の処理にて、δ[X][Y][Z]値の更新がなくなるまで、(4)を繰り返す。
(1)開始位置の集合SU内にて、最もマンハッタン距離δ[X][Y][Z]値の小さな位置をPsとする。
(2)位置Psに隣接し、位置Psにおけるマンハッタン距離δよりも1だけ小さなマンハッタン距離δを持つ開始位置の集合SUの外の位置をパスPの始点p[0]とする。
(3)ip←0とする。
(4)位置p[ip]に隣接する位置の中で、位置p[ip]におけるマンハッタン距離δよりも1だけ小さなマンハッタン距離δを持つ位置をp[ip+1]とする。もし、p[ip+1]が入口位置Peに一致しないならば、ipをインクリメントし、(4)を繰りかえす。一致する場合は(5)へ移行する。
(5)目標位置の集合GU及びパスPの何れにも含まれないすべての位置のマンハッタン距離δをs_maxに再設定する。
(6)開始位置の集合SU内のすべての位置(X,Y,Z)の全行動aについて、next[a][X][Y][Z]の値が0ではない場合の、行動aによって位置(X,Y,Z)から移動した先の位置(X’,Y’,Z’)でのマンハッタン距離δ[X’][Y’][Z’]を調べ、その最小値に1を加えた値が、現在のδ[X][Y][Z]よりも小さい場合は、その値をδ[X][Y][Z]に代入する。
(7)上述の(6)の処理にて、δ[X][Y][Z]値の更新がなくなるまで、(6)を繰り返す。
(8)目標位置の集合GU内のすべての点のマンハッタン距離δの符号を負にする。この処理により、目標位置の集合GU内では、入口位置Peより離れるほどマンハッタン距離δが小さくなる。
(1)各ロボット単位の位置(Xr_unit[j],Yr_unit[j],Zr_unit[j])において、位置(Xr_unit[j],Yr_unit[j],Zr_unit[j])に隣接し、かつロボットが存在しておらず、かつパスP及び目標位置の集合GUの何れかに属する位置の中で、マンハッタン距離δ[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]の値より1小さい、マンハッタン距離δをもつ位置を求め、その位置のマンハッタン距離δをδ_neighbor_max[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]とする。
(2)全ロボット単位中で最大のδ_neighbor_max[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]の値を持つロボット単位H(なお、ロボット単位Hの位置を(Xrh,Yrh,Zrh)とする)を選択し、ロボット単位Hに隣接し、かつロボットが存在しておらず、かつパスP及び目標位置の集合GUの何れかに属する位置の中で、マンハッタン距離δがロボット単位Hのそれより1小さいマンハッタン距離δをもつ位置を頭部ロボット単位Dの位置とする。ロボット単位Hから頭部ロボット単位Dの位置に向かう行動の方向をa_headとする。
(1)各ロボット単位位置(Xr_unit[j],Yr_unit[j],Zr_unit[j])において、
δ'[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]
=δ[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]-δ[Xrh][Yrh][Zrh]
を計算する。なお、δ[Xrh][Yrh][Zrh]はロボット単位Hのマンハッタン距離であり、δ'[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]は、ロボット単位Hの位置から各ロボット単位位置(Xr_unit[j],Yr_unit[j],Zr_unit[j])までのマンハッタン距離を表す。
(2)各ロボット単位位置(Xr_unit[j],Yr_unit[j],Zr_unit[j])において、隣接するすべてのロボット単位N(なお、ロボット単位Nの位置を(Xrn,Yrn,Zrn)とする)について、δ'[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]≧δ'[Xrn][Yrn][Zrn]を満たし、かつ、δ'[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]≧1であるロボット単位の何れか一つを尾部ロボット単位Tとして選択する。つまり、尾部ロボット単位Tは、隣接するすべてのロボット単位N以上にロボット単位Hから離れており、かつ、ロボット単位Hから1マス単位以上離れている(ロボット単位Hと尾部ロボット単位Tとのマンハッタン距離が1マス単位以上離れている)。
(1)頭部決定処理Head_Robot_Decisionを行う。
(2)尾部ロボット決定処理Tail_robot_Decisionを行う。
(3)上述の(2)にて特定した尾部ロボット単位Tを、現在の隊列Gaから削除し、隊列Gaに頭部ロボット単位Dを追加し、隊列Gbとする。
移動先隊列決定用動作計画において頭部ロボット単位Dと尾部ロボット単位Tが決定され、次の隊列Gbが決定されたので、現隊列Gaから次隊列Gbへの変形を各ロボットの移動によって実現するための探索計算を各ロボット動作決定用動作計画にて行う。
H0(0,1,0), H1(1,1,0), H2(0,1,1), H3(1,1,1),H4(0,0,0), H5(1,0,0), H6(0,0,1), H7(1,0,1)
(1)void[8]の位置(8番目に発生するボイドのロボット単位H内ローカル位置(以下、ボイドの発生位置ともいう))は、atに平行な座標軸の座標値において、atが正方向であれば1,負方向であれば0でなければならない。例えば、at=1のとき(ロボット単位Tからロボット単位T'へ向かう行動の方向がX軸正方向のとき)、void[8]の(ローカル位置の)X座標は1でなければならない。
(void[7]とvoid[8]の位置をatに垂直な面に投影したときの面内位置を示す二つの座標成分が、二つの座標成分とも異なる値であり、かつ、atに平行な座標軸の座標値において、void[7]とvoid[8]では同じ値であり、かつ、(i)void[6]の位置をatに垂直な面に投影したときの面内位置が、void[7]とvoid[8]の位置をatに垂直な面に投影したときの面内位置と異なる位置であるか、または(ii)void[6]の位置が、void[7]またはvoid[8]と同じ位置であり、かつvoid[5]の位置が、void[6]の対角の位置(全座標値が異なる位置)以外の位置である。) or
(void[7]とvoid[8]の位置が同じ位置であり、かつ、void[6]の位置の座標値のうちすくなくとも一つが、void[8]の座標値に等しい。それらvoid[6]の位置のうち、さらに、void[6]を atに垂直な面に投影したときの面内位置が、void[8]と対角の位置のときは、void[5]の位置はvoid[8]の対角の位置(全座標値が異なる位置)以外の位置である。)
でなければならない。
(void[1]とvoid[2]の位置をahに垂直な面に投影したときの面内位置を示す二つの座標成分とも異なる値であり、かつ、ahに平行な座標軸の座標値において、void[1]とvoid[2]では同じ値であり、かつ、(i)void[3]の位置をahに垂直な面に投影したときの面内位置が、void[1]とvoid[2]の位置をahに垂直な面に投影したときの面内位置と異なる位置であるか、または、(ii)void[3]の位置が、void[1]と(または)void[2]と同じ位置であり、かつvoid[4]の位置が、void[3]の対角の位置(全座標値が異なる位置)以外の位置である。) or
(void[1]とvoid[2]の位置が同じ位置であり、かつ、void[3]の位置の座標値のうちすくなくとも一つが、void[1]の座標値に等しい。それらvoid[3]の位置のうち、さらに、void[3]を ahに垂直な面に投影したときの面内位置が、void[1]と対角の位置のときは、void[4]は、void[1]の対角の位置(全座標値が異なる位置)以外の位置である。)
でなければならない。
(1)If ah=2 or 3 or 6 then void[1]=H7, void[2]=H2
(2)If ah=4 or 1 or 5 then void[1]=H0, void[2]=H5
(3)If at=1 or 2 or 5 then void[7]=H6, void[8]=H3
(4)If at=3 or 4 or 6 then void[7]=H1, void[8]=H4
(5)If at=5 or 6 then void[6]=H0 or void[6]=H5 or void[6]=H2 or void[6]=H7
(6)If ah=5 or 6 then void[3]=H6 or void[3]=H3 or void[3]=H1 or void[3]=H4
(7)その他のvoid[k]をまだvoid[1],void[2],void[7],void[8],void[3],void[6]にまだ使用されていない位置に割り当てる。
(1)void[1],void[2]の位置を同じ位置とし、ともに、ahに平行な座標軸の座標値において、ahが正方向であれば0,負方向であれば1とする。
(2)void[7],void[8]の位置を同じ位置とし、ah、atの方向への投影位置において、void[1],void[2]と重ならない位置のうち一つを、void[7],void[8]の同じ位置とし、ともに、atに平行な座標軸の座標値において、atが正方向であれば1,負方向であれば0とする。
(3)void[3],void[4]の位置を同じ位置とし、ah、atの方向への投影位置において、void[1],void[2], void[7],void[8]と重ならず、ロボット単位立方体内で、void[1],void[2]の位置の対角にない位置をvoid[3],void[4]とする。
(4)void[5],void[6]の位置を同じ位置とし、ah、atの方向への投影位置において、void[1],void[2],void[3],void[4], void[7],void[8]と重ならず、ロボット単位立方体内で、void[7],void[8]の位置の対角にない位置をvoid[5],void[6]とする。
j_z[iv_prev+k][t] ) (t=0,1,2,3…)で表現する。
(1)ロボット単位H内、各ボイドの発生位置を[ボイド発生条件]により決定する。例えば、[Decision_Void_Birth]または[Decision_Void_Birth_2]を実行する。
(2)各ボイドの発生位置を各ボイドの軌道の終点void_end[iv_prev+k]とする。
(3)上述の(1)で発生位置を設定した8つのボイドがロボット単位Hの位置から尾部ロボット単位Tの位置までたどるべき位置単位の道筋を(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu]) (tu=0,1,2,3…)とし、後述するVoid_Unit_Trajectory_Decisionにて(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])を決定する。ここで、(void_unit_trj_x[0], void_unit_trj_y[0], void_unit_trj_z[0])をTとする。tuの値は、Tを始点0とし、Hに近づくにつれて大きくなるようにボイドの動きと逆向きに設定する。
(4)(void_unit_trj_x[1], void_unit_trj_y[1], void_unit_trj_z[1])をT'とする。T'は尾部ロボット単位Tに隣接するロボット単位である。
(5)ロボット単位T'内のローカル位置を、各ボイドk(k=1,2,…,8)の目標位置に設定する。なお、ロボット単位Hにおけるボイドの発生位置void[k]に対応する、ロボット単位T'内のローカル位置を各ボイドkの目標位置に設定する。
(6)上述の(5)で決定された各ボイドの目標位置から、ロボット単位Hの位置内のボイド発生位置に至る軌道を(7)以下の処理で設定する。
(7)it←0とする。( void_trj_x[iv_prev+k][0], void_trj_y[iv_prev+k][0] , void_trj_z[iv_prev+k][0] )を上述の(5)で決定されたボイドkの目標位置とする。
(8)(void_unit_trj_x[2+it/2-1], void_unit_trj_y[2+it/2-1], void_unit_trj_z[2+it/2-1])がロボット単位Hの位置に一致していないならば、(void_unit_trj_x[2+(it)/2-1], void_unit_trj_y[2+(it)/2-1], void_unit_trj_z[2+(it)/2-1])から (void_unit_trj_x[2+it/2], void_unit_trj_y[2+it/2], void_unit_trj_z[2+it/2])へ移動する方向に、( void_trj_x[iv_prev+k][it], void_trj_y[iv_prev+k][it] , void_trj_z[iv_prev+k][it] )から1ステップ移動した位置を( void_trj_x[iv_prev+k][it+1], void_trj_y[iv_prev+k][it+1] , void_trj_z[iv_prev+k][it+1] )とし、2ステップ移動した位置を( void_trj_x[iv_prev+k][it+2], void_trj_y[iv_prev+k][it+2] , void_trj_z[iv_prev+k][it+2] )とし、itを2回インクリメントする。(void_unit_trj_x[2+it/2-1], void_unit_trj_y[2+it/2-1], void_unit_trj_z[2+it/2-1])がロボット単位Hの位置に一致するまで(8)を繰り返す。(void_unit_trj_x[2+it/2-1], void_unit_trj_y[2+it/2-1], void_unit_trj_z[2+it/2-1])がロボット単位Hの位置に一致しているならば、軌道内点数trj_num[iv_prev+k]←itとして終了する。
(1)尾部ロボット単位Tの位置を(void_unit_trj_x[0], void_unit_trj_y[0], void_unit_trj_z[0])とする。tu←1とし、尾部ロボット単位Tよりも小さなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])とする。このロボット単位(void_unit_trj_x[1], void_unit_trj_y[1], void_unit_trj_z[1])の位置が、ロボット単位T'に相当する。
(2)もし、(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])が入口位置Peでもロボット単位Hでなければ、tuをインクリメントし、位置(void_unit_trj_x[tu-1], void_unit_trj_y[tu-1], void_unit_trj_z[tu-1])にあるロボット単位よりも小さなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])とする。(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])が入口位置Peまたはロボット単位Hの位置になるまで(2)を繰り返す。
もし、(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])が入口位置Pe(Hでなく)の場合は、(3)へ移行する。
もし、(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])がロボット単位Hの位置の場合は、Void_Unit_Trajectory_Decisionを終了する。
(3)ロボット単位Hの位置を(void_unit_trj_rev_x[0], void_unit_trj_rev_y[0], void_unit_trj_rev_z[0])とする。tr←1とし、ロボット単位Hよりも大きなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])とする。
(4)もし、(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])が入口位置Peでなければ、trをインクリメントし、位置(void_unit_trj_rev_x[tr-1], void_unit_trj_rev_y[tr-1], void_unit_trj_rev_z[tr-1]) にあるロボット単位よりも大きなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])とする。(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])が入口位置Peになるまで(4)を繰り返す。
もし、(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])が入口位置Peの場合は、(5)へ移行する。
(5)it=1,…,trとして、(void_unit_trj_x[tu+it], void_unit_trj_y[tu+it], void_unit_trj_z[tu+it])←(void_unit_trj_rev_x[tr-it], void_unit_trj_rev_y[tr-it], void_unit_trj_rev_z[tr-it])とする。
以下、上記の各ロボット動作決定用動作計画を使用して、ボイドをロボット単位Hの位置から尾部ロボット単位Tの位置に移動させる制御方法を示す。図8に示すように、ロボット単位H内の頭部ロボット単位Dに接する位置のロボットと、ロボット単位T'内の尾部ロボット単位Tに接する位置にあるロボット位置に空白が生じないように、ロボット単位Hでのボイド発生と尾部ロボット単位Tでのボイド追い出しをしていることで、ロボット群全体の接続は保たれている。なお、本実施形態では、ロボット単位Hとロボット単位T'が一致しても構わない。本制御方法で、各ロボット単位内において、ボイドが一つ以内に収まるように制御されている。
(1) (iv_prev +1)が全ロボット数に等しくないならば、Void_Trajectory_Decisionを実行する。trj_cnt[iv_prev+1],…, trj_cnt[iv_prev+8]に初期値(例えば-1)を設定する。iv_prevの値を8回インクリメントする。等しいならば(3)へ
(2)以下をvoid[iv_prev]がロボット単位Hの外に出るまで繰り返す。
発生番号の大きいもの(iv=iv_prev)から以下の処理をする。
(2-i)trj_cnt[iv]=-10のとき→void[iv]について何もしない。
(2-ii)trj_cnt[iv]< trj_num[iv](前述の通り、変数trj_numはロボット単位Hから尾部ロボット単位Tまでの軌道内点数を表す) かつtrj_cnt[iv]≧0のとき→
i= trj_cnt[iv]からtrj_num[iv]まで以下を行う:
位置nv(void_trj_x[trj_num[iv]-i-1],void_trj_y[trj_num[iv]-i-1], void_trj_z[trj_num[iv]-i-1])が含まれるロボット単位Nvに他のvoidがないこと、自分より発生番号の小さいvoidが、すべてロボット単位Nvよりもマンハッタン距離δの大きいロボット単位に所属していることを確認する。確認できたなら、nvの位置にあるロボットを位置(void_trj_x[trj_num[iv]-i],void_trj_y[trj_num[iv]-i],void_trj_z[trj_num[iv]-i])に移動させる。trj_cnt[iv]をインクリメントする。確認できなくなるまで処理を繰り返し、確認できないならなにもせず、ループ終了する。
(2-iii)trj_cnt[iv]=trj_num[iv]のとき→
現在のvoid[iv]の位置から、atの方向の逆方向に隣接していて、たどれるロボットをすべて、at方向に1ステップ移動させて、trj_cnt[iv]←‐10とする。
(2-iv)trj_cnt[iv]=‐1のとき→
ロボット単位Hが8つのロボットで満たされているならば、void[k]の発生位置にあるロボットと、そのロボットに行動ahの方向で隣接しているロボット、さらにその先にahの方向で隣接しているロボットがあればそのロボットを皆まとめて、ahの方向に1ステップ移動させる。trj_cnt[iv]←0とする。満たされてない場合なにもしない。
(3)発生番号の大きいもの(iv=iv_prev)から以下の処理をする。
(3-i)trj_cnt[iv]=-10のとき→void[iv]について何もしない。
(3-ii)trj_cnt[iv]< trj_num[iv](前述の通り、変数trj_numはロボット単位Hから尾部ロボット単位Tまでの軌道内点数を表す) かつtrj_cnt[iv]≧0のとき→
i= trj_cnt[iv]からtrj_num[iv]まで以下を行う:
位置nv(void_trj_x[trj_num[iv]-i-1],void_trj_y[trj_num[iv]-i-1], void_trj_z[trj_num[iv]-i-1])が含まれるロボット単位Nvに他のvoidがないこと、自分より発生番号の小さいvoidが、すべてロボット単位Nvよりもマンハッタン距離δの大きいロボット単位に所属していることを確認する。確認できたなら、nvの位置にあるロボットを位置(void_trj_x[trj_num[iv]-i],void_trj_y[trj_num[iv]-i],void_trj_z[trj_num[iv]-i])に移動させる。trj_cnt[iv]をインクリメントする。確認できなくなるまで処理を繰り返し、確認できないならなにもせず、ループ終了する。
(3-iii)trj_cnt[iv]=trj_num[iv]のとき→
現在のvoid[iv]の位置から、atの方向の逆方向に隣接していて、たどれるロボットをすべて、at方向に1ステップ移動させて、trj_cnt[iv]←‐10とする。
しかしながら、上記隊列制御では、各ロボットを同一の属性とみなした場合のホモジニアス(Homogeneous)隊列制御までしか完了しておらず、各ロボットの個々の属性を別のものとして扱うヘテロジニアス隊列制御は、完了していない。ここで、別の言い方をすると、ヘテロジニアス隊列制御とは、各ロボットiをそれぞれ目標位置(Xre[i],Yre[i],Zre[i])に到達させる隊列制御のことである。ヘテロジニアス隊列制御を完了させるためには、以下に述べる各ロボット位置の入れ替え制御を行う必要がある。
前述のホモジニアス隊列制御が完了している時点(ロボットがなす全体の形状は目標位置の集合Gと同一であるが、各ロボットの位置が目標位置に到達している保証はない状態)における各ロボットjの位置を(Xrh[j],Yrh[j],Zrh[j])とすると、ロボット位置の入れ替え制御とは、(Xrh[j],Yrh[j],Zrh[j])= (Xre[i],Yre[i],Zre[i])となるiとjの組を特定し、ロボットiを現状のロボットjの位置に移動させることである。すなわち、ロボットiの移動先ロボット位置をd(i)としたとき、d(i)=jであり、すべてのロボットiを現状のロボットd(i)の位置に移動させていく制御に他ならない。
(1)すべてのロボットiについて変数p(i)=0とする(pは、ロボット位置入れ替え済み判定フラグである)。tp=0とし、Record_Historyを実行する(ただし、tpは時刻カウンタとする)。
(2)i=d(i)となるすべてのロボットiについて、p(i)=1とする。
(3)すべてのiについてp(i)=1となるまで、(4)〜(6)を繰り返す。
(4)p(i)=0である最小のiを選択する。
(5)i=d(i)でないうちは、(6)を繰り返す。
(6)入れ替え元のロボットorigin←i, 入れ替え先のロボットdestination←d(i)とし、Each_Robot_Position_Exchangeを実行する。
各個ロボット位置入れ替え制御において重要なことは、入れ替え前後において入れ替え元のロボットoriginの位置と入れ替え先のロボットdestinationの位置が入れ替わる以外、その他のロボットの位置は変化せず保持されることが保証されていることである。
(1)Calculate_Path_From_Origin_To_Destinationを実行する。
(2)Void_Generationを実行する。
(3)Robot_Exchangeを実行する。
(4)Void_UnGenerationを実行する。
入れ替え経路生成処理手順Calculate_Path_From_Origin_To_Destinationは、以下の通りである。
(1) Calculate_Perm_Manhattanを実行する。
(2) Calculate_Perm_Pathを実行する。
(3) Divide_Pathを実行する。
(1)G内にある各ロボットiの位置(Xr[i],Yr[i],Zr[i])において、next_p[a][i]を用意し、隣接する行動aの方向に他のロボットがある場合には、next_p[a][i]←1とし、それ以外の場合はnext_p[a][i]←0とする。
(2)各ロボットiの位置のマンハッタン距離δp[i]をG内の格子数より大きな値s_maxに初期化する。
(3)ロボットdestinationの位置のマンハッタン距離δp[destination]を0に初期化する。
(4)すべてのロボットiと行動aについて、next_p[a][i]の値が0ではない場合の、行動aによってロボットiの位置から移動した先の位置にあるロボットjのマンハッタン距離δp[j]を調べ、その最小値に1を加えた値が、現在のδp[i]よりも小さい場合は、その値をδp[i]に代入する。
(5)上述の(4)の処理にて、δp[i]値の更新がなくなるまで、(4)を繰り返す。
(1)ロボットoriginからロボットdestinationに至るパスに含まれるロボット数を格納する変数をtrj_numとし、値を0に初期化する。パス中のロボット番号を格納する変数をp_trj[t](t=0…)とし、p_trj[0]=originとする。また、t=0とする。
(2) p_trj[t]=destinationでないとき、ロボットp_trj[t]から各行動aによって移動した先にある隣接ロボットj’のうち、δp[j’]の値が、δp[t]‐1となるロボットj’を選択し、p_trj[t+1]=j’とする。ロボットj’に至る行動をa’として、a_trj[t]=a’とする。tをインクリメントする。
(3) p_trj[t]=destination となるまで、(2)を繰り返す。p_trj[t]=destinationのとき、trj_num=t+1、a_trj[trj_num-1]=a_trj[trj_num-2]として終了する。
(1)直線パスの格納変数path_perm_x[t],path_perm_y[t], path_perm_z[t]とする。また、パス中の角の番号およびその数を格納する変数をそれぞれcorner[],corner_numとする。path_perm_x[0]←Xr[p_trj[0]]、path_perm_y[0]←Yr[p_trj[0]]、path_perm_z[0]←Zr[p_trj[0]]とし、perm_num←1 、t←0、corner_num←0とする。t<trj_num-1の間、(2)を繰り返す。
(2) a_trj[t]= a_trj[t+1]のとき、path_perm_x[perm_num]←Xr[p_trj[t+1]]、path_perm_y[perm_num]←Yr[p_trj[t+1]]、path_perm_z[perm_num]←Zr[p_trj[t+1]]とし、perm_num、tをインクリメントする。そうでないとき、corner[corner_num]←perm_numとし、corner_numをインクリメントする。tをインクリメントしてから、path_perm_x[perm_num]←Xr[p_trj[t+1]]、path_perm_y[perm_num]←Yr[p_trj[t+1]]、path_perm_z[perm_num]←Zr[p_trj[t+1]]とし、perm_numをインクリメントする。
生成した二つのボイド位置を(void_perm_x[0], void_perm_y[0], void_perm_z[0])、(void_perm_x[1], void_perm_y[1], void_perm_z[1])とし、ボイドを生成した結果G外に出されたロボットをロボットout_0, out_1とする。
(1)G内の他のロボット単位位置もしくは障害物に接していないロボット単位の面を一つ選択し、Ssとする。Ssを持つロボット単位をMsとする。Ssに接するGに属する(以下、簡単のため、Ssに属するということにする)4つのロボットをim[0], im[1], im[2], im[3]とする。Ssが向いている方向(ロボット単位位置Msの中から外に向くSsの法線の方向)をasとする。なお、asは1〜6の値を取り、その意味は[ロボット動作の定義]に準ずるものとする。例えば、as=1は、三次元空間内でX軸正方向を意味するものとする。 (void_perm_x[0], void_perm_y[0], void_perm_z[0])、(void_perm_x[1], void_perm_y[1], void_perm_z[1])をG外の値とする。t_void←0とする。なお、t_voidは、後述するUpdate_Void_Navigationで使用される変数である。
(2)Ssに属するロボットim[i’]のうち、ロボットim[i’]から方向asと逆向きに接する位置にあるロボットをjm[i’]としたとき、ロボットim[i’],jm[i’]のどちらもがパス(path_perm_x[t], path_perm_y[t], path_perm_z[t])に含まれないものを選び、ロボットout_0,out_1とする。ロボットout_0,out_1の位置を変数(void_buffer_x[0], void_buffer_y[0], void_buffer_z[0]), (void_buffer_x[1], void_buffer_y[1], void_buffer_z[1])に格納する。
(3)asの値に従って以下の制御をロボットout_0,out_1に対して行う。
as=1のとき:
(3.1)Move_Module(out_0, 1, 0, 0)、Move_Module(out_1, 1, 0, 0)を実行し、Record_Historyを実行する。
(3.2)If Zr[out_0] % 2 = 1,
Then, Move_Module(out_0, 0, 0, -1)を実行する。
Else, Move_Module(out_0, 0, 0, 1)を実行する。
(3.3)Record_Historyを実行する。
(3.4)Move_Module(out_1, 1, 0, 0)を実行する。
as=2のとき:
(3.1)Move_Module(out_0, 0, 1, 0)、Move_Module(out_1, 0, 1, 0)を実行し、Record_Historyを実行する。
(3.2)If Xr[out_0] % 2 = 1,
Then, Move_Module(out_0, -1, 0, 0)を実行する。
Else, Move_Module(out_0, 1, 0, 0)を実行する。
(3.3)Record_Historyを実行する。
(3.4)Move_Module(out_1, 0, 1, 0) を実行する。
as=3のとき:
(3.1)Move_Module(out_0, -1, 0, 0)、Move_Module(out_1, -1, 0, 0)を実行し、Record_Historyを実行する。
(3.2)If Zr[out_0] % 2 = 1,
Then, Move_Module(out_0, 0, 0, -1)を実行する。
Else, Move_Module(out_0, 0, 0, 1)を実行する。
(3.3)Record_Historyを実行する。
(3.4)Move_Module(out_1, -1, 0, 0)を実行する。
as=4のとき:
(3.1)Move_Module(out_0, 0, -1, 0)、Move_Module(out_1, 0, -1, 0)を実行し、Record_Historyを実行する。
(3.2)If Xr[out_0] % 2 == 1,
Then, Move_Module(out_0, -1, 0, 0)を実行する。
Else, Move_Module(out_0, 1, 0, 0)を実行する。
(3.3)Record_Historyを実行する。
(3.4)Move_Module(out_1, 0, -1, 0)を実行する。
as=5のとき:
(3.1)Move_Module(out_0, 0, 0, 1)、Move_Module(out_1, 0, 0, 1)を実行し、Record_Historyを実行する。
(3.2)If Yr[out_0] % 2 == 1,
Then, Move_Module(out_0, 0, -1, 0)を実行する。
Else, Move_Module(out_0, 0, 1, 0)を実行する。
(3.3)Record_Historyを実行する。
(3.4)Move_Module(out_1, 0, 0, 1)を実行する。
as=6のとき:
(3.1)Move_Module(out_0, 0, 0, -1)、Move_Module(out_1, 0, 0, -1)を実行し、Record_Historyを実行する。
(3.2)If Yr[out_0] % 2 == 1,
Then, Move_Module(out_0, 0, -1, 0)を実行する。
Else, Move_Module(out_0, 0, 1, 0)を実行する。
(3.3)Record_Historyを実行する。
(3.4)Move_Module(out_1, 0, 0, -1)を実行する。
(4)Record_Historyを実行する。
(5)(void_perm_x[0], void_perm_y[0], void_perm_z[0])、(void_perm_x[1], void_perm_y[1], void_perm_z[1])に(void_buffer_x[0], void_buffer_y[0], void_buffer_z[0]), (void_buffer_x[1], void_buffer_y[1], void_buffer_z[1])の値を格納する。つまり、生成する二つのボイドの位置は、(2)で特定したロボットout_0,out_1の位置と一致する。
(6)ロボットout_0の位置を(escape_cube_buffer_x[0], escape_cube_buffer_y[0], escape_cube_buffer_z[0])に、ロボットout_1の位置を(escape_cube_buffer_x[1], escape_cube_buffer_y[1], escape_cube_buffer_z[1])に、バッファリングする。つまり、(escape_cube_buffer_x[0], escape_cube_buffer_y[0], escape_cube_buffer_z[0])、(escape_cube_buffer_x[1], escape_cube_buffer_y[1], escape_cube_buffer_z[1])には、ロボットout_0, out_1を待避させた位置が格納される。
(1)ロボットiをX方向にvx,Y方向にvy,Z方向にvzだけ移動させる。ただし、vx,vy,vzのうち一つの成分のみ非零値とする。
(2)二つのボイドの位置(void_perm_x[0], void_perm_y[0], void_perm_z[0])、(void_perm_x[1], void_perm_y[1], void_perm_z[1])がG内の値であるとき、ロボットiの移動に伴い、対応するボイドの位置を移動させる。
(1)(permutation_x[tp][i], permutation_y[tp][i], permutation_z[tp][i])に各ロボットiの現時点の位置を格納し、tpをインクリメントする。
(2)movable_num←0とする。なお、movable_numは、後述するAdd_Movableで使用される変数である。
ロボットoriginの位置とロボットdestinationの位置を入れ替える制御は、
(α)ロボットoriginをロボットdestinationの位置まで移動させる。
(β)ロボットdestinationをロボットoriginの元の位置まで移動させる。
の二つのステップからなる。(α)の移動に伴い、ロボットoriginとロボットdestination以外のロボットも移動を余儀なくされ、それらのロボットの位置も変化してしまうが、(β)の移動に伴ってそれらの位置はすべて元に戻される。
j=0のとき、t=0〜corner[0]-1の(path_perm_x[t], path_perm_y[t], path_perm_z[t])に格納されているロボット位置。
0< j< corner_numのとき、t = corner[j-1]〜corner[j]-1の(path_perm_x[t], path_perm_y[t], path_perm_z[t])に格納されているロボット位置。
j=corner_numかつcorner[j] < perm_num-2のとき、t=corner[j-1]〜perm_num-2の(path_perm_x[t], path_perm_y[t], path_perm_z[t])に格納されているロボット位置。
t = perm_num-2〜perm_num-1の(path_perm_x[t], path_perm_y[t], path_perm_z[t])に格納されているロボット位置
t=corner[j]-1〜corner[j]の(path_perm_x[t], path_perm_y[t], path_perm_z[t])に格納されているロボット位置
(1)i_l, t←0とし、カウンタi_c=0〜corner_num-1のすべてのi_cの値について、以下の制御を実行する。
If t != corner[i_c]-1,
Then, (角要素の始点にロボットoriginがない)
Line_Perm(i_l, 0)を実行し、線要素i_lの始点と終点の位置にあるロボットの位
置を入れ替える。
Corner_Perm(i_c, 0) を実行し、角要素i_cの始点と終点の位置にあるロボットの位
置を入れ替える。t←corner[i_c]とする。i_lをインクリメントする。
Else, (すでに角要素の始点にロボットoriginがある)
Corner_Perm(i_c, 0)を実行し、角要素i_cの始点と終点の位置にあるロボットの
位置を入れ替える。t←corner[i_c]とする。
//最後の部分は残り2マスだけ分離して入れ替える
(2)以下の制御を実行する。
If corner[corner_num-1] != perm_num-1,
Then, If corner[corner_num-1] != perm_num-2,
Then,
Line_Perm(i_l, 0)を実行する。
Last_Line_Permを実行し最終線要素の始点と終点の位置にあるロボットの位置
を入れ替える。
Else,
Last_Line_Permを実行し最終線要素の始点と終点の位置にあるロボットの位置
を入れ替える。
(1) If corner[corner_num-1] != perm_num-1 && corner[corner_num-1] != perm_num-2, Then, Line_Perm(i_l, 1)を実行する。i_lをデクリメントする。
(2) カウンタi_c=corner_num-1〜0のすべてのi_cの値について、以下の制御を実行する。
(2.1)If i_c > 0 Then,
If corner[i_c-1] != corner[i_c]-1,
Then, (角要素の終点にロボットdestinationがない)
If perm_num-1 > corner[i_c], Then,
Corner_Perm(i_c, 1)を実行する。
Line_Perm(i_l, 1)を実行する。
t←corner[i_c]とし、i_lをデクリメントする。
Else,
If perm_num-1 > corner[i_c],
Then, (角要素が最終の要素の場合、帰りに入れ替えはしない。)
Corner_Perm(i_c, 1)を実行する。
t←corner[i_c]とする。
Else,
If 0 != corner[i_c]-1, Then,
If perm_num-1 > corner[i_c], Then,
Corner_Perm(0, 1)を実行する。
Line_Perm(0, 1)を実行する。
Else,
If perm_num-1 > corner[i_c], Then,
Corner_Perm(0, 1) を実行する。
(1)Robot_Exchange_1を実行する。
(2)Robot_Exchange_2を実行する。
線要素におけるロボット位置の入れ替えは、線要素に隣接するロボットをバディロボット(以下、単にバディともいう)として使用して図16に示すように行われる。バディは、線要素がX軸方向向きのときはY方向の隣接ロボットを、線要素がY軸方向向きのときはZ方向の隣接ロボットを、線要素がZ軸方向向きのときはX方向の隣接ロボットを線要素内のロボット数から2つ少ない数使用する。
[Line_Perm(i_l, _flg)]
(1)線要素i_lの始点位置番号を_s, 終点位置番号を_gとし、Line_Perm_By_Position(_s, _g, _flg)を実行する。
(1) _flg=0として、Line_Perm_By_Position(perm_num-2 perm_num-1, _flg)を実行する。
(1)線要素の向きがX方向のときdirection←1とし、線要素の向きがY方向のときdirection←2とし、線要素の向きがZ方向のときdirection←3とする。
(2)入れ替え動作開始時の二つのボイド目標位置 (l_x[0], l_y[0], l_z[0])← (path_perm_x[_s], path_perm_y[_s], path_perm_z[_s])、(l_x[1], l_y[1], l_z[1])← (path_perm_x[_s+1], path_perm_y[_s+1], path_perm_z[_s+1])とする。
(3)directionの値により以下を実行する(線要素の向きによるボイド目標位置設定に相当する)。
(3.1)direction=1 のとき:
If l_y[1]が奇数, Then, l_y[0], l_y[1]をデクリメントする。_p_l←-1とする。
Else, l_y[0], l_y[1]をインクリメントする。_p_l←1とする。
(3.2)direction=2 のとき:
If l_z[1]が奇数, Then, l_z[0], l_z[1]をデクリメントする。_p_l←-1とする。
Else, l_z[0], l_z[1]をインクリメントする。_p_l←1とする。
(3.3)direction=3 のとき:
If l_x[1]が奇数, Then, l_x[0], l_x[1]をデクリメントする。_p_l←-1とする。
Else, l_x[0], l_x[1]をインクリメントする。_p_l←1とする。
(4)If _flg=0, Then,
Navigate_Void(l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1])を実行する。
Else,
Reverse_Void_To(l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1])を実行する。
(5)Before_Care(_s, _g, direction, _p_l)を実行する。
(6)Rotation_in_Line(_s, _g, l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1], direction, _p_l)を実行する。
(1)index_rot[r](r=0,1,…,2*nm+1)を線要素内ロボットとバディロボットに設定する通し番号とし(図16参照)、r=nm〜2*nm+1において、index_rot[r]の値を(path_perm_x[_s + (r - nm)], path_perm_y[_s + (r - nm)], path_perm_z[_s + (r - nm)])にあるロボットの番号に設定する(線要素内ロボット通し番号に相当する)。
(2)_vx←0, _vy←0, _vz←0とし、_d=1のときは、_vyに_p_lの値を加算する。_d=2のときは、_vzに_p_lの値を加算する。_d=3のときは、_vxに_p_lの値を加算する。
(3) r=0〜nm-1において、index_rot[r]の値を(path_perm_x[_g - r] + _vx, path_perm_y[_g - r] + _vy, path_perm_z[_g - r] + _vz)にあるロボットの番号に設定する(バディロボット通し番号に相当する)。
(4) _d=1のときは、Rotation_X_Line(_p_l)を実行する。_d=2のときは、Rotation_Y_Line(_p_l)を実行する。_d=3のときは、Rotation_Z_Line(_p_l)を実行する。
(1)線要素が正方向のとき_g_p_l←1とする。線要素が負方向のとき_g_p_l←-1とする。
(2)Add_Movable(index_rot[nm], 0, _p_l, 0)を実行する。Evacuating_Cube_Controlを実行する。
(3)Move_Module(index_rot[nm], 0, _p_l, 0)を実行する。Record_Historyを実行する(図16動作(a))。
(4)r=nm+1〜2*nm+1のすべてのrについて、Add_Movable(index_rot[r], -_g_p_l, 0, 0)を実行する。その後、Evacuating_Cube_Controlを実行する。
(5)r=nm+1〜2*nm+1のすべてのrについてMove_Module(index_rot[r], -_g_p_l, 0, 0)を実行する。Record_Historyを実行する(図16動作(b))。
(6)Add_Movable(index_rot[nm], _g_p_l, 0, 0)を実行する。Evacuating_Cube_Controlを実行する。
(7)Move_Module(index_rot[nm], _g_p_l, 0, 0)を実行する。Record_Historyを実行する(図16動作(c))。
(8)カウンタj=1〜nmまで以下を繰り返す。
(8.1)Add_Movable(index_rot[nm+j], 0, _p_l, 0)を実行する。
Add_Movable(index_rot[j-1], 0, -_p_l, 0)を実行する。
Evacuating_Cube_Controlを実行する。
(8.2)Move_Module(index_rot[nm+j], 0, _p_l, 0)を実行する。
Move_Module(index_rot[j-1], 0, -_p_l, 0)を実行する。
Record_Historyを実行する(図16動作(d))。
(8.3)r=nm+j+1〜2*nm+1のすべてのrにおいて、
Add_Movable(index_rot[r], -_g_p_l, 0, 0)を実行する。
r=0〜j-1のすべてのrにおいて、
Add_Movable(index_rot[r], -_g_p_l, 0, 0)を実行する。
r=j〜nm+jのすべてのrにおいて、
Add_Movable(index_rot[r], _g_p_l, 0, 0)を実行する。
Evacuating_Cube_Control(movable_num)を実行する。
(8.4)r=nm+j+1〜2*nm+1のすべてのrにおいて
Move_Module(index_rot[r], -_g_p_l, 0, 0)を実行する。
r=0〜j-1のすべてのrにおいて
Move_Module(index_rot[r], -_g_p_l, 0, 0) を実行する。
r=j〜nm+jのすべてのrにおいて
Move_Module(index_rot[r], _g_p_l, 0, 0) を実行する。
Record_Historyを実行する(図16動作(e))。
(9)Add_Movable(index_rot[nm], 0, -_p_l, 0)を実行する。Evacuating_Cube_Controlを実行する。
(10)Move_Module(index_rot[nm], 0, -_p_l, 0)を実行する。Record_Historyを実行する(図16動作(f))。
(11)r=nm+1〜2*nmのすべてのrにおいて、Add_Movable(index_rot[r], _g_p_l, 0, 0)を実行したのち、Evacuating_Cube_Controlを実行する。
(12)r=nm+1〜2*nmのすべてのrにおいて、Move_Module(index_rot[r], _g_p_l, 0, 0)を実行した後、Record_Historyを実行する(図16動作(g))。
(1)線要素が正方向のとき_g_p_l←1とする。線要素が負方向のとき_g_p_l←-1とする。
(2)Add_Movable(index_rot[nm], 0, 0, _p_l)を実行する。Evacuating_Cube_Controlを実行する。
(3)Move_Module(index_rot[nm], 0, 0, _p_l)を実行する。Record_Historyを実行する(図16動作(a))。
(4)r=nm+1〜2*nm+1のすべてのrについて、Add_Movable(index_rot[r], 0, -_g_p_l, 0)を実行する。その後、Evacuating_Cube_Controlを実行する。
(5)r=nm+1〜2*nm+1のすべてのrについてMove_Module(index_rot[r], 0, -_g_p_l, 0)を実行する。Record_Historyを実行する(図16動作(b))。
(6)Add_Movable(index_rot[nm], 0, _g_p_l, 0)を実行する。Evacuating_Cube_Controlを実行する。
(7)Move_Module(index_rot[nm], 0, _g_p_l, 0)を実行する。Record_Historyを実行する(図16動作(c))。
(8)カウンタj=1〜nmまで以下を繰り返す。
(8.1)Add_Movable(index_rot[nm+j], 0, 0, _p_l)を実行する。
Add_Movable(index_rot[j-1], 0, 0, -_p_l)を実行する。
Evacuating_Cube_Controlを実行する。
(8.2)Move_Module(index_rot[nm+j], 0, 0, _p_l)を実行する。
Move_Module(index_rot[j-1], 0, 0, -_p_l)を実行する。
Record_Historyを実行する(図16動作(d))。
(8.3)r=nm+j+1〜2*nm+1のすべてのrにおいて、
Add_Movable(index_rot[r], 0, -_g_p_l, 0)を実行する。
r=0〜j-1のすべてのrにおいて、
Add_Movable(index_rot[r], 0, -_g_p_l, 0)を実行する。
r=j〜nm+jのすべてのrにおいて、
Add_Movable(index_rot[r], 0, _g_p_l, 0)を実行する。
Evacuating_Cube_Control(movable_num)を実行する。
(8.4)r=nm+j+1〜2*nm+1 のすべてのrにおいて、
Move_Module(index_rot[r], 0, -_g_p_l, 0)を実行する。
r=0〜j-1のすべてのrにおいて、
Move_Module(index_rot[r], 0, -_g_p_l, 0)を実行する。
r=j〜nm+jのすべてのrにおいて、
Move_Module(index_rot[r], 0, _g_p_l, 0)を実行する。
Record_Historyを実行する。(図16動作(e))。
(9)Add_Movable(index_rot[nm], 0, 0, -_p_l)を実行する。Evacuating_Cube_Controlを実行する。
(10)Move_Module(index_rot[nm], 0, 0, -_p_l)を実行する。Record_Historyを実行する(図16動作(f))。
(11)r=nm+1〜2*nmのすべてのrにおいて、Add_Movable(index_rot[r], 0, _g_p_l, 0)を実行したのち、Evacuating_Cube_Controlを実行する。
(12)r=nm+1〜2*nmのすべてのrにおいて、Move_Module(index_rot[r], 0, _g_p_l, 0) を実行した後、Record_Historyを実行する(図16動作(g))。
(1)線要素が正方向のとき_g_p_l←1とする。線要素が負方向のとき_g_p_l←-1とする。
(2)Add_Movable(index_rot[nm], _p_l, 0, 0)を実行する。Evacuating_Cube_Controlを実行する。
(3)Move_Module(index_rot[nm], _p_l, 0, 0)を実行する。Record_Historyを実行する(図16動作(a))。
(4)r=nm+1〜2*nm+1のすべてのrについて、Add_Movable(index_rot[r], 0, 0, -_g_p_l)を実行する。その後、Evacuating_Cube_Controlを実行する。
(5)r=nm+1〜2*nm+1のすべてのrについて、Move_Module(index_rot[r], 0, 0, -_g_p_l)を実行する。Record_Historyを実行する(図16動作(b))。
(6)Add_Movable(index_rot[nm], 0, 0, _g_p_l)を実行する。Evacuating_Cube_Controlを実行する。
(7)Move_Module(index_rot[nm], 0, 0, _g_p_l)を実行する。Record_Historyを実行する(図16動作(c))。
(8)カウンタj=1〜nmまで以下を繰り返す。
(8.1)Add_Movable(index_rot[nm+j], _p_l, 0, 0)を実行する。
Add_Movable(index_rot[j-1], -_p_l, 0, 0)を実行する。
Evacuating_Cube_Controlを実行する。
(8.2)Move_Module(index_rot[nm+j], _p_l, 0, 0)を実行する。
Move_Module(index_rot[j-1], -_p_l, 0, 0)を実行する。
Record_Historyを実行する(図16動作(d))。
(8.3)r=nm+j+1〜2*nm+1のすべてのrにおいて、
Add_Movable(index_rot[r], 0, 0, -_g_p_l)を実行する。
r=0〜j-1のすべてのrにおいて、
Add_Movable(index_rot[r], 0, 0, -_g_p_l)を実行する。
r=j〜nm+jのすべてのrにおいて、
Add_Movable(index_rot[r], 0, 0, _g_p_l)を実行する。
Evacuating_Cube_Control(movable_num)を実行する。
(8.4)r=nm+j+1〜2*nm+1のすべてのrにおいて、
Move_Module(index_rot[r], 0, 0, -_g_p_l)を実行する。
r=0〜j-1のすべてのrにおいて、
Move_Module(index_rot[r], 0, 0, -_g_p_l)を実行する。
r=j〜nm+jのすべてのrにおいて、
Move_Module(index_rot[r], 0, 0, _g_p_l)を実行する。
Record_Historyを実行する(図16動作(e))。
(9)Add_Movable(index_rot[nm], -_p_l, 0, 0) を実行する。Evacuating_Cube_Controlを実行する。
(10)Move_Module(index_rot[nm], -_p_l, 0, 0)を実行する。Record_Historyを実行する(図16動作(f))。
(11)r=nm+1〜2*nmのすべてのrにおいて、Add_Movable(index_rot[r], 0, 0, _g_p_l)を実行したのち、Evacuating_Cube_Controlを実行する。
(12) r=nm+1〜2*nmのすべてのrにおいて、Move_Module(index_rot[r], 0, 0, _g_p_l)を実行した後、Record_Historyを実行する(図16動作(g))。
角要素でのロボット位置の入れ替えの動作を図17に示す。角要素に属する二つのロボット位置の両方に接する位置にボイドのうち一つが存在し、もう一つのボイドは角要素に属する二つのロボット位置が属する面に垂直な方向に他方のボイドに接している。角要素の入れ替え動作においては、入れ替え動作の前後で入れ替え対象のロボット以外の位置は変化しない。角要素でのロボット位置入れ替え処理は以下の通りである。
(1)_s←corner[i_c]-1, _g←corner[i_c]とする。
(2)If path_perm_x[_s] = path_perm_x[_g] ,Then,
_d←1とする。
If path_perm_x[_s]は奇数, Then, _p_l = -1, Else _p_l = 1.
If path_perm_y[_s] = path_perm_y[_g] ,Then,
_d←2とする。
If path_perm_y[_s]は奇数, Then, _p_l = -1, Else _p_l = 1.
If path_perm_z[_s] = path_perm_z[_g] ,Then,
_d←3とする。
If path_perm_z[_s]は奇数, Then, _p_l = -1, Else _p_l = 1.
(3)入れ替え動作開始時の二つのボイド目標位置 (l_x[0], l_y[0], l_z[0]), (l_x[1], l_y[1], l_z[1])について、_dの値の違いにより、以下のように設定する。
_d=1のとき:
(3.1) l_x[0]←path_perm_x[_s]、l_x[1]←l_x[0]+_p_lとする。
(3.2) 位置(l_x[0], path_perm_y[_s], path_perm_z[_g])にロボットが存在しているか、もしくは、二つの現ボイド位置(void_perm_x[], void_perm_y[], void_perm_z[])のいずれかが存在している場合には、l_y[0]←path_perm_y[_s], l_z[0]←path_perm_z[_g]とする。
(3.3) (3.2)においてl_y[0], l_z[0]の値が設定されなかった場合、位置(l_x[0], path_perm_y[_g], path_perm_z[_s])にロボットが存在しているか、もしくは、二つの現ボイド位置(void_perm_x[], void_perm_y[], void_perm_z[])のいずれかが存在している場合には、l_y[0]←path_perm_y[_g], l_z[0]←path_perm_z[_s]とする。
(3.4)l_y[1]←l_y[0], l_z[1]←l_z[0]とする。
_d=2のとき:
(3.1) l_y[0]←path_perm_y[_s]、l_y[1]←l_y[0]+_p_lとする。
(3.2) 位置(path_perm_x[_s], l_y[0], path_perm_z[_g])にロボットが存在しているか、もしくは、二つの現ボイド位置(void_perm_x[], void_perm_y[], void_perm_z[])のいずれかが存在している場合には、l_x[0]←path_perm_x[_s], l_z[0]←path_perm_z[_g]とする。
(3.3) (3.2)においてl_x[0], l_z[0]の値が設定されなかった場合、位置(path_perm_x[_g], l_y[0], path_perm_z[_s])にロボットが存在しているか、もしくは、二つの現ボイド位置(void_perm_x[], void_perm_y[], void_perm_z[])のいずれかが存在している場合には、 l_x[0]←path_perm_x[_g], l_z[0]←path_perm_z[_s]とする。
(3.4)l_x[1]←l_x[0], l_z[1]←l_z[0]とする。
_d=3のとき:
(3.1) l_z[0]←path_perm_z[_s]、l_z[1]←l_z[0]+_p_lとする。
(3.2) 位置(path_perm_x[_s], path_perm_y[_g], l_z[0])にロボットが存在しているか、もしくは、二つの現ボイド位置(void_perm_x[], void_perm_y[], void_perm_z[])のいずれかが存在している場合には、l_x[0]←path_perm_x[_s], l_y[0]←path_perm_y[_g]とする。
(3.3) (3.2)においてl_x[0], l_y[0]の値が設定されなかった場合、位置(path_perm_x[_g], path_perm_y[_s], l_z[0])にロボットが存在しているか、もしくは、二つの現ボイド位置(void_perm_x[], void_perm_y[], void_perm_z[])のいずれかが存在している場合には、l_x[0]←path_perm_x[_g], l_y[0]←path_perm_y[_s]とする。
(3.4)l_x[1]←l_x[0], l_y[1]←l_y[0]とする。
(4)If _flg = 0, Then,
Navigate_Void(l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1])を実行する。
Else,
Reverse_Void_To(l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1])を実行する。
(5)At_Corner(_s, _g, l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1], _d, _p_l)を実行する。
(1)_d=1のとき、At_Corner_X( _s, _g, l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1], _d, _p_l)を実行する。
_d=2のとき、At_Corner_Y(_s, _g, l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1], _d, _p_l)を実行する。
_d=3のとき、At_Corner_Z(_s, _g, l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1], _d, _p_l)を実行する。
(1) 位置(path_perm_x[_s], path_perm_y[_s], path_perm_z[_s])にあるロボットの番号をi_sとし、位置(path_perm_x[_g], path_perm_y[_g], path_perm_z[_g])にあるロボットの番号をi_gとする。(_sx, _sy, _sz)←(Xr[i_s], Yr[i_s], Zr[i_s]), (_gx, _gy, _gz)←(Xr[i_g], Yr[i_g], Zr[i_g])とする。
(2)Add_Movable(i_s, 0, l_y[0]-_sy, l_z[0]-_sz)を実行し、Evacuating_Cube_Controlを実行する。
(3)Move_Module(i_s, 0, l_y[0]-_sy, l_z[0]-_sz)を実行する。Record_Historyを実行する(図17動作(a))。
(4)Add_Movable(i_s, _p_l, 0, 0)を実行する。Evacuating_Cube_Controlを実行する。
(5)Move_Module(i_s, _p_l, 0, 0)を実行する。Record_Historyを実行する(図17動作(b))。
(6)Add_Movable(i_g, 0, l_y[0]-_gy, l_z[0]-_gz)を実行する。Evacuating_Cube_Controlを実行する。
(7)Move_Module(i_g, 0, l_y[0]-_gy, l_z[0]-_gz)を実行する。Record_Historyを実行する(図17動作(c))。
(8)Add_Movable(i_g, 0, _sy-l_y[0], _sz-l_z[0])を実行する。Evacuating_Cube_Controlを実行する。
(9)Move_Module(i_g, 0, _sy-l_y[0], _sz-l_z[0])を実行する。Record_Historyを実行する(図17動作(d))。
(10)Add_Movable(i_s, -_p_l, 0, 0)を実行する。Evacuating_Cube_Controlを実行する。
(11)Move_Module(i_s, -_p_l, 0, 0)を実行する。Record_Historyを実行する(図17動作(e))。
(12)Add_Movable(i_s, 0, _gy-l_y[0], _gz-l_z[0])を実行する。Evacuating_Cube_Controlを実行する。
(13)Move_Module(i_s, 0, _gy-l_y[0], _gz-l_z[0])を実行する。Record_Historyを実行する(図17動作(f))。
(1) 位置(path_perm_x[_s], path_perm_y[_s], path_perm_z[_s])にあるロボットの番号をi_sとし、位置(path_perm_x[_g], path_perm_y[_g], path_perm_z[_g])にあるロボットの番号をi_gとする。(_sx, _sy, _sz)←(Xr[i_s], Yr[i_s], Zr[i_s]), (_gx, _gy, _gz)←(Xr[i_g], Yr[i_g], Zr[i_g])とする。
(2) Add_Movable(i_s, l_x[0]-_sx, 0, l_z[0]-_sz)を実行し、Evacuating_Cube_Controlを実行する。
(3)Move_Module(i_s, l_x[0]-_sx, 0, l_z[0]-_sz)を実行する。Record_Historyを実行する(図17動作(a))。
(4)Add_Movable(i_s, 0, _p_l, 0)を実行する。Evacuating_Cube_Controlを実行する。
(5)Move_Module(i_s, 0, _p_l, 0)を実行する。Record_Historyを実行する(図17動作(b))。
(6)Add_Movable(i_g, l_x[0]-_gx, 0, l_z[0]-_gz)を実行する。Evacuating_Cube_Controlを実行する。
(7)Move_Module(i_g, l_x[0]-_gx, 0, l_z[0]-_gz)を実行する。Record_Historyを実行する(図17動作(c))。
(8)Add_Movable(i_g, _sx-l_x[0], 0, _sz-l_z[0]) を実行する。Evacuating_Cube_Controlを実行する。
(9)Move_Module(i_g, _sx-l_x[0], 0, _sz-l_z[0]) を実行する。Record_Historyを実行する(図17動作(d))。
(10)Add_Movable(i_s, 0, -_p_l, 0)を実行する。Evacuating_Cube_Controlを実行する。
(11)Move_Module(i_s, 0, -_p_l, 0)を実行する。Record_Historyを実行する(図17動作(e))。
(12)Add_Movable(i_s, _gx-l_x[0], 0, _gz-l_z[0])を実行する。Evacuating_Cube_Controlを実行する。
(13)Move_Module(i_s, _gx-l_x[0], 0, _gz-l_z[0])を実行する。Record_Historyを実行する(図17動作(f))。
(1) 位置(path_perm_x[_s], path_perm_y[_s], path_perm_z[_s])にあるロボットの番号をi_sとし、位置(path_perm_x[_g], path_perm_y[_g], path_perm_z[_g])にあるロボットの番号をi_gとする。(_sx, _sy, _sz)←(Xr[i_s], Yr[i_s], Zr[i_s]), (_gx, _gy, _gz)←(Xr[i_g], Yr[i_g], Zr[i_g])とする。
(2)Add_Movable(i_s, l_x[0]-_sx, l_y[0]-_sy, 0)を実行し、Evacuating_Cube_Controlを実行する。
(3)Move_Module(i_s, l_x[0]-_sx, l_y[0]-_sy, 0)を実行する。Record_Historyを実行する(図17動作(a))。
(4)Add_Movable(i_s, 0, 0, _p_l)を実行する。Evacuating_Cube_Controlを実行する。
(5)Move_Module(i_s, 0, 0, _p_l)を実行する。Record_Historyを実行する(図17動作(b))。
(6)Add_Movable(i_g, l_x[0]-_gx, l_y[0]-_gy, 0)を実行する。Evacuating_Cube_Controlを実行する。
(7)Move_Module(i_g, l_x[0]-_gx, 0, l_y[0]-_gy, 0)を実行する。Record_Historyを実行する(図17動作(c))。
(8)Add_Movable(i_g, _sx-l_x[0], _sy-l_y[0], 0)を実行する。Evacuating_Cube_Controlを実行する。
(9)Move_Module(i_g, _sx-l_x[0], _sy-l_y[0], 0)を実行する。Record_Historyを実行する(図17動作(d))。
(10)Add_Movable(i_s, 0, 0, -_p_l)を実行する。Evacuating_Cube_Controlを実行する。
(11)Move_Module(i_s, 0, 0, -_p_l)を実行する。Record_Historyを実行する(図17動作(e))。
(12)Add_Movable(i_s, _gx-l_x[0], _gy-l_y[0], 0)を実行する。Evacuating_Cube_Controlを実行する。
(13)Move_Module(i_s, _gx-l_x[0], 0, _gy-l_y[0], 0)を実行する。Record_Historyを実行する(図17動作(f))。
線要素または角要素でのロボット位置入れ替えが終わり、次の要素内でのロボット入れ替えを開始するときに、二つのボイド位置を次の要素内でのロボット入れ替え開始時の初期位置に移動させる必要がある。Robot_Exchange_1を実行する間に、ボイドの移動に伴って、いくつかのロボットの位置は変化するが、Robot_Exchange_2を実行する際にそれらはもとに戻されるように制御される。ボイドの制御は、先述のNavigate_VoidとReverse_Void_Toによって行われる。Robot_Exchange_1を実行する間のボイドの制御は、Navigate_Voidで行い、Robot_Exchange_2を実行する間のボイドの制御は、Navigate_Voidにて記録されたボイド動作の履歴データを逆再生する形で行う。ボイドの移動するパスは、ロボット位置入れ替えパス上のすべての位置(path_perm_x[], path_perm_y[], path_perm_z[])を通らないように設定される。
(1)((void_perm_x[0], void_perm_y[0], void_perm_z[0]) = (l_x[0], l_y[0], l_z[0]) && (void_perm_x[1], void_perm_y[1], void_perm_z[1]) = (l_x[1], l_y[1], l_z[1])) || ((void_perm_x[0], void_perm_y[0], void_perm_z[0]) = (l_x[1], l_y[1], l_z[1]) && (void_perm_x[1], void_perm_y[1], void_perm_z[1]) = (l_x[0], l_y[0], l_z[0]))でないとき(つまり、二つのボイド位置が二つの目標位置(l_x[], l_y[], l_z[])の両方に一致していないとき)、(2)以下を実行する。
(2)Void_Manhattanを実行し、現ボイド位置からの各ロボット位置のマンハッタン距離を計算する。
(3)Void_Move(l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1])を実行し、ボイドを移動させる。
(1)G内にある各ロボットiの位置(Xr[i],Yr[i],Zr[i])において、next_p[a][i]を用意し、隣接する行動aの方向に他のロボットがあるか、二つの現ボイド位置(void_perm_x[], void_perm_y[], void_perm_z[])のいずれかがある場合には、next_p[a][i]←1とし、それ以外の場合はnext_p[a][i]←0とする。
(2)各ロボットiの位置のマンハッタン距離δv[i]をG内の格子数より大きな値s_maxに初期化する。
(3) すべてのロボットiと行動aについて、next_p[a][i]=1のとき、行動aによってロボットiの位置から移動した先の位置にあるロボットjのマンハッタン距離δv[j]を調べ、その最小値に1を加えた値が、現在のδp[i]よりも小さいときは、その値をδv[i]に代入する。また、それに優先して、行動aによってロボットiの位置から移動した先の位置にボイドがある場合は、1をδv[i]に代入する。
(4)上述の(3)の処理にて、δv[i]値の更新がなくなるまで、(3)を繰り返す。
(1)ボイド目標位置(l_x[0], l_y[0], l_z[0])、(l_x[1], l_y[1], l_z[1])の両方にロボットが存在するとき、それらのロボットのうち、δvの値の大きい方を_g_0、小さい方を_g_1とし、(2)〜(7)を実行する(各変数の説明は図18を参照)。
(2)ロボット_g_0からロボット_g_1の位置を経て、現ボイド位置に至るパスに含まれるロボット数を格納する変数をtrj_numとし、値を2に初期化する。 パス中のロボット番号を格納する変数をp_trj[t](t=0,…)とし、p_trj[0]=_g_0, p_trj[1]=_g_1とする。t←2とする。
(3) δv[p_trj[t-1]]=1でないとき、ロボットp_trj[t-1]から各行動aによって移動した先にある隣接ロボットj’のうち、δv[j’]の値がδv[p_trj[t-1]]‐1となるロボットj’を選択し、p_trj[t]=j’とする。tをインクリメントする。(3)を繰り返す。δv[p_trj[t-1]]=1のとき、trj_num=tとして終了する。
(4)t=2〜trj_num+1のすべてのtにおいて、(_px[t], _py[t], _pz[t])←(Xr[p_trj[trj_num-(t-1)], Yr[p_trj[trj_num-(t-1)], Zr[p_trj[trj_num-(t-1)]])とする。
(5)If ボイド位置(void_perm_x[0], void_perm_y[0], void_perm_z[0])が位置(_px[2], _py[2], _pz[2])に隣接している, Then,
(_px[1], _py[1], _pz[1])←(void_perm_x[0], void_perm_y[0], void_perm_z[0])、
(_px[0], _py[0], _pz[0])←(void_perm_x[1], void_perm_y[1], void_perm_z[1])とする。
(6) If ボイド位置(void_perm_x[1], void_perm_y[1], void_perm_z[1])が位置(_px[2], _py[2], _pz[2])に隣接している, Then,
(_px[1], _py[1], _pz[1])←(void_perm_x[1], void_perm_y[1], void_perm_z[1])、
(_px[0], _py[0], _pz[0])←(void_perm_x[0], void_perm_y[0], void_perm_z[0])とする。
(7) t=trj_num-1〜0において、以下を繰り返す。
j=0〜1において、以下を繰り返す。
(7.1)(_xd, _yd, _zd)←(Xr[p_trj[t]], Yr[p_trj[t]], Zr[p_trj[t]])。
(7.2)Add_Movable(p_trj[t],
_px[(trj_num-1)-t+(1-j)]-_px[(trj_num-1)-t+(2-j)],
_py[(trj_num-1)-t+(1-j)]-_py[(trj_num-1)-t+(2-j)],
_pz[(trj_num-1)-t+(1-j)]-_pz[(trj_num-1)-t+(2-j)] )を実行する。
Evacuating_Cube_Controlを実行する。
(7.3)Move_Module(p_trj[t],
_px[(trj_num-1)-t+(1-j)]-_px[(trj_num-1)-t+(2-j)],
_py[(trj_num-1)-t+(1-j)]-_py[(trj_num-1)-t+(2-j)],
_pz[(trj_num-1)-t+(1-j)]-_pz[(trj_num-1)-t+(2-j)])を実行する。
Record_Historyを実行する。
(7.4)ロボットp_trj[t]の動作aをUpdate_Void_Navigation(_p_trj[t], a)にて
記録する。
(8)ボイド目標位置(l_x[0], l_y[0], l_z[0])、(l_x[1], l_y[1], l_z[1])のどちらか一方のみにロボットが存在するとき、そのロボットを_g_0とし、(9)〜(15)を実行する(各変数の説明は図19を参照)。
(9)ボイド目標位置と一致している方の現ボイド位置をバッファ(_xd[0],_yd[0],_zd[0])に格納し、一致していない方の現ボイド位置をバッファ(_xd[1],_yd[1],_zd[1])に格納する。
(10)Add_Movable(_g_0, _xd[0]-Xr[_g_0], _yd[0]-Yr[_g_0], _zd[0]-Zr[_g_0])を実行する。Evacuating_Cube_Controlを実行する。
(11)Move_Module(_g_0, _xd[0]-Xr[_g_0], _yd[0]-Yr[_g_0], _zd[0]-Zr[_g_0])を実行する。Record_Historyを実行する。
(12)ロボット_g_0の動作aをUpdate_Void_Navigation(_g_0, a)にて記録する。
(13)Add_Movable(_g_0, _xd[1]-Xr[_g_0], _yd[1]-Yr[_g_0], _zd[1]-Zr[_g_0])を実行する。Evacuating_Cube_Controlを実行する。
(14)Move_Module(_g_0, _xd[1]-Xr[_g_0], _yd[1]-Yr[_g_0], _zd[1]-Zr[_g_0])を実行する。Record_Historyを実行する。
(15) ロボット_g_0の動作aをUpdate_Void_Navigation(_g_0, a)にて記録する。
(1)行動aと逆方向の向きの行動をa_invとする。
(2)void_navi_dir[t_void]←a_inv, void_navi_num[t_void]←iとする。
(3)t_voidをインクリメントする。
(1)((void_perm_x[0], void_perm_y[0], void_perm_z[0]) = (l_x[0], l_y[0], l_z[0]) && (void_perm_x[1], void_perm_y[1], void_perm_z[1]) = (l_x[1], l_y[1], l_z[1])) || ((void_perm_x[0], void_perm_y[0], void_perm_z[0]) = (l_x[1], l_y[1], l_z[1]) && (void_perm_x[1], void_perm_y[1], void_perm_z[1]) = (l_x[0], l_y[0], l_z[0]))になるまで(すなわち、二つのボイド位置が、二つの目標位置(l_x[], l_y[], l_z[])の両方に一致するまで)、Reverse_Void_Moveを繰り返し実行する。
(1)t_voidをデクリメントする。
(2)
void_navi_dir[t_void]=1のとき:
Add_Movable(void_navi_num[t_void], 1, 0, 0)を実行する。
void_navi_dir[t_void]=3のとき:
Add_Movable(void_navi_num[t_void], -1, 0, 0)を実行する。
void_navi_dir[t_void]=2のとき:
Add_Movable(void_navi_num[t_void], 0, 1, 0)を実行する。
void_navi_dir[t_void]=4のとき:
Add_Movable(void_navi_num[t_void], 0, -1, 0)を実行する。
void_navi_dir[t_void]=5のとき:
Add_Movable(void_navi_num[t_void], 0, 0, 1)を実行する。
void_navi_dir[t_void]=6のとき:
Add_Movable(void_navi_num[t_void], 0, 0, -1)を実行する。
(3)Evacuating_Cube_Controlを実行する。
(4)
void_navi_dir[t_void]=1のとき:
Move_Module(void_navi_num[t_void], 1, 0, 0)を実行する。
void_navi_dir[t_void]=3のとき:
Move_Module(void_navi_num[t_void], -1, 0, 0)を実行する。
void_navi_dir[t_void]=2のとき:
Move_Module(void_navi_num[t_void], 0, 1, 0)を実行する。
void_navi_dir[t_void]=4のとき:
Move_Module(void_navi_num[t_void], 0, -1, 0)を実行する。
void_navi_dir[t_void]=5のとき:
Move_Module(void_navi_num[t_void], 0, 0, 1)を実行する。
void_navi_dir[t_void]=6のとき:
Move_Module(void_navi_num[t_void], 0, 0, -1)を実行する。
(5)Record_Historyを実行する。
Robot_Exchangeの終了後に実行されるボイド消去処理手順Void_UnGenerationでは、G外に待避してあったロボットout_0とout_1がG内に戻される。Void_UnGenerationの実行前に、ボイドの位置は、ボイドが生成された直後の位置に戻されている。ボイド消去におけるロボットの動作は、ほぼ生成時のときの逆再生動作になるが、Robot_Exchangeを実行中に、待避ロボットの位置が変化している場合もあるので、厳密には常にそうとは限らない。
(1)ボイドの位置(void_perm_x[], void_perm_y[], void_perm_z[])をG外のいずれかの位置の値に設定する。
(2)(escape_cube_buffer_x[0], escape_cube_buffer_y[0], escape_cube_buffer_z[0])がロボットout_0の位置に、(escape_cube_buffer_x[1], escape_cube_buffer_y[1], escape_cube_buffer_z[1])がロボットout_1の位置に等しくない場合は、待避ロボットをボイド生成時の位置に戻すために、以下を実行する。
(2.1)as=1 || as=3のとき(asはVoid_Generationで定義したもの):
If Yr[out_0] % 2 = 1, Then,
Move_Module(out_0, 0, -1, 0)を実行する。
Move_Module(out_1, 0, -1, 0)を実行する。
Record_Historyを実行する。
Else,
Move_Module(out_0, 0, 1, 0)を実行する。
Move_Module(out_1, 0, 1, 0)を実行する。
Record_Historyを実行する。
(2.2) as=2 || as=4のとき:
If Zr[out_0] % 2 = 1, Then,
Move_Module(out_0, 0, 0, -1)を実行する。
Move_Module(out_1, 0, 0, -1)を実行する。
Record_Historyを実行する。
Else,
Move_Module(out_0, 0, 0, 1)を実行する。
Move_Module(out_1, 0, 0, 1)を実行する。
Record_Historyを実行する。
(2.3) as=5 || as=6のとき:
If Xr[out_0] % 2 = 1, Then,
Move_Module(out_0, -1, 0, 0)を実行する。
Move_Module(out_1, -1, 0, 0)を実行する。
Record_Historyを実行する。
Else,
Move_Module(out_0, 1, 0, 0)を実行する。
Move_Module(out_1, 1, 0, 0)を実行する。
Record_Historyを実行する。
(3) 待避ロボットのGへの格納を以下の処理により行う。
(3.1)as=1のとき:
Move_Module(out_1, -1, 0, 0)を実行する。
Record_Historyを実行する。
If Zr[out_0] % 2 = 1, Then,
Move_Module(out_0, 0, 0, -1)を実行する。
Else,
Move_Module(out_0, 0, 0, 1)を実行する。
Record_Historyを実行する。
Move_Module(out_0, -1, 0, 0)を実行する。
Move_Module(out_1, -1, 0, 0)を実行する。
Record_Historyを実行する。
(3.2)as=2のとき:
Move_Module(out_1, 0, -1, 0)を実行する。
Record_Historyを実行する。
If Xr[out_0] % 2 = 1、Then,
Move_Module(out_0, -1, 0, 0)を実行する。
Else,
Move_Module(out_0, 1, 0, 0)を実行する。
Record_Historyを実行する。
Move_Module(out_0, 0, -1, 0)を実行する。
Move_Module(out_1, 0, -1, 0)を実行する。
Record_Historyを実行する。
(3.3)as=3のとき:
Move_Module(out_1, 1, 0, 0)を実行する。
Record_Historyを実行する。
If Zr[out_0] % 2 = 1, Then,
Move_Module(out_0, 0, 0, -1)を実行する。
Else,
Move_Module(out_0, 0, 0, 1)を実行する。
Record_Historyを実行する。
Move_Module(out_0, 1, 0, 0)を実行する。
Move_Module(out_1, 1, 0, 0)を実行する。
Record_Historyを実行する。
(3.4)as=4のとき:
Move_Module(out_1, 0, 1, 0)を実行する。
Record_Historyを実行する。
If Xr[out_0] % 2 = 1, Then,
Move_Module(out_0, -1, 0, 0)を実行する。
else,
Move_Module(out_0, 1, 0, 0)を実行する。
Record_Historyを実行する。
Move_Module(out_0, 0, 1, 0)を実行する。
Move_Module(out_1, 0, 1, 0)を実行する。
Record_Historyを実行する。
(3.5)as=5のとき:
Move_Module(out_1, 0, 0, -1)を実行する。
Record_Historyを実行する。
If Yr[out_0] % 2 = 1, Then,
Move_Module(out_0, 0, -1, 0)を実行する。
Else,
Move_Module(out_0, 0, 1, 0)を実行する。
Record_Historyを実行する。
Move_Module(out_0, 0, 0, -1)を実行する。
Move_Module(out_1, 0, 0, -1)を実行する。
Record_Historyを実行する。
(3.6)as=6のとき:
Move_Module(out_1, 0, 0, 1)を実行する。
Record_Historyを実行する。
If Yr[out_0] % 2 = 1, Then,
Move_Module(out_0, 0, -1, 0)を実行する。
Else,
Move_Module(out_0, 0, 1, 0)を実行する。
Record_Historyを実行する。
Move_Module(out_0, 0, 0, 1)を実行する。
Move_Module(out_1, 0, 0, 1)を実行する。
Record_Historyを実行する。
Robot_Exchange実行中にロボットを移動させるMove_Module処理を呼び出す前の段階で、そのMove_Moduleで実行しようとしているロボット移動が、二つの待避ロボットout_0、out_1の他のロボットからのディスコネクションを引き起こさないかチェックし、引き起こす場合には、待避ロボットの位置を変更して、ディスコネクションを回避する機能を、前述の通り、Add_MovableとEvacuating_Cube_Controlで実装する。
(1)これから動作しようとしているロボット番号を格納する変数movable_cubes[]、これから動作しようとするロボットの数を格納する変数movable_numとし、movable_cubes [movable_num]←iとする。
(2)これから動作しようとしているロボットの移動方向を格納する変数の値を設定する。すなわち、movable_vx[movable_num]←_vx, movable_vy[movable_num]←_vy, movable_vz[movable_num]←_vzとする。
(3)movable_numをインクリメントする。
(1)ロボットout_0かロボットout_1にasの逆の方向で接している(面Ssを介して接している)ロボットがあるかチェックする。そのようなロボットがある場合、そのロボットの番号のすべてがこれから動作しようとしているロボット(movable_cubes[im], im=0,1,…,movable-1)に含まれるかどうかをチェックし、含まれないものがある場合は終了する。すべて含まれる場合は、ロボットout_0,out_1のいずれかに接していて、かつ、movable_num個のロボットmovable_cubes[]に含まれる最多で2つのロボットをロボットmovable_cubes[im0], movable_cubes[im1]とする。
(2)ロボットmovable_cubes[im0], movable_cubes[im1]について、ロボットmovable_cubes[im0], movable_cubes[im1]が、それぞれ(movable_vx[im0], movable_vy[im0], movable_vz[im0]), (movable_vx[im1], movable_vy[im1], movable_vz[im1])が示すベクトル量だけ移動した後も、ロボットout_0,out_1のいずれかに接しているかどうかをチェックする。ロボットmovable_cubes[im0], movable_cubes[im1]のうち、少なくとも一つが接しているならば、終了する。
(3)ロボットmovable_cubes[im0], movable_cubes[im1]に、それぞれベクトル(-movable_vx[im0], -movable_vy[im0], -movable_vz[im0]), (-movable_vx[im1], -movable_vy[im1], -movable_vz[im1])の指す方向で接しているmovable_cubes[]に属するロボットがあった場合、それらをロボットmovable_cubes[entail_im0], movable_cubes[entail_im1]とし、ロボットmovable[im0]とロボットmovable_cubes[entail_im0]の移動方向が同じとき、すなわち(movable_vx[im0], movable_vy[im0], movable_vz[im0])=(movable_vx[entail_im0], movable_vy[entail_im0], movable_vz[entail_im0])のときには終了する。ロボットmovable[im1]とロボットmovable_cubes[entail_im1]の移動方向が同じとき、すなわち(movable_vx[im1], movable_vy[im1], movable_vz[im1])=(movable_vx[entail_im1], movable_vy[entail_im1], movable_vz[entail_im1])のときには終了する。
(4)面Ssにあるロボットが2つのみであり、それらの位置関係がSs内において対角の位置であるとき、それらのロボットのうち、ロボットout_0にもout_1にも接していないものをロボットtmp_moveとし、接しているものをロボットno_tmp_moveする。ロボットtmp_moveをロボットno_tmp_moveに接し、ロボットout_0, out_1に接しない位置に1ステップ移動させる。(例:as=1,3のときは、Zr[tmp_move]が奇数なら、Z負方向に1ステップ移動させる)。Record_Historyを実行する。
(5)以下の待避動作を行う。
(5.1)as=1,3のとき:
If Yr[out_0]が奇数 Then, ロボットout_0,out_1をY負方向に1ステップ移動。
Else, ロボットout_0,out_1をY正方向に1ステップ移動。
(5.2)as=2,4のとき:
If Zr[out_0]が奇数 Then, ロボットout_0,out_1をZ負方向に1ステップ移動。
Else, ロボットout_0,out_1をZ正方向に1ステップ移動。
(5.3)as=5,6のとき:
If Xr[out_0]が奇数 Then, ロボットout_0,out_1をX負方向に1ステップ移動。
Else, ロボットout_0,out_1をX正方向に1ステップ移動。
(6)Record_Historyを実行する。
(7)(4)にて移動させたロボットtmp_moveがある場合、ロボットtmp_moveを(4)での動作と逆方向に1ステップ移動させる。Record_Historyを実行する。
(1)変数(bad_place_x[], bad_place_y[], bad_place_z[]),bad_numを定義する。bad_num ←0とする。
(2) i=0〜_g-_sのすべての値にて、以下を実行する。
(2.1)(bad_place_x[bad_num], bad_place_y[bad_num], bad_place_y[bad_num])←(path_perm_x[_s+i], path_perm_y[_s+i], path_perm_z[_s+i])とする。
bad_numをインクリメントする。
(2.2)
_d=1のとき:(線要素がX向き)
(bad_place_x[bad_num], bad_place_y[bad_num], bad_place_y[bad_num])←(path_perm_x[_s+i], path_perm_y[_s+i]+_pl, path_perm_z[_s+i])とする。
_d=2のとき:(線要素がY向き)
(bad_place_x[bad_num], bad_place_y[bad_num], bad_place_y[bad_num])←(path_perm_x[_s+i], path_perm_y[_s+i], path_perm_z[_s+i] +_pl)とする。
_d=3のとき:(線要素がZ向き)
(bad_place_x[bad_num], bad_place_y[bad_num], bad_place_y[bad_num])←(path_perm_x[_s+i] +_pl, path_perm_y[_s+i], path_perm_z[_s+i])とする。
(2.3)bad_numをインクリメントする。
(3)ロボットout_0,out_1が位置(bad_place_x[], bad_place_y[], bad_place_y[])に接しているかどうか調べる。ロボットout_0,out_1のうち少なくとも1つが接していなければ終了する。
(4)ロボットout_0,out_1の接する(bad_place_x[], bad_place_y[], bad_place_y[])内の位置を(bad_place_x[o_0], bad_place_y[o_0], bad_place_y[o_0]), (bad_place_x[o_1], bad_place_y[o_1], bad_place_y[o_1])とする。
(5)ロボットout_0,out_1を以下のようにして安全なところに移動させる。
(5.1)as=1, 3のとき:
_d=1, 3のとき:(ロボットout_0,out_1が(bad_place_x[], bad_place_y[],bad_place_y[])に接しない位置にスライド移動する。)
If Yr[out_0]が奇数, Then,
ロボットout_0,out_1をY負方向に1ステップ移動。
Else,
ロボットout_0,out_1をY正方向に1ステップ移動。
_d=2のとき:(図20の位置(a)〜(f)をすべて避ける。)
If nm > 0, Then, (図20の位置(a),(c),(d),(f)をすべて避ける。)
If (o_0= 2*nm+2 && o_1= 2*nm+3) || (o_0= 2*nm+3 && o_1= 2*nm+2)
|| (o_0= 0 && o_1= 1) || (o_0= 1 && o_1= 0), Then,
If Yr[out_0]が奇数, Then,
ロボットout_0,out_1をY負方向に1ステップ移動。
Else,
ロボットout_0,out_1をY正方向に1ステップ移動。
Else, (図20の位置(d),(f)以外をすべて避ける。)
If !( (o_0= 0 && o_1= 1) || (o_0= 1 && o_1= 0) ) Then,
If Yr[out_0]が奇数, Then,
ロボットout_0,out_1をY負方向に1ステップ移動。
Else,
ロボットout_0,out_1をY正方向に1ステップ移動。
(5.2)as=2, 4のとき:
_d=1, 2のとき:(ロボットout_0,out_1が(bad_place_x[], bad_place_y[], bad_place_y[])に接しない位置にスライド移動する。)
If Zr[out_0]が奇数, Then,
ロボットout_0,out_1をZ負方向に1ステップ移動。
Else,
ロボットout_0,out_1をZ正方向に1ステップ移動。
_d=3のとき:(図20の位置(a)〜(f)をすべて避ける。)
If nm > 0, Then, (図20の位置(a),(c),(d),(f)をすべて避ける。)
If (o_0= 2*nm+2 && o_1= 2*nm+3) || (o_0= 2*nm+3 && o_1= 2*nm+2)
|| (o_0= 0 && o_1= 1) || (o_0= 1 && o_1= 0), Then,
If Zr[out_0]が奇数, Then,
ロボットout_0,out_1をZ負方向に1ステップ移動。
Else,
ロボットout_0,out_1をZ正方向に1ステップ移動。
Else, (図20の位置(d),(f)以外をすべて避ける。)
If !( (o_0= 0 && o_1= 1) || (o_0= 1 && o_1= 0) ) Then,
If Zr[out_0]が奇数, Then,
ロボットout_0,out_1をZ負方向に1ステップ移動。
Else,
ロボットout_0,out_1をZ正方向に1ステップ移動。
(5.3)as=5, 6のとき:
_d=2, 3のとき:(ロボットout_0,out_1が(bad_place_x[], bad_place_y[], bad_place_y[])に接しない位置にスライド移動する。)
If Xr[out_0]が奇数, Then,
ロボットout_0,out_1をX負方向に1ステップ移動。
Else,
ロボットout_0,out_1をX正方向に1ステップ移動。
_d=1のとき:(図20の位置(a)〜(f)をすべて避ける。)
If nm > 0, Then, (図20の位置(a),(c),(d),(f)をすべて避ける。)
If (o_0= 2*nm+2 && o_1= 2*nm+3) || (o_0= 2*nm+3 && o_1= 2*nm+2)
|| (o_0= 0 && o_1= 1) || (o_0= 1 && o_1= 0), Then,
If Xr[out_0]が奇数, Then,
ロボットout_0,out_1をX負方向に1ステップ移動。
Else,
ロボットout_0,out_1をX正方向に1ステップ移動。
Else, (図20の位置(d),(f)以外をすべて避ける。)
If !( (o_0= 0 && o_1= 1) || (o_0= 1 && o_1= 0) ) Then,
If Xr[out_0]が奇数, Then,
ロボットout_0,out_1をX負方向に1ステップ移動。
Else,
ロボットout_0,out_1をX正方向に1ステップ移動。
(6)Record_Historyを実行する。
第一実施形態に係る行動制御システム100は、以上に説明した各処理によって構成される。全体動作(ホモジニアス隊列制御とロボット位置入れ替え制御)について以下にまとめる。
(1)移動先隊列決定用動作計画のために使用するマンハッタン距離δ(各位置単位から入口位置単位PeUまでのマンハッタン距離)を計算する。
(2)以下(3),(4)を全GU内にロボットが充填されるまで繰り返す。
(3)移動先隊列決定用動作計画処理Next_Formation_Decisionを実行する。
(4)各ロボット動作決定用動作計画処理(ここではVoid_Control)を実行する。
(5)ロボット位置入れ替え制御処理手順(Robot_Position_Permutation)を実行する。つまり、すべてのロボットについて、各個ロボットの位置が目標位置に到達している状態になるまで、各個ロボット位置入れ替え制御処理手順(Each_Robot_Position_Exchange)を実行する。
動作計画部110は、上述の[マンハッタン距離δの計算]及び[パスPの決定]で説明した方法により、開始位置の集合SU、目標位置の集合GU及びパスPの何れかの各位置から入口位置Peまでのマンハッタン距離δを、ロボットの任務行動開始前に事前に計算し(S110)、記憶部140に格納する。ただし、目標位置の集合の各位置から入口位置Peまでのマンハッタン距離δは、その符号を負とする。また、開始位置の集合SU、目標位置の集合GU及びパスPの何れにも含まれないすべての位置のマンハッタン距離δをs_max(状態空間内の格子数より大きな値)として記憶部140に格納する。なお、別装置でマンハッタン距離δを計算しておき、ロボットの任務行動開始前に事前に記憶部140に格納しておけば、行動制御システム100は、動作計画部110を備えなくともよい。
入力部160には、p個の開始位置の集合S={(Xr0[0],Yrs[0]),(Xr0[1],Yrs[1]),…,(Xr0[p-1],Yrs[p-1])}及びp個の目標位置の集合G={(Xre[0],Yre[0]),(Xre[1],Yre[1]),…,(Xre[p-1],Yre[p-1])}が入力され、記憶部140に記憶される。
記憶部140には、各位置sから入口位置Peまでのマンハッタン距離δが記憶されているとする。sの取りうる範囲は、対象となる三次元空間上の領域内のロボット単位が存在しうるすべての座標である。
行動制御システム100が実装されているロボットも含め、すべてのロボットは、通信部150を介して、三次元平面上の上下左右前後方向(以下「6方向」ともいう)において隣接する他のロボットと通信することができる。
行動選択部120は、記憶部140からマンハッタン距離δを取り出す。
位置更新部123は、各i=0,1,…,p-1について、i番目のロボットの現在の位置(Xr[i],Yr[i])において、行動選択部120で決定した行動を実行した場合のロボットの移動後(行動後)の位置(Xr'[i],Yr'[i])を計算し、計算された(Xr'[i],Yr'[i])で記憶部140に格納されたi番目のロボットの位置を更新する(S123)。言い換えれば、位置更新部123は、行動選択部120で決定した行動に基づいて、ロボットが行動した場合に想定される位置(以下、「想定位置」ともいう)を計算し、ロボットの位置を更新し記憶部140に格納する。具体的には、図22のS123(位置の更新)を行う。
隣接状態判定部124は、ロボットの三次元空間上の上下左右前後の隣接する位置に、障害物または他のロボットが存在するか否かを判定し、(S124),判定結果を記憶部140に格納する。
位置判定部126は、隣接状態判定部124の判定結果を用いて、行動後位置を求め、行動後位置(Xr"[i],Yr"[i])と想定位置(Xr'[i],Yr'[i])とが一致するか否かを判定する(S126)。なお、一致しない場合には、移動するように制御されたロボットが何らかのトラブルにより、制御通りに移動できなかったと考えられる。この場合、行動後位置(Xr"[i],Yr"[i])と想定位置(Xr'[i],Yr'[i])との少なくとも一方を補正すればよい。補正方法としては様々な手法が考えられる。例えば、移動したすべてのロボットに対して、制御前の位置に戻るように指示し、行動後位置(Xr"[i],Yr"[i])を補正してもよいし、想定位置(Xr'[i],Yr'[i])を行動後位置(Xr"[i],Yr"[i])に合わせて補正してもよい。
各個制御対象物位置入れ替え制御部130は、ロボットiの位置が移動先ロボット位置d(i)に一致しない(i=d(i)でない)最小のiについて、各個ロボット位置入れ替え制御処理手順(Each_Robot_Position_Exchange)を行う(S130)。
このような構成により、多数のロボットの存在を考慮しつつも、計画計算に必要な計算時間や計算機の記憶容量を少ないものに低減可能で、かつ、ロボット同士が接したままの状態を維持しつつ任意の開始位置における隊列形成状態から、他の任意の目標位置における隊列形成状態へ障害物のある環境にて各ロボット個々の位置を隊列内で指定する形の変形動作(ヘテロジニアス変形動作)を行うことを可能とし、従来よりも必要なロボット数を小さくすることができる。ロボットが変形を行う空間に含まれる格子数に比例した計算量で、ロボットのホモジニアス変形動作が可能であり、その動作の結果を利用することで、ロボット台数の2乗に比例した実行時間で、任意形状の障害物が存在する環境において、ロボットに任意の形状から任意の形状へ、各ロボット個々の位置を隊列内で指定する形での変形(ヘテロジニアス変形)をさせることが可能である。
本実施形態では、各格子(マス)は、立方体であるが、他の形状であってもよい。格子は左右方向、上下方向及び前後方向に連続して配置される。また、各格子は左右方向で他の二つの格子と隣接し、上下方向で他の二つの格子と隣接し、前後方向で他の二つの格子と隣接する。言い換えると、各格子は、ロボットの移動できる方向と同じ方向においてのみ、他の格子と隣接する。この条件を満たせば、各格子はどのような形状であってもよい。また、「直交」とは、厳密に「垂直に交わること」を意味しなくともよく、例えば、各格子は、平行六面体であってもよく、各格子が他の二つの格子と隣接する方向の一方を上下方向とし、他方を左右方向とすればよく、上下方向及び左右方向とからなる平面に対して平行でない方向を前後方向とすればよい。
待避ロボットが入れ替え対象のロボットではない場合(つまり、入れ替え対象のロボットorigin,destinationが待避ロボットout_0,out_1のいずれとも一致しない場合)には、ボイド発生処理であるVoid_Generationを省略することができる。これにより、処理の効率化を図ることができる。
(1)すべてのロボットiについて変数p(i)=0とする。(pは、ロボット位置入れ替え済み判定フラグである)。tp=0とし、Record_Historyを実行する(ただし、tpは時刻カウンタとする)。
(2)i=d(i)となるすべてのロボットiについて、p(i)=1とする。
(3)すべてのiについてp(i)=1となるまで、(4)〜(6)を繰り返す。
(4)p(i)=0である最小のiを選択する。
(5)i=d(i)でないうちは、(6)を繰り返す。
(6)入れ替え元のロボットorigin←i, 入れ替え先のロボットdestination←d(i)とし、 Each_Robot_Position_Exchange_2を実行する。
(7)Reverse_Void_To(void_buffer_x[0], void_buffer_y[0], void_buffer_z[0], void_buffer_x[1], void_buffer_y[1], void_buffer_z[1])を実行し、Void_UnGenerationを実行する。
(1)Calculate_Path_From_Origin_To_Destinationを実行する。
(2)本処理が最初に実行されるときは、Void_Generationを実行する。2回目以降の実行の場合、入れ替え元ロボットorigin, 入れ替え先ロボットdestinationのいずれかが待避ロボットout_0,out_1と一致するとき、Reverse_Void_To(void_buffer_x[0], void_buffer_y[0], void_buffer_z[0], void_buffer_x[1], void_buffer_y[1], void_buffer_z[1])を実行し、Void_UnGenerationを実行し、Void_Generationを実行する。
(3)Robot_Exchangeを実行する。
第二実施形態に係る行動制御システム200は、以上に説明したロボット位置入れ替え制御によって構成される。なお、ホモジニアス隊列制御については第一実施形態に係る行動制御システム100のそれと同一である。
各個制御対象物位置入れ替え制御部230は、ロボットiの位置が移動先ロボット位置d(i)に一致しない(i=d(i)でない)最小のiについて、各個ロボット位置入れ替え制御処理手順(Each_Robot_Position_Exchange_2)を行う(S230)。
最終ボイド消去部234は、Reverse_Void_To(void_buffer_x[0], void_buffer_y[0], void_buffer_z[0], void_buffer_x[1], void_buffer_y[1], void_buffer_z[1])、Void_UnGenerationを順に実行し、G外に待避していた2つのロボットout_0, out_1をボイド生成直前の位置にそれぞれ戻す(S240)。
本発明は上記の実施形態及び変形例に限定されるものではない。例えば、上述の各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。その他、本発明の趣旨を逸脱しない範囲で適宜変更が可能である。
また、上記の実施形態及び変形例で説明した各装置における各種の処理機能をコンピュータによって実現してもよい。その場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記各装置における各種の処理機能がコンピュータ上で実現される。
110 動作計画部
120 行動選択部
121 移動先隊列決定用動作計画部
122 各個制御対象物動作用動作計画部
123 位置更新部
124 隣接状態判定部
126 位置判定部
130 各個制御対象物位置入れ替え制御部
131 入れ替え経路生成部
132 ボイド生成部
133 入れ替え制御部
134 ボイド消去部
140 記憶部
150 通信部
160 入力部
200 行動制御システム
230 各個制御対象物位置入れ替え制御部
232 ボイド生成部
240 最終ボイド消去部
Claims (5)
- M,N,Qをそれぞれ2以上の整数の何れかとし、Rを2以上の整数の何れかとし、pをM×N×Q×Rとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に、障害物がある場合には障害物を回避しつつ、前記所定の入口位置から前記目標位置の集合に入るように、移動させるための行動制御を行う行動制御システムであって、
第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置を一つの位置単位とし、各開始位置及び各目標位置は、それぞれ前記第一方向〜第六方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、前記目標位置の集合及び前記開始位置の集合はそれぞれR個の位置単位からなる一塊の任意の形状を成し、
前記制御対象物は、当該制御対象物の3次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、3次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、
p台の前記制御対象物は、M×N×Q台毎に1つの制御対象物単位を構成し、1つの制御対象物単位を構成するM×N×Q台の制御対象物はそれぞれ3つの方向において当該制御対象物単位を構成する他の制御対象物と隣接し、
制御対象物単位がその制御対象物単位の現在の位置単位において各行動を取ったときの適切さを表す1個の価値関数に基づいて制御され、静止するか、または、3次元空間上の第一〜第六方向の何れかのM×N×Q個の位置からなる位置単位に移動するように制御されるものとし、
前記価値関数が記憶される記憶部と、
複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、隊列Gaに存在し隊列Gbに存在しない制御対象物単位を尾部制御対象物単位とし、前記開始位置の集合に配置されたp台の前記制御対象物を前記目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、前記価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画部と、
頭部制御対象物単位の位置にM×N×Q台の制御対象物が位置するように各制御対象物の動作を制御する各制御対象物動作用動作計画部と、
制御対象物の前記目標位置の集合の中での現在の位置を現在位置とし、制御対象物の現在位置が前記制御対象物の目標位置と一致しない場合、前記現在位置から前記目標位置に至る入れ替え経路を生成する入れ替え経路生成部と、
制御対象物の移動に伴って生じる、または、制御対象物の移動する方向と反対の方向に移動する仮想的な存在をボイドとし、前記目標位置の集合の中に2つのボイドを生成するボイド生成部と、
前記2つのボイドを用いて、前記入れ替え経路に沿って、前記現在位置にいる制御対象物と前記目標位置にいる制御対象物とを入れ替える入れ替え制御部と、
前記ボイド生成部がボイドを生成する際に前記目標位置の集合と隣接する位置に移動させた制御対象物を待避制御対象物とし、前記待避制御対象物を各々が存在していた前記目標位置の集合の中の元の位置に戻すことにより、前記2つのボイドを消去するボイド消去部とを含み、
前記価値関数は、各位置において隣接する第一方向〜第六方向に障害物があるか否かを考慮して計算される、ある位置単位から前記所定の入口位置を含む位置単位までのマンハッタン距離を用いて得られ、
前記移動先隊列決定用動作計画部は、前記価値関数を用いて前記頭部制御対象物単位と前記尾部制御対象物単位を決定し、隊列Gaから前記尾部制御対象物単位を削除し、前記頭部制御対象物単位を追加することにより隊列Gbを決定し、
前記各制御対象物動作用動作計画部は、隊列Gaの中で最もマンハッタン距離が小さい制御対象物単位を制御対象物単位Hとし、制御対象物単位Hから頭部制御対象物単位へ移動する方向をahとし、尾部制御対象物単位に隣接し、尾部制御対象物単位よりもマンハッタン距離が小さい制御対象物単位を制御対象物単位T'とし、尾部制御対象物単位から制御対象物単位T'へ移動する方向をatとし、制御対象物単位Hから頭部制御対象物単位へ制御対象物を移動させる際に、制御対象物単位H内に発生したボイドの位置と、他の制御対象物単位内に発生したボイドの位置とが同じになるように、ボイドを移動させるものとし、方向ahと方向atに基づき、制御対象物単位Hと頭部制御対象物単位との間、及び、尾部制御対象物単位と制御対象物単位T'との間において隣接状態を維持するように、制御対象物単位Hにおいてボイドを発生させる、
行動制御システム。 - M,N,Qをそれぞれ2以上の整数の何れかとし、Rを2以上の整数の何れかとし、pをM×N×Q×Rとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に、障害物がある場合には障害物を回避しつつ、前記所定の入口位置から前記目標位置の集合に入るように、移動させるための行動制御を行う行動制御システムであって、
第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置を一つの位置単位とし、各開始位置及び各目標位置は、それぞれ前記第一方向〜第六方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、前記目標位置の集合及び前記開始位置の集合はそれぞれR個の位置単位からなる一塊の任意の形状を成し、
前記制御対象物は、当該制御対象物の3次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、3次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、
p台の前記制御対象物は、M×N×Q台毎に1つの制御対象物単位を構成し、1つの制御対象物単位を構成するM×N×Q台の制御対象物はそれぞれ3つの方向において当該制御対象物単位を構成する他の制御対象物と隣接し、
制御対象物単位がその制御対象物単位の現在の位置単位において各行動を取ったときの適切さを表す1個の価値関数に基づいて制御され、静止するか、または、3次元空間上の第一〜第六方向の何れかのM×N×Q個の位置からなる位置単位に移動するように制御されるものとし、
前記価値関数が記憶される記憶部と、
複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、隊列Gaに存在し隊列Gbに存在しない制御対象物単位を尾部制御対象物単位とし、前記開始位置の集合に配置されたp台の前記制御対象物を前記目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、前記価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画部と、
頭部制御対象物単位の位置にM×N×Q台の制御対象物が位置するように各制御対象物の動作を制御する各制御対象物動作用動作計画部と、
制御対象物の前記目標位置の集合の中での現在の位置を現在位置とし、制御対象物の現在位置が前記制御対象物の目標位置と一致しない場合、前記現在位置から前記目標位置に至る入れ替え経路を生成する入れ替え経路生成部と、
制御対象物の移動に伴って生じる、または、制御対象物の移動する方向と反対の方向に移動する仮想的な存在をボイドとし、所定の場合に前記目標位置の集合の中に2つのボイドを生成するボイド生成部と、
前記2つのボイドを用いて、前記入れ替え経路に沿って、前記現在位置にいる制御対象物と前記目標位置にいる制御対象物とを入れ替える入れ替え制御部と、
前記ボイド生成部がボイドを生成する際に前記目標位置の集合と隣接する位置に移動させた制御対象物を待避制御対象物とし、すべての制御対象物が各々の目標位置に到達している場合に、前記待避制御対象物を各々が存在していた前記目標位置の集合の中の元の位置に戻すことにより、前記2つのボイドを消去する最終ボイド消去部とを含み、
前記価値関数は、各位置において隣接する第一方向〜第六方向に障害物があるか否かを考慮して計算される、ある位置単位から前記所定の入口位置を含む位置単位までのマンハッタン距離を用いて得られ、
前記移動先隊列決定用動作計画部は、前記価値関数を用いて前記頭部制御対象物単位と前記尾部制御対象物単位を決定し、隊列Gaから前記尾部制御対象物単位を削除し、前記頭部制御対象物単位を追加することにより隊列Gbを決定し、
前記各制御対象物動作用動作計画部は、隊列Gaの中で最もマンハッタン距離が小さい制御対象物単位を制御対象物単位Hとし、制御対象物単位Hから頭部制御対象物単位へ移動する方向をahとし、尾部制御対象物単位に隣接し、尾部制御対象物単位よりもマンハッタン距離が小さい制御対象物単位を制御対象物単位T'とし、尾部制御対象物単位から制御対象物単位T'へ移動する方向をatとし、制御対象物単位Hから頭部制御対象物単位へ制御対象物を移動させる際に、制御対象物単位H内に発生したボイドの位置と、他の制御対象物単位内に発生したボイドの位置とが同じになるように、ボイドを移動させるものとし、方向ahと方向atに基づき、制御対象物単位Hと頭部制御対象物単位との間、及び、尾部制御対象物単位と制御対象物単位T'との間において隣接状態を維持するように、制御対象物単位Hにおいてボイドを発生させ、
前記ボイド生成部がボイドを生成する所定の場合とは、前記ボイド生成部の実行が1回目であるか、または、2回目以降の場合において前記現在位置にいる制御対象物と前記目標位置にいる制御対象物のいずれかが前記2つの待避制御対象物と一致するときである、
行動制御システム。 - 行動制御システムが、M,N,Qをそれぞれ2以上の整数の何れかとし、Rを2以上の整数の何れかとし、pをM×N×Q×Rとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に、障害物がある場合には障害物を回避しつつ、前記所定の入口位置から前記目標位置の集合に入るように、移動させるための行動制御を行う行動制御方法であって、
第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置を一つの位置単位とし、各開始位置及び各目標位置は、それぞれ前記第一方向〜第六方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、前記目標位置の集合及び前記開始位置の集合はそれぞれR個の位置単位からなる一塊の任意の形状を成し、
前記制御対象物は、当該制御対象物の3次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、3次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、
p台の前記制御対象物は、M×N×Q台毎に1つの制御対象物単位を構成し、1つの制御対象物単位を構成するM×N×Q台の制御対象物はそれぞれ3つの方向において当該制御対象物単位を構成する他の制御対象物と隣接し、
制御対象物単位がその制御対象物単位の現在の位置単位において各行動を取ったときの適切さを表す1個の価値関数に基づいて制御され、静止するか、または、3次元空間上の第一〜第六方向の何れかのM×N×Q個の位置からなる位置単位に移動するように制御されるものとし、
前記価値関数は、前記行動制御システムの記憶部に記憶されるものとし、
前記行動制御システムが、複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、隊列Gaに存在し隊列Gbに存在しない制御対象物単位を尾部制御対象物単位とし、前記開始位置の集合に配置されたp台の前記制御対象物を前記目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、前記価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画ステップと、
前記行動制御システムが、頭部制御対象物単位の位置にM×N×Q台の制御対象物が位置するように各制御対象物の動作を制御する各制御対象物動作用動作計画ステップと、
前記行動制御システムが、制御対象物の前記目標位置の集合の中での現在の位置を現在位置とし、制御対象物の現在位置が前記制御対象物の目標位置と一致しない場合、前記現在位置から前記目標位置に至る入れ替え経路を生成する入れ替え経路生成ステップと、
前記行動制御システムが、制御対象物の移動に伴って生じる、または、制御対象物の移動する方向と反対の方向に移動する仮想的な存在をボイドとし、前記目標位置の集合の中に2つのボイドを生成するボイド生成ステップと、
前記行動制御システムが、前記2つのボイドを用いて、前記入れ替え経路に沿って、前記現在位置にいる制御対象物と前記目標位置にいる制御対象物とを入れ替える入れ替え制御ステップと、
前記行動制御システムが、前記ボイド生成ステップにおいてボイドを生成する際に前記目標位置の集合と隣接する位置に移動させた制御対象物を待避制御対象物とし、前記待避制御対象物を各々が存在していた前記目標位置の集合の中の元の位置に戻すことにより、前記2つのボイドを消去するボイド消去ステップとを含み、
前記価値関数は、各位置において隣接する第一方向〜第六方向に障害物があるか否かを考慮して計算される、ある位置単位から前記所定の入口位置を含む位置単位までのマンハッタン距離を用いて得られ、
前記移動先隊列決定用動作計画ステップは、前記価値関数を用いて前記頭部制御対象物単位と前記尾部制御対象物単位を決定し、隊列Gaから前記尾部制御対象物単位を削除し、前記頭部制御対象物単位を追加することにより隊列Gbを決定し、
前記各制御対象物動作用動作計画ステップでは、隊列Gaの中で最もマンハッタン距離が小さい制御対象物単位を制御対象物単位Hとし、制御対象物単位Hから頭部制御対象物単位へ移動する方向をahとし、尾部制御対象物単位に隣接し、尾部制御対象物単位よりもマンハッタン距離が小さい制御対象物単位を制御対象物単位T'とし、尾部制御対象物単位から制御対象物単位T'へ移動する方向をatとし、制御対象物単位Hから頭部制御対象物単位へ制御対象物を移動させる際に、制御対象物単位H内に発生したボイドの位置と、他の制御対象物単位内に発生したボイドの位置とが同じになるように、ボイドを移動させるものとし、方向ahと方向atに基づき、制御対象物単位Hと頭部制御対象物単位との間、及び、尾部制御対象物単位と制御対象物単位T'との間において隣接状態を維持するように、制御対象物単位Hにおいてボイドを発生させる、
行動制御方法。 - 行動制御システムが、M,N,Qをそれぞれ2以上の整数の何れかとし、Rを2以上の整数の何れかとし、pをM×N×Q×Rとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に、障害物がある場合には障害物を回避しつつ、前記所定の入口位置から前記目標位置の集合に入るように、移動させるための行動制御を行う行動制御方法であって、
第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置を一つの位置単位とし、各開始位置及び各目標位置は、それぞれ前記第一方向〜第六方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、前記目標位置の集合及び前記開始位置の集合はそれぞれR個の位置単位からなる一塊の任意の形状を成し、
前記制御対象物は、当該制御対象物の3次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、3次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、
p台の前記制御対象物は、M×N×Q台毎に1つの制御対象物単位を構成し、1つの制御対象物単位を構成するM×N×Q台の制御対象物はそれぞれ3つの方向において当該制御対象物単位を構成する他の制御対象物と隣接し、
制御対象物単位がその制御対象物単位の現在の位置単位において各行動を取ったときの適切さを表す1個の価値関数に基づいて制御され、静止するか、または、3次元空間上の第一〜第六方向の何れかのM×N×Q個の位置からなる位置単位に移動するように制御されるものとし、
前記価値関数は、前記行動制御システムの記憶部に記憶されるものとし、
前記行動制御システムが、複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、隊列Gaに存在し隊列Gbに存在しない制御対象物単位を尾部制御対象物単位とし、前記開始位置の集合に配置されたp台の前記制御対象物を前記目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、前記価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画ステップと、
前記行動制御システムが、頭部制御対象物単位の位置にM×N×Q台の制御対象物が位置するように各制御対象物の動作を制御する各制御対象物動作用動作計画ステップと、
前記行動制御システムが、制御対象物の前記目標位置の集合の中での現在の位置を現在位置とし、制御対象物の現在位置が前記制御対象物の目標位置と一致しない場合、前記現在位置から前記目標位置に至る入れ替え経路を生成する入れ替え経路生成ステップと、
前記行動制御システムが、制御対象物の移動に伴って生じる、または、制御対象物の移動する方向と反対の方向に移動する仮想的な存在をボイドとし、所定の場合に前記目標位置の集合の中に2つのボイドを生成するボイド生成ステップと、
前記行動制御システムが、前記2つのボイドを用いて、前記入れ替え経路に沿って、前記現在位置にいる制御対象物と前記目標位置にいる制御対象物とを入れ替える入れ替え制御ステップと、
前記行動制御システムが、前記ボイド生成ステップにおいてボイドを生成する際に前記目標位置の集合と隣接する位置に移動させた制御対象物を待避制御対象物とし、すべての制御対象物が目標位置に到達している場合に、前記待避制御対象物を各々が存在していた前記目標位置の集合の中の元の位置に戻すことにより、前記2つのボイドを消去する最終ボイド消去ステップとを含み、
前記価値関数は、各位置において隣接する第一方向〜第六方向に障害物があるか否かを考慮して計算される、ある位置単位から前記所定の入口位置を含む位置単位までのマンハッタン距離を用いて得られ、
前記移動先隊列決定用動作計画ステップは、前記価値関数を用いて前記頭部制御対象物単位と前記尾部制御対象物単位を決定し、隊列Gaから前記尾部制御対象物単位を削除し、前記頭部制御対象物単位を追加することにより隊列Gbを決定し、
前記各制御対象物動作用動作計画ステップでは、隊列Gaの中で最もマンハッタン距離が小さい制御対象物単位を制御対象物単位Hとし、制御対象物単位Hから頭部制御対象物単位へ移動する方向をahとし、尾部制御対象物単位に隣接し、尾部制御対象物単位よりもマンハッタン距離が小さい制御対象物単位を制御対象物単位T'とし、尾部制御対象物単位から制御対象物単位T'へ移動する方向をatとし、制御対象物単位Hから頭部制御対象物単位へ制御対象物を移動させる際に、制御対象物単位H内に発生したボイドの位置と、他の制御対象物単位内に発生したボイドの位置とが同じになるように、ボイドを移動させるものとし、方向ahと方向atに基づき、制御対象物単位Hと頭部制御対象物単位との間、及び、尾部制御対象物単位と制御対象物単位T'との間において隣接状態を維持するように、制御対象物単位Hにおいてボイドを発生させ、
前記ボイド生成ステップでボイドを生成する所定の場合とは、前記ボイド生成ステップの実行が1回目であるか、または、2回目以降の場合において前記現在位置にいる制御対象物と前記目標位置にいる制御対象物のいずれかが前記2つの待避制御対象物と一致するときである、
行動制御方法。 - 請求項1または2に記載の行動制御システムとしてコンピュータを機能させるためのプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2016139010A JP6633467B2 (ja) | 2016-07-14 | 2016-07-14 | 行動制御システム、行動制御方法、プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2016139010A JP6633467B2 (ja) | 2016-07-14 | 2016-07-14 | 行動制御システム、行動制御方法、プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2018010493A JP2018010493A (ja) | 2018-01-18 |
JP6633467B2 true JP6633467B2 (ja) | 2020-01-22 |
Family
ID=60995516
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2016139010A Active JP6633467B2 (ja) | 2016-07-14 | 2016-07-14 | 行動制御システム、行動制御方法、プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP6633467B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022239063A1 (ja) * | 2021-05-10 | 2022-11-17 | 日本電信電話株式会社 | 制御装置、方法及びプログラム |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2933247B2 (ja) * | 1991-10-29 | 1999-08-09 | 川崎重工業株式会社 | ロボット装置 |
US6477444B1 (en) * | 2000-07-07 | 2002-11-05 | Fuji Xerox Co., Ltd. | Method for the automated design of decentralized controllers for modular self-reconfigurable robots |
JP2003048179A (ja) * | 2001-05-29 | 2003-02-18 | Japan Science & Technology Corp | 複数歯車型ユニットで構成される変形可能な移動装置 |
-
2016
- 2016-07-14 JP JP2016139010A patent/JP6633467B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
JP2018010493A (ja) | 2018-01-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Bency et al. | Neural path planning: Fixed time, near-optimal path generation via oracle imitation | |
Murray et al. | Robot motion planning on a chip. | |
Ge et al. | Queues and artificial potential trenches for multirobot formations | |
JP6559591B2 (ja) | 行動制御システム、その方法及びプログラム | |
JP5997092B2 (ja) | ロボット協調搬送計画装置、方法及びプログラム | |
Bekris et al. | Cloud automation: Precomputing roadmaps for flexible manipulation | |
Yi et al. | Path planning of a manipulator based on an improved P_RRT* algorithm | |
JP6489923B2 (ja) | 行動制御システム、及びそのプログラム | |
Toma et al. | Waypoint planning networks | |
GB2227106A (en) | Detecting collision | |
Finean et al. | Simultaneous scene reconstruction and whole-body motion planning for safe operation in dynamic environments | |
Musiyenko et al. | Simulation the behavior of robot sub-swarm in spatial corridors | |
JP6685957B2 (ja) | 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム | |
JP6633467B2 (ja) | 行動制御システム、行動制御方法、プログラム | |
Rubio et al. | Trajectory planning and collisions detector for robotic arms | |
Littlefield et al. | An extensible software architecture for composing motion and task planners | |
JP6553000B2 (ja) | 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム | |
JP6559582B2 (ja) | 行動制御システム、その方法及びプログラム | |
Bekris et al. | Reducing roadmap size for network transmission in support of cloud automation | |
JP6392187B2 (ja) | 行動制御システム、その方法及びプログラム | |
JP6939395B2 (ja) | 制御装置、方法及びプログラム | |
US20200401140A1 (en) | Control apparatus, method and program | |
Jeong et al. | Behavior tree-based task planning for multiple mobile robots using a data distribution service | |
WO2022239063A1 (ja) | 制御装置、方法及びプログラム | |
JP6881352B2 (ja) | 制御装置、方法及びプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20180814 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20190614 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20190709 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20190905 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20191210 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20191212 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 6633467 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |