BTR2022の解説(game2022.py)

まずは,わかりやすい方から.
ゲームを実行するときに,game2022.py を使います.

以下,頭から見た構成です.

#!/usr/bin/python
TEAMNAME = "BabyTigers"

FIELDMINX = -5
FIELDMAXX = -1
FIELDMINY =  1
FIELDMAXY =  5
FIELDSIZEX = (FIELDMAXX - FIELDMINX) + 1
FIELDSIZEY = (FIELDMAXY - FIELDMINY) + 1
FIELDSIZE = FIELDSIZEX * FIELDSIZEY
MAXSTEP = 999

最初に定数を定義しています.
チーム名と経路探索用の情報です.
今は関係しませんので,読み飛ばしましょう.
その次にimport 関係が並んでいます.
(本当は,定数よりも先に書くべきなのかも….あとで順番を入れ替えます)
ここも,今は読む必要はありません.
その後,再度,経路用の定数(配列変数)が並んでいますが,ここも読み飛ばしましょう.

def goToPoint(x, y, theta):
def moveRobotino(x, y, theta):
def goToInputVelt(): # original position is 355 (= 5 + 50*7)
def goToOutputVelt(): # original position is 305 (= 5 + 50*6)
def goToMPSCenter(distance):
def turnClockwise():
def turnCounterClockwise():
def getWork():
def putWork():

Robotino を動かすための昔のコードです.
今は使っていません.
この前まではrobotino2022.pyで,今はbtr2022.pyで扱うようにしています.
のちほど,削除します.

def beaconSignal(data):
def explorationInfo(data):
def gameState(data):
def machineInfo(data):
def machineReportInfo(data):
def orderInfo(data):
def ringInfo(data):
def navigationRoutes(data):
def sendBeacon():
def sendMachineReport(report):
def sendPrepareMachine(data):

RefBox との通信のプログラムです.読み飛ばして下さい.

def robotinoOdometry(data):
def robotinoVelocity(data):

RobViewを使っていた時のソースです.
OdometryはRefBoxにBeaconを送るのに必要なので,あとで修正します.
Velocityは,現Robotino用のROSだと,取ってこれません(必要かなぁ?)

def startGrasping():

Graspingチャレンジのプログラムです.
一部(ワークの把持とMPS周りの回転)のプログラムが本ソースを参照するようになっていますので,あとで修正します.

def initField():
def setField(x, y, number):
def getField(x, y):
def zoneToPose2D(zone):
def setMPStoField():
def getStep(x, y):
def wallCheck(x, y, dx, dy):
def getNextDirection(x, y):
def makeNextPoint(destination):

経路選択用の関数です.

def getNextPoint(pointNumber):
def startNavigation():

Navigationチャレンジのプログラムです.
RefBox から受け取った「未到達のMPSリスト」の先頭のゾーンに対して,経路を構築し,一つずつ進む(縦横のマス目に従って進む)形です.


# main
#
if __name__ == '__main__':

ここからがmain関数です ← ここを最初に見ろと言う声もアリ.

  args = sys.argv
  if (len(args) >= 2):
    challenge = args[1]
    if (len(args) >= 3):
      robotNum = int(args[2])
    else:
      robotNum = 1

引数として,1つ目がchallenge名,2つ目がロボット番号です(省略したら1).
RefBox やROS関係の初期設定があり,

  btrRobotino = btr2022.btr2022()

  pose = Pose2D()
  pose.x = -1000 * robotNum - 1500
  pose.y = 500
  pose.theta = 90

btr2022.py をbtrRobotinoとして持ってきています.
初期座標は,ロボット投入口です.
1台目は(-2500,500,90),2台目は(-3500,500,90),3台目は(-4500,500,90)となります.
※チームカラーを見ていない気がする.Magentaの時は反転しないといけませんね.

  if (challenge == "grasping"):
      startX =     [ -500, -4500, -500]
      startY =     [  500,  1500, 4500]
      startTheta = [   90,    90,  180]
      pose.x = startX[robotNum - 1]
      pose.y = startY[robotNum - 1]
      pose.theta = startTheta[robotNum - 1]
  if (challenge == "driving" or challenge == "positioning"):
      pose.x = zoneX["S31"]
      pose.y = zoneY["S31"]
      pose.theta = 90
  print(pose.x, pose.y, pose.theta)
  if (challenge == "reset"):
      # goToPoint(-800, -1500, 90)
      goToPoint(pose.x, pose.y, pose.theta)
      exit()

先ほどの座標はMain Track用ですので,challenge用の座標を個別に設定しています.
(第一引数にresetをいれると,とりあえず初期位置にロボットが直線的に移動します)

  print(challenge)
  challengeFlag = True
  # while True:
  while not rospy.is_shutdown():
    # sendBeacon()
    # print("sendBeacon")

    if (challenge == "test" and challengeFlag):

以降,challenge の値で分岐して,各プログラムが動きます.
プログラムの動作確認をしたいときは,上記のような感じでchallenge名をtest とかにして分岐を書けば,実行できます.
とりあえず,ざくっとgame2022.py の説明は以上です.

コメントを残す

メールアドレスが公開されることはありません。

*