JP6685957B2 - 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム - Google Patents
制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム Download PDFInfo
- Publication number
- JP6685957B2 JP6685957B2 JP2017044320A JP2017044320A JP6685957B2 JP 6685957 B2 JP6685957 B2 JP 6685957B2 JP 2017044320 A JP2017044320 A JP 2017044320A JP 2017044320 A JP2017044320 A JP 2017044320A JP 6685957 B2 JP6685957 B2 JP 6685957B2
- Authority
- JP
- Japan
- Prior art keywords
- unit
- robot
- replacement
- control
- void
- 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 96
- 239000011800 void material Substances 0.000 claims description 90
- 238000012545 processing Methods 0.000 claims description 58
- 238000007781 pre-processing Methods 0.000 claims description 29
- 238000006243 chemical reaction Methods 0.000 claims description 17
- 238000011084 recovery Methods 0.000 claims description 8
- 238000012805 post-processing Methods 0.000 claims description 7
- 230000015572 biosynthetic process Effects 0.000 description 39
- 230000008569 process Effects 0.000 description 34
- 230000033001 locomotion Effects 0.000 description 26
- 230000009471 action Effects 0.000 description 20
- 230000006399 behavior Effects 0.000 description 17
- 238000004364 calculation method Methods 0.000 description 12
- 230000006870 function Effects 0.000 description 7
- 230000008859 change Effects 0.000 description 6
- 238000010586 diagram Methods 0.000 description 5
- 230000009466 transformation Effects 0.000 description 5
- 230000008901 benefit Effects 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 238000004891 communication Methods 0.000 description 3
- 238000005259 measurement Methods 0.000 description 3
- 230000002787 reinforcement Effects 0.000 description 3
- 238000010008 shearing Methods 0.000 description 3
- 238000002910 structure generation Methods 0.000 description 3
- 238000011160 research Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
Landscapes
- Manipulator (AREA)
- Control Of Position, Course, Altitude, Or Attitude Of Moving Bodies (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倍増加していくことになる。本実施形態の[問題設定]の項で説明したように、ロボット同士が接しているという拘束条件を取り入れる場合、ロボットのお互いの移動を考慮したうえで探索計算行わなければならないために、根本的な計算量の削減は難しく、複数ロボットを使用する場合の大きな問題となっている。
非特許文献6におけるホモジニアス隊列制御では、上述の計算負荷の問題を解決するための方策の一つとして、ボイド制御の考え方を導入している。また、[問題設定]で述べたような隊列変形の問題を克服するために8マスロボット単位の考え方も導入している。
さらに、非特許文献6では、図4に示すように、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
である。
各ロボットiが目標位置の集合G内にて、任意の位置に存在する状態から、各ロボットiをそれぞれ目標位置(Xre[i],Yre[i],Zre[i])に配置させるヘテロジニアスロボット位置入れ替え制御の方法について以下説明していく。
ロボット位置入れ替え制御実行前の、各ロボット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)Transform_to_Permutation_Modeを実行する。
(2)すべてのロボットiについて変数p(i)=0とする(pは、ロボット位置入れ替え済み判定フラグである)。tp=0とし、Record_Historyを実行する(ただし、tpは時刻カウンタとする)。
(3)i=d(i)となるすべてのロボットiについて、p(i)=1とする。
(4)すべてのiについてp(i)=1となるまで、(5)〜(7)を繰り返す。
(5)p(i)=0である最小のiを選択する。入れ替え元のロボットorigin←i, 入れ替え先のロボットdestination←d(i)とする。
(6)i=destinationでないうちは、(7)を繰り返す。
(7)Maintain_Mt_1を実行後、Each_Robot_Position_Exchangeを実行、その後Maintain_Mt_2を実行する。入れ替え元のロボットorigin←destination, 入れ替え先のロボットdestination←d(origin)とする。
(8)Recover_to_Goalを実行する。
ここでは、入れ替えモード変換処理手順Transform_to_Permutation_Modeと回復処理手順Recover_to_Goalについて説明する。Transform_to_Permutation_Modeの処理は、例えば、以下のようにすればよい。(2)内のボイド移動処理には後述のNavigate_Voidを使うことができる。なお、処理手順はここで説明したものに限られるものではなく、G+Ms−Mt構造が生成できる処理手順であればどのようなものを用いてもよい。
(1) 位置単位Ms’内の面Ssに接しかつ互いに接する任意の2つのロボットと、それら2つのロボットに接しかつ面Ssに接しない2つのロボット(合計4つ)をすべて位置単位Ms’から位置単位Msに向かう方向に1ステップ移動させる。
(2) 位置単位Ms’に発生した2つのボイドを、位置単位Mt内の位置単位Mt’に接しないでかつ互いに接する2つの位置まで移動させる。
(3) 位置単位Ms内に2つあるロボットに接し、かつ面Ssに接する位置にある2つのボイドの位置を、ロボット構造Rcore内のボイドの初期位置とする。2つのボイドの現在位置を初期位置として(void_ini_x[0], void_ini_y[0], void_ini_z[0])、(void_ini_x[1], void_ini_y[1], void_ini_z[1])に格納する。
(1) Transform_to_Permutation_Modeにて行われたロボットの動作の時系列的に逆の動作を行う。すなわち、Transform_to_Permutation_Modeにてある時刻で位置(X,Y,Z)にあったロボットがX正の方向に1ステップ移動したならば、本処理の対応する時刻にて同じ位置(X,Y,Z)にあるロボットをX負の方向に1ステップ移動させる。
各個ロボット位置入れ替え制御を実行する前に、入れ替え対象のロボットが位置単位Mt内にあるか否かを判定し、ある場合はそのMt内の入れ替え対象ロボットを位置単位Mt’内のロボットと位置入れ替えを行う処理(Maintain_Mt_1の処理)は、以下の通りである。
(1)入れ替え対象のロボットをロボットie1,ie2とする。ロボットie1が位置単位Mt内にあるか否かを判定する。ある場合は、フラグ_flg_ie1<-0,_flg_ie1_rot<-0とし、以下の処理をする。
(1-1)ロボットie1が位置単位Mt内の位置単位Mt’に接する位置にあり、かつMt内でロボットie1に接するロボットが2つしかない場合は、ロボットie1と、ロボットie1から見て位置単位Mtから位置単位Mt’に向かう方向にあり、かつ位置単位Mt内のロボットie2以外の任意のロボットie1’と位置を入れ替え、Reverse_Void_To(void_ini_x[0], void_ini_y[0], void_ini_z[0], void_ini_x[1], void_ini_y[1], void_ini_z[1])を実行する。_flg_ie1<-1とし(2)へ。位置の入れ替えには、後述のLine_Permを使用する。そうでない場合は、(1-2)を実行する。
(1-2)例えば、図9に示すように、ロボットie1の位置が、位置単位Mt内において、ロボットie1に接するロボットが2つしかない位置になるように移動させ、_flg_ie1_rot<-1とする。続いて、ロボットie1と、ロボットie1から見て位置単位Mtから位置単位Mt’に向かう方向にあり、かつ位置単位Mt内のロボットie2以外の任意のロボットie1’と位置を入れ替え、Reverse_Void_To(void_ini_x[0], void_ini_y[0], void_ini_z[0], void_ini_x[1], void_ini_y[1], void_ini_z[1])を実行する。_flg_ie1<-1として(2)へ。位置の入れ替えには、後述のLine_Permを使用する。
(2)ロボットie2が位置単位Mt内にあるか否かを判定する。ある場合は、フラグ_flg_ie2<-0,_flg_ie2_rot<-0とし、以下の処理をする。
(2-1)ロボットie2が位置単位Mt内の位置単位Mt’に接する位置にあり、かつ位置単位Mt内でロボットie2に接するロボットが2つしかない場合は、ロボットie2と、ロボットie2から見て位置単位Mtから位置単位Mt’に向かう方向にあり、かつ位置単位Mt内のロボットie1以外の任意のロボットie2’と位置を入れ替え、Reverse_Void_To(void_ini_x[0], void_ini_y[0], void_ini_z[0], void_ini_x[1], void_ini_y[1], void_ini_z[1])を実行する。_flg_ie2<-1とし終了。位置の入れ替えには、後述のEach_Robot_Position_Exchangeを使用する。そうでない場合は、(2-2)を実行する。
(2-2)例えば、図9に示すように、ロボットie2の位置が、位置単位Mt内において、ロボットie2に接するロボットが2つしかない位置になるように移動させ、_flg_ie2_rot<-1とする。続いて、ロボットie2と、ロボットie2から見て位置単位Mtから位置単位Mt’に向かう方向にあり、かつ位置単位Mt内のロボットie1以外の任意のロボットie2’と位置を入れ替え、Reverse_Void_To(void_ini_x[0], void_ini_y[0], void_ini_z[0], void_ini_x[1], void_ini_y[1], void_ini_z[1])を実行する。flg_ie2<-1として終了。位置の入れ替えには、後述のEach_Robot_Position_Exchangeを使用する。
(1)_flg_ie2=1のとき、ロボットie2’の位置と、ロボットd(ie2)の位置を入れ替える。Reverse_Void_To(void_ini_x[0], void_ini_y[0], void_ini_z[0], void_ini_x[1], void_ini_y[1], void_ini_z[1])を実行する。続いて_flg_ie2_rot=1のとき、Maintain_Mt_1の(2-2)にて行った図9の動作と逆の動作を使って、ロボットd(ie2)の位置をMaintain_Mt_1実行前のロボットie2の位置に戻す。
(2)_flg_ie1=1のとき、ロボットie1’の位置と、ロボットd(ie1)の位置を入れ替える。Reverse_Void_To(void_ini_x[0], void_ini_y[0], void_ini_z[0], void_ini_x[1], void_ini_y[1], void_ini_z[1])を実行する。続いて_flg_ie1_rot=1のとき、Maintain_Mt_1の(1-2)にて行った図9の動作と逆の動作を使って、ロボットd(ie1)の位置をMaintain_Mt_1実行前のロボットie1の位置に戻す。
各個ロボット位置入れ替え制御において重要なことは、入れ替え前後において入れ替え元のロボットoriginの位置と入れ替え先のロボットdestinationの位置が入れ替わる以外、その他のロボットの位置は変化せず保持されることが保証されていることである。
(1)Calculate_Path_From_Origin_To_Destinationを実行する。
(2)Robot_Exchangeを実行する。
(3)Reverse_Void_To(void_ini_x[0], void_ini_y[0], void_ini_z[0], void_ini_x[1], void_ini_y[1], void_ini_z[1])を実行する。
入れ替え経路生成処理手順Calculate_Path_From_Origin_To_Destinationは、以下の通りである。
(1) Calculate_Perm_Manhattanを実行する。
(2) Calculate_Perm_Pathを実行する。
(3) Divide_Pathを実行する。
(1)ロボット構造Rcore内にある各ロボット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]をロボット構造Rcore内の格子数より大きな値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をインクリメントする。
Move_Module(i, vx, vy, vz)はロボットiをX方向、Y方向、Z方向のうち1つの方向に所定の量(vx, vy, vz)だけ移動させるものであり、Record_Historyは、先述した通り、時刻カウンタtpにおける各ロボットiの位置を記録するものである。
(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])がロボット構造Rcore内の値であるとき、ロボットiの移動に伴い、対応するボイドの位置を移動させる。
(1)(permutation_x[tp][i], permutation_y[tp][i], permutation_z[tp][i])に各ロボットiの現時点の位置を格納し、tpをインクリメントする。
ロボット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])に格納されているロボット位置
(角要素j)
t=corner[j]-1〜corner[j]の(path_perm_x[t], path_perm_y[t], path_perm_z[t])に格納されているロボット位置
以下、第1の入れ替え制御処理手順Robot_Exchange_1、第2の入れ替え制御処理手順Robot_Exchange_2について説明する。まず、Robot_Exchange_1について説明する。Robot_Exchange_1は、先述の(α)ロボットoriginをロボットdestinationの位置まで移動させる制御を実現するものであり、ロボットoriginをそれが存在する線要素、角要素、最終線要素において、それぞれの要素の終点位置にあるロボットとロボットoriginの位置を入れ替えていくことでなされる。実際の制御方法は、以下の通りである。
(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を実行する。
線要素におけるロボット位置の入れ替えは、線要素に隣接するロボットをバディロボット(以下、単にバディともいう)として使用して図11に示すように行われる。バディは、線要素がX軸方向向きのときはY方向の隣接ロボットを、線要素がY軸方向向きのときはZ方向の隣接ロボットを、線要素がZ軸方向向きのときはX方向の隣接ロボットを線要素内のロボット数から2つ少ない数使用する。
(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)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)を線要素内ロボットとバディロボットに設定する通し番号とし(図11参照)、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)Move_Module(index_rot[nm], 0, _p_l, 0)を実行する。Record_Historyを実行する(図11動作(a))。
(3)r=nm+1〜2*nm+1のすべてのrについてMove_Module(index_rot[r], -_g_p_l, 0, 0)を実行する。Record_Historyを実行する(図11動作(b))。
(4)Move_Module(index_rot[nm], _g_p_l, 0, 0)を実行する。Record_Historyを実行する(図11動作(c))。
(5)カウンタj=1〜nmまで以下を繰り返す。
(5.1)Move_Module(index_rot[nm+j], 0, _p_l, 0)を実行する。
Move_Module(index_rot[j-1], 0, -_p_l, 0)を実行する。
Record_Historyを実行する(図11動作(d))。
(5.2)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を実行する(図11動作(e))。
(6)Move_Module(index_rot[nm], 0, -_p_l, 0)を実行する。Record_Historyを実行する(図11動作(f))。
(7)r=nm+1〜2*nmのすべてのrにおいて、Move_Module(index_rot[r], _g_p_l, 0, 0)を実行した後、Record_Historyを実行する(図11動作(g))。
(1)線要素が正方向のとき_g_p_l←1とする。線要素が負方向のとき_g_p_l←-1とする。
(2)Move_Module(index_rot[nm], 0, 0, _p_l)を実行する。Record_Historyを実行する(図11動作(a))。
(3)r=nm+1〜2*nm+1のすべてのrについてMove_Module(index_rot[r], 0, -_g_p_l, 0)を実行する。Record_Historyを実行する(図11動作(b))。
(4)Move_Module(index_rot[nm], 0, _g_p_l, 0)を実行する。Record_Historyを実行する(図11動作(c))。
(5)カウンタj=1〜nmまで以下を繰り返す。
(5.1)Move_Module(index_rot[nm+j], 0, 0, _p_l)を実行する。
Move_Module(index_rot[j-1], 0, 0, -_p_l)を実行する。
Record_Historyを実行する(図11動作(d))。
(5.2)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を実行する。(図11動作(e))。
(6)Move_Module(index_rot[nm], 0, 0, -_p_l)を実行する。Record_Historyを実行する(図11動作(f))。
(7)r=nm+1〜2*nmのすべてのrにおいて、Move_Module(index_rot[r], 0, _g_p_l, 0) を実行した後、Record_Historyを実行する(図11動作(g))。
(1)線要素が正方向のとき_g_p_l←1とする。線要素が負方向のとき_g_p_l←-1とする。
(2)Move_Module(index_rot[nm], _p_l, 0, 0)を実行する。Record_Historyを実行する(図11動作(a))。
(3)r=nm+1〜2*nm+1のすべてのrについて、Move_Module(index_rot[r], 0, 0, -_g_p_l)を実行する。Record_Historyを実行する(図11動作(b))。
(4)Move_Module(index_rot[nm], 0, 0, _g_p_l)を実行する。Record_Historyを実行する(図11動作(c))。
(5)カウンタj=1〜nmまで以下を繰り返す。
(5.1)Move_Module(index_rot[nm+j], _p_l, 0, 0)を実行する。
Move_Module(index_rot[j-1], -_p_l, 0, 0)を実行する。
Record_Historyを実行する(図11動作(d))。
(5.2)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を実行する(図11動作(e))。
(6)Move_Module(index_rot[nm], -_p_l, 0, 0)を実行する。Record_Historyを実行する(図11動作(f))。
(7)r=nm+1〜2*nmのすべてのrにおいて、Move_Module(index_rot[r], 0, 0, _g_p_l)を実行した後、Record_Historyを実行する(図11動作(g))。
角要素でのロボット位置の入れ替えの動作を図12に示す。角要素に属する二つのロボット位置の両方に接する位置にボイドのうち一つが存在し、もう一つのボイドは角要素に属する二つのロボット位置が属する面に垂直な方向に他方のボイドに接している。角要素の入れ替え動作においては、入れ替え動作の前後で入れ替え対象のロボット以外の位置は変化しない。角要素でのロボット位置入れ替え処理は以下の通りである。
(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)Move_Module(i_s, 0, l_y[0]-_sy, l_z[0]-_sz)を実行する。Record_Historyを実行する(図12動作(a))。
(3)Move_Module(i_s, _p_l, 0, 0)を実行する。Record_Historyを実行する(図12動作(b))。
(4)Move_Module(i_g, 0, l_y[0]-_gy, l_z[0]-_gz)を実行する。Record_Historyを実行する(図12動作(c))。
(5)Move_Module(i_g, 0, _sy-l_y[0], _sz-l_z[0])を実行する。Record_Historyを実行する(図12動作(d))。
(6)Move_Module(i_s, -_p_l, 0, 0)を実行する。Record_Historyを実行する(図12動作(e))。
(7)Move_Module(i_s, 0, _gy-l_y[0], _gz-l_z[0])を実行する。Record_Historyを実行する(図12動作(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)Move_Module(i_s, l_x[0]-_sx, 0, l_z[0]-_sz)を実行する。Record_Historyを実行する(図12動作(a))。
(3)Move_Module(i_s, 0, _p_l, 0)を実行する。Record_Historyを実行する(図12動作(b))。
(4)Move_Module(i_g, l_x[0]-_gx, 0, l_z[0]-_gz)を実行する。Record_Historyを実行する(図12動作(c))。
(5)Move_Module(i_g, _sx-l_x[0], 0, _sz-l_z[0]) を実行する。Record_Historyを実行する(図12動作(d))。
(6)Move_Module(i_s, 0, -_p_l, 0)を実行する。Record_Historyを実行する(図12動作(e))。
(7)Move_Module(i_s, _gx-l_x[0], 0, _gz-l_z[0])を実行する。Record_Historyを実行する(図12動作(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)Move_Module(i_s, l_x[0]-_sx, l_y[0]-_sy, 0)を実行する。Record_Historyを実行する(図12動作(a))。
(3)Move_Module(i_s, 0, 0, _p_l)を実行する。Record_Historyを実行する(図12動作(b))。
(4)Move_Module(i_g, l_x[0]-_gx, 0, l_y[0]-_gy, 0)を実行する。Record_Historyを実行する(図12動作(c))。
(5)Move_Module(i_g, _sx-l_x[0], _sy-l_y[0], 0)を実行する。Record_Historyを実行する(図12動作(d))。
(6)Move_Module(i_s, 0, 0, -_p_l)を実行する。Record_Historyを実行する(図12動作(e))。
(7)Move_Module(i_s, _gx-l_x[0], 0, _gy-l_y[0], 0)を実行する。Record_Historyを実行する(図12動作(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)を実行する(各変数の説明は図13を参照)。
(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)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.3)ロボット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)を実行する(各変数の説明は図14を参照)。
(9)ボイド目標位置と一致している方の現ボイド位置をバッファ(_xd[0],_yd[0],_zd[0])に格納し、一致していない方の現ボイド位置をバッファ(_xd[1],_yd[1],_zd[1])に格納する。
(10)Move_Module(_g_0, _xd[0]-Xr[_g_0], _yd[0]-Yr[_g_0], _zd[0]-Zr[_g_0])を実行する。Record_Historyを実行する。
(11)ロボット_g_0の動作aをUpdate_Void_Navigation(_g_0, a)にて記録する。
(12)Move_Module(_g_0, _xd[1]-Xr[_g_0], _yd[1]-Yr[_g_0], _zd[1]-Zr[_g_0])を実行する。Record_Historyを実行する。
(13)ロボット_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のとき:
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)を実行する。
(3)Record_Historyを実行する。
第一実施形態に係る行動制御システム100は、以上に説明した各処理によって構成される。全体動作(ホモジニアス隊列制御とロボット位置入れ替え制御)について以下にまとめる。
(ホモジニアス隊列制御)
(1)非特許文献6の手法を用いて開始位置の集合Sから目標位置の集合Gまでホモジニアス隊列変形を行う。
(ロボット位置入れ替え制御)
(2)ロボット位置入れ替え制御処理手順(Robot_Position_Permutation)を実行する。つまり、すべてのロボットについて、各個ロボットの位置が目標位置に到達している状態になるまで、各個ロボット位置入れ替え制御処理手順(Each_Robot_Position_Exchange)を実行する。なお、各個ロボット位置入れ替え制御処理手順(Each_Robot_Position_Exchange)を実行する前後で、所定の処理を行う。この処理により、ロボット同士の非接続が発生することなく、各個ロボット位置入れ替えを実行できる。
<入力部160>
入力部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>
記憶部140には、入力部160から入力されたp個の開始位置の集合Sとp個の目標位置の集合Gの各位置が記憶されている。その他処理の過程で生成される情報のうち、記憶する必要がある情報については適宜記憶される。
<通信部150>
行動制御システム100が実装されているロボットも含め、すべてのロボットは、通信部150を介して、三次元平面上の上下左右前後方向(以下「6方向」ともいう)において隣接する他のロボットと通信することができる。
<ホモジニアス隊列制御装置900>
開始位置の集合Sから目標位置の集合Gまで非特許文献6の手法を用いてホモジニアス隊列変形を行う。
<制御対象物位置入れ替え制御装置110>
制御対象物位置入れ替え制御装置110は、ロボット位置入れ替え制御処理手順Robot_Position_Permutationを実行して、すべてのロボットについて目標位置に到達するように制御する(S110)。
<効果>
このような構成により、多数のロボットの存在を考慮しつつ、ロボット同士が接したままの状態を維持しつつ任意の開始位置における隊列形成状態から、他の任意の目標位置における隊列形成状態へ障害物のある環境にてホモジニアス隊列変形動作を行った後に各ロボットを個々の目標位置に移動させることによりヘテロジニアス隊列制御を実現する場合のように、立方体形状のロボット位置の入れ替え開始前後のロボット隊列が同一という条件下で、各個のロボットをロボット同士の面せん断動作によってロボット隊列内の適切な位置にロボット台数の2乗に比例した実行時間で配置させることができる。
<変形例>
本実施形態では、各格子(マス)は、立方体であるが、他の形状であってもよい。格子は左右方向、上下方向及び前後方向に連続して配置される。また、各格子は左右方向で他の二つの格子と隣接し、上下方向で他の二つの格子と隣接し、前後方向で他の二つの格子と隣接する。言い換えると、各格子は、ロボットの移動できる方向と同じ方向においてのみ、他の格子と隣接する。この条件を満たせば、各格子はどのような形状であってもよい。また、「直交」とは、厳密に「垂直に交わること」を意味しなくともよく、例えば、各格子は、平行六面体であってもよく、各格子が他の二つの格子と隣接する方向の一方を上下方向とし、他方を左右方向とすればよく、上下方向及び左右方向とからなる平面に対して平行でない方向を前後方向とすればよい。
<その他の変形例>
本発明は上記の実施形態及び変形例に限定されるものではない。例えば、上述の各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。その他、本発明の趣旨を逸脱しない範囲で適宜変更が可能である。
<プログラム及び記録媒体>
また、上記の実施形態及び変形例で説明した各装置における各種の処理機能をコンピュータによって実現してもよい。その場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記各装置における各種の処理機能がコンピュータ上で実現される。
Claims (3)
- M,N,Qをそれぞれ2以上の整数の何れかとし、Rを2以上の整数の何れかとし、pをM×N×Q×Rとし、入れ替え開始前と入れ替え終了後の位置の集合(以下、集合Gという)が同一になるという条件のもと、p台の制御対象物の各々が前記集合Gの中の指定された位置に配置されるように、前記制御対象物の位置を入れ替える制御対象物入れ替え制御装置であって、
第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置の集合を位置単位とし、前記集合Gを構成する各位置は、前記第一方向〜第六方向の少なくとも何れかの方向において他の位置と隣接し、前記集合GはR個の位置単位からなる一塊の任意の形状を成し、
前記制御対象物は、当該制御対象物の3次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、3次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、
面Ssを、前記集合Gを構成するR個の位置単位中のある位置単位が前記集合Gの外部Pと接する面、
位置単位Msを、前記面Ssに接する前記集合Gの外部P内の位置単位、
位置単位Ms’を、前記面Ssに接する前記集合G内の位置単位、
位置単位Mtを、前記位置単位Ms’から前記集合G内にてマンハッタン距離が最も大きい前記集合G内の位置単位、
位置単位Mt’を、前記位置単位Mtに接し前記位置単位Mtより前記位置単位Ms’からのマンハッタン距離が1だけ小さい前記集合G内の位置単位、
G+Ms−Mt構造を、前記集合Gと前記位置単位Msから構成される構造であり、前記位置単位Mtには前記位置単位Mt’に接しない位置に2つのボイドが接する形で含まれており、前記位置単位Msには前記位置単位Ms’に接する位置にのみ最大4つの制御対象物が存在する構造、
制御対象物構造Rcoreを、前記G+Ms−Mt 構造内に含まれるp台の制御対象物から位置単位Mt に含まれる6 台の制御対象物を除いたp-6 台の制御対象物で構成される構造とし、
制御対象物i(iは1≦i≦pを満たす整数)が到達すべき前記集合Gの中での位置を目標位置i、前記制御対象物iの前記集合Gの中での現在の位置を現在位置iとし、
前記G+Ms-Mt構造を生成する入れ替えモード変換部と、
制御対象物構造Rcore内のボイドの初期位置を、前記入れ替えモード変換部により前記G+Ms-Mt構造が生成された際に前記制御対象物構造Rcoreに含まれる2つのボイドの位置とし、
前記現在位置iが前記目標位置iと一致しない場合、前記制御対象物iまたは前記目標位置iにある別の制御対象物j(jは1≦j≦pを満たす整数、j≠i)のいずれかが前記位置単位Mt内にある場合、前記位置単位Mt内にある制御対象物を前記位置単位Mt’内の制御対象物と位置入れ替えを行う事前処理部と、
入れ替え対象位置1を、前記事前処理部により前記制御対象物iの位置が入れ替えられなかった場合は前記現在位置i、前記事前処理部により前記制御対象物iの位置が入れ替えられた場合は前記制御対象物iの位置が入れ替え対象となった前記位置単位Mt’内の制御対象物があった位置、
入れ替え対象位置2を、前記事前処理部により前記制御対象物jの位置が入れ替えられなかった場合は前記目標位置i、前記事前処理部により前記制御対象物jの位置が入れ替えられた場合は前記制御対象物jの位置が入れ替え対象となった前記位置単位Mt’内の制御対象物があった位置とし、
前記入れ替え対象位置1から前記入れ替え対象位置2に至る、前記制御対象物構造Rcore内の入れ替え経路を生成する入れ替え経路生成部と、
前記2つのボイドを用いて、前記入れ替え経路に沿って、前記入れ替え対象位置1にいる制御対象物と前記入れ替え対象位置2にいる制御対象物とを入れ替える入れ替え制御部と、
前記2つのボイドを前記初期位置に戻すボイド初期位置移動部と、
前記事前処理部により前記制御対象物iの位置が入れ替えられた場合は、前記入れ替え対象位置1にいる制御対象物と前記現在位置iにいる制御対象物とを入れ替え、前記事前処理部により前記制御対象物jの位置が入れ替えられた場合は、前記入れ替え対象位置2にいる制御対象物と前記目標位置iにいる制御対象物とを入れ替える事後処理部と、
前記制御対象物i(iは1≦i≦pを満たす整数)が前記目標位置iにそれぞれ到達した後、前記入れ替えモード変換部により前記G+Ms-Mt構造を生成される前の構造に戻す回復処理部とを含む
制御対象物入れ替え制御装置。 - M,N,Qをそれぞれ2以上の整数の何れかとし、Rを2以上の整数の何れかとし、pをM×N×Q×Rとし、制御対象物入れ替え制御装置が、入れ替え開始前と入れ替え終了後の位置の集合(以下、集合Gという)が同一になるという条件のもと、p台の制御対象物の各々が前記集合Gの中の指定された位置に配置されるように、前記制御対象物の位置を入れ替える制御対象物入れ替え制御方法であって、
第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置の集合を位置単位とし、前記集合Gを構成する各位置は、前記第一方向〜第六方向の少なくとも何れかの方向において他の位置と隣接し、前記集合GはR個の位置単位からなる一塊の任意の形状を成し、
前記制御対象物は、当該制御対象物の3次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、3次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、
面Ssを、前記集合Gを構成するR個の位置単位中のある位置単位が前記集合Gの外部Pと接する面、
位置単位Msを、前記面Ssに接する前記集合Gの外部P内の位置単位、
位置単位Ms’を、前記面Ssに接する前記集合G内の位置単位、
位置単位Mtを、前記位置単位Ms’から前記集合G内にてマンハッタン距離が最も大きい前記集合G内の位置単位、
位置単位Mt’を、前記位置単位Mtに接し前記位置単位Mtより前記位置単位Ms’からのマンハッタン距離が1だけ小さい前記集合G内の位置単位、
G+Ms−Mt構造を、前記集合Gと前記位置単位Msから構成される構造であり、前記位置単位Mtには前記位置単位Mt’に接しない位置に2つのボイドが接する形で含まれており、前記位置単位Msには前記位置単位Ms’に接する位置にのみ最大4つの制御対象物が存在する構造、
制御対象物構造Rcoreを、前記G+Ms−Mt 構造内に含まれるp台の制御対象物から位置単位Mt に含まれる6 台の制御対象物を除いたp-6 台の制御対象物で構成される構造とし、
制御対象物i(iは1≦i≦pを満たす整数)が到達すべき前記集合Gの中での位置を目標位置i、前記制御対象物iの前記集合Gの中での現在の位置を現在位置iとし、
前記制御対象物入れ替え制御装置が、前記G+Ms-Mt構造を生成する入れ替えモード変換ステップと、
制御対象物構造Rcore内のボイドの初期位置を、前記入れ替えモード変換ステップにより前記G+Ms-Mt構造が生成された際に前記制御対象物構造Rcoreに含まれる2つのボイドの位置とし、
前記制御対象物入れ替え制御装置が、前記現在位置iが前記目標位置iと一致しない場合、前記制御対象物iまたは前記目標位置iにある別の制御対象物j(jは1≦j≦pを満たす整数、j≠i)のいずれかが前記位置単位Mt内にある場合、前記位置単位Mt内にある制御対象物を前記位置単位Mt’内の制御対象物と位置入れ替えを行う事前処理ステップと、
入れ替え対象位置1を、前記事前処理ステップにより前記制御対象物iの位置が入れ替えられなかった場合は前記現在位置i、前記事前処理ステップにより前記制御対象物iの位置が入れ替えられた場合は前記制御対象物iの位置が入れ替え対象となった前記位置単位Mt’内の制御対象物があった位置、
入れ替え対象位置2を、前記事前処理ステップにより前記制御対象物jの位置が入れ替えられなかった場合は前記目標位置i、前記事前処理ステップにより前記制御対象物jの位置が入れ替えられた場合は前記制御対象物jの位置が入れ替え対象となった前記位置単位Mt’内の制御対象物あったが位置とし、
前記制御対象物入れ替え制御装置が、前記入れ替え対象位置1から前記入れ替え対象位置2に至る、前記制御対象物構造Rcore内の入れ替え経路を生成する入れ替え経路生成ステップと、
前記制御対象物入れ替え制御装置が、前記2つのボイドを用いて、前記入れ替え経路に沿って、前記入れ替え対象位置1にいる制御対象物と前記入れ替え対象位置2にいる制御対象物とを入れ替える入れ替え制御ステップと、
前記制御対象物入れ替え制御装置が、前記2つのボイドを前記初期位置に戻すボイド初期位置移動ステップと、
前記制御対象物入れ替え制御装置が、前記事前処理ステップにより前記制御対象物iの位置が入れ替えられた場合は、前記入れ替え対象位置1にいる制御対象物と前記現在位置iにいる制御対象物とを入れ替え、前記事前処理ステップにより前記制御対象物jの位置が入れ替えられた場合は、前記入れ替え対象位置2にいる制御対象物と前記目標位置iにいる制御対象物とを入れ替える事後処理ステップと、
前記制御対象物i(iは1≦i≦pを満たす整数)が前記目標位置iにそれぞれ到達した後、前記制御対象物入れ替え制御装置が、前記入れ替えモード変換ステップにより前記G+Ms-Mt構造を生成される前の構造に戻す回復処理ステップとを含む
制御対象物入れ替え制御方法。 - 請求項1に記載の制御対象物入れ替え制御装置としてコンピュータを機能させるためのプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2017044320A JP6685957B2 (ja) | 2017-03-08 | 2017-03-08 | 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2017044320A JP6685957B2 (ja) | 2017-03-08 | 2017-03-08 | 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2018147401A JP2018147401A (ja) | 2018-09-20 |
JP6685957B2 true JP6685957B2 (ja) | 2020-04-22 |
Family
ID=63591377
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2017044320A Active JP6685957B2 (ja) | 2017-03-08 | 2017-03-08 | 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP6685957B2 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11597089B2 (en) * | 2020-11-06 | 2023-03-07 | Bear Robotics, Inc. | Method, system, and non-transitory computer-readable recording medium for controlling a destination of a robot |
CN113741297B (zh) * | 2021-09-10 | 2023-06-23 | 北京京东乾石科技有限公司 | 用于多个机器人的任务处理方法、装置及系统、机器人 |
-
2017
- 2017-03-08 JP JP2017044320A patent/JP6685957B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
JP2018147401A (ja) | 2018-09-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5997092B2 (ja) | ロボット協調搬送計画装置、方法及びプログラム | |
JP6559591B2 (ja) | 行動制御システム、その方法及びプログラム | |
JP6685957B2 (ja) | 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム | |
JP6489923B2 (ja) | 行動制御システム、及びそのプログラム | |
Musiyenko et al. | Simulation the behavior of robot sub-swarm in spatial corridors | |
Rubio et al. | Trajectory planning and collisions detector for robotic arms | |
JP6633467B2 (ja) | 行動制御システム、行動制御方法、プログラム | |
JP6553000B2 (ja) | 制御対象物位置入れ替え制御装置、制御対象物位置入れ替え制御方法、プログラム | |
JP6559582B2 (ja) | 行動制御システム、その方法及びプログラム | |
JP7136365B2 (ja) | 移動ロボット、移動ロボットの制御方法及びプログラム | |
JP7480869B2 (ja) | 制御装置、ハミルトン閉路拡張装置、方法及びプログラム | |
US11774970B2 (en) | Control apparatus, method and program | |
JP6939396B2 (ja) | 隊列制御装置、隊列制御方法、およびプログラム | |
Odem et al. | A Self-Reconfiguration Algorithm for Sliding Triangular Modular Robots | |
WO2022239063A1 (ja) | 制御装置、方法及びプログラム | |
JP6392187B2 (ja) | 行動制御システム、その方法及びプログラム | |
WO2023281582A1 (ja) | 制御装置、方法及びプログラム | |
WO2023281625A1 (ja) | 制御装置、方法及びプログラム | |
WO2023276065A1 (ja) | 制御装置、方法及びプログラム | |
Parra-Gonzalez et al. | Object path planner for the box pushing problem | |
Laumond | Motion planning for PLM: state of the art and perspectives | |
JP6881352B2 (ja) | 制御装置、方法及びプログラム | |
JP2019074997A (ja) | 制御装置、方法及びプログラム | |
JP7014099B2 (ja) | 移動ロボット、移動ロボットの制御方法及びプログラム | |
Sundar et al. | A Cooperative Multi-Agent Based Path-Planning and Optimization Strategy for Dynamic Environment |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20181129 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20191025 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20191105 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20191226 |
|
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: 20200331 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20200401 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 6685957 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |