Cybernetics Wiki
Advertisement

TeamBots - представляет собой программу моделирования мультиагентных (multi-agent) роботов, которая позволяет создавать мультиагентные системы управления в динамических средах с визуализацией. Вы можете разработать свою систему управления и реализовать ее в программе моделирования, а затем протестировать свою систему управления в реальном мобильном роботе (используя робота Nomadic Technologies Nomad 150). Автор программы Такер Балк.

Архитектура[]

Файл:Teambots Arhitecture.gif

400px


Интерфейс API программы TeamBots предусматривает абстрактный слой для системы управления (см. Рисунок 5). В результате чего, системе управления совершенно не важно, где именно ее запускают: в программе моделирования в искусственной среде (TBSim) или на платформе мобильного робота в реальной окружающей среде (TBHard).

Среда моделирования TeamBots позволяет гибкую настройку и легкое построение искусственных сред с объектами и другими роботами. В ней просто добавлять стены, произвольные объекты, маршруты, а также добавлять других роботов, запущенных на той же или других системах управления. Таким образом, вы можете построить модели хищников (как один из примеров). Вместе с тем, объекты не обязательно должны быть статичными. Вы можете поместить объекты, которые могут двигаться по всей среде, или объекты, которые могут двигаться в случае, когда их толкнул робот (например, мяч). С помощью TeamBots вы можете создавать модели роботов различных типов.

Инсталляция симулятора (TBSim)[]

  1. Скачать дистрибутив TeamBots можно здесь.
  2. Нужно установить Яву (Java) - ее можно скачать здесь или здесь.
  3. Создаем отдельный каталог, например, c:\Simulator
  4. туда копируем одну из готовых сред, например, директорию Walls из TeamBots\Domains\Walls
  5. внутрь Walls копируем директорию TBSim из TeamBots\src\TBSim - собственно симулятор
  6. внутрь Walls копируем директорию EDU из TeamBots\src\EDU - ???
  7. выполняем demo.bat
  8. учимся создавать свои среды и агентов


Простейшая среда "Препятствия" (Walls)[]

Файл:Teambots Walls.jpg

400px

Запуск среды запускается следующей командной строкой: java TBSim.TBSim walls.dsc (содержимое demo.bat)

  1. java - вызов интерпретатора явы
  2. TBSim.TBSim - в дериктории TBSim запускаем явовский слинкованный класс TBSim.class
  3. walls.dsc - .ini файл содержит инструкции для симулятора

Содержимое walls.dsc[]

 1 windowsize 600 300 // размер окна в пикселях
 2 
 3 //======
 4 // Границы среды (SIMULATION BOUNDARY)
 5 //======
 6 // Установка границ видимой "игровой площадки" в метрах для моделирования. 
 7 // Если эта "игровая площадка" не помещается в размеры окна, то
 8 // роботы может блуждать за экраном.
 9 
10 bounds -5 15 -5 5 // размер среды в логических координатах (слева справа снизу сверху)
11 
12 seed 3
13 time 10.0 
14 maxtimestep 100 
15 background xFFFFFF
16 
17 
18 // Квадратик ? 
19 //   xp - x координата. 
20 //   yp - y координата.
21 //   t - ingored.
22 //   r - радиус.
23 //   f - the foreground color.
24 //   b - ignored.
25 //   v - the vision class. ???
26 //   i - the unique id. ''почему то не задается'' 
27 //   s - random number seed. ''почему то не задается''
28 object EDU.gatech.cc.is.simulation.BinSim  10 0 0 0.50 x0000BB x000000 4  
29 
30 robot  EDU.gatech.cc.is.abstractrobot.MultiForageN150Sim 
31 	SchemaDemo 0 0 0 x000000 xFF0000 2
32 
33 // obstacles
34 object EDU.gatech.cc.is.simulation.ObstacleSim 10.0 1.0 0 0.30 xC0C0C0 x000000 2
35 
36 // walls
37 linearobject EDU.cmu.cs.coral.simulation.LinearObstacleSim -4 1 5 1 0.2 xC0C0C0 x000000 2
38 
39 linearobject EDU.cmu.cs.coral.simulation.LinearObstacleSim -4 -1 5 -1 0.2 xC0C0C0 x000000 2
40 
41 //linearobject EDU.cmu.cs.coral.simulation.LinearObstacleSim 6 -1 8 1 0.2 xC0C0C0 x000000 2
42 
43 object EDU.cmu.cs.coral.simulation.PolygonObstacleSim 7.0 -1.0 0.7 1.0 xC0C0C0 x000000 2

Класс SchemaDemo[]

  1 import	EDU.gatech.cc.is.util.Vec2;
  2 import	EDU.gatech.cc.is.abstractrobot.*;
  3 import	EDU.gatech.cc.is.clay.*;
  4 
  5 
  6 /**
  7  * Demonstrates navigation with a few motor schemas: move-to-goal,
  8  * noise, and avoid-obstacle.
  9  *
 10  * (c)1999, 2000 Tucker Balch, Georgia Tech Research Corporation and CMU.
 11  */
 12 
 13 // ControlSystemMFN150 - Этот класс обеспечивает систему управления роботом MultiForageN150 
 14 // Наследуемся от него, чтобы несколько модифицировать поведение робота
 15 // When you create a contol system by extending this class, it can run within JavaBotHard to control a real robot or JavaBotSim in simulation.
 16 
 17 public class SchemaDemo extends ControlSystemMFN150
 18 {
 19 	public final static boolean DEBUG = true;
 20 	private NodeVec2	turret_configuration;
 21 	private NodeVec2	steering_configuration;
 22 	private double mtggain = 1.0;
 23 	private double oldmtggain = 1.0;
 24 	private double avoidgain = 0.8;
 25 	private double oldavoidgain = 0.8;
 26 	private double noisegain = 0.2;
 27 	private double oldnoisegain = 0.2;
 28 
 29 	// Переопределите этот метод, для конфигурирования вашей управляющей системы
 30 	public void configure()
 31 	{
 32 
 33 		// Vec2 - A class for manipulating 2d vectors. Both polar and cartesian components are 
 34 		// always available. The fields x, y, t (theta) and r are directly available for reading, 
 35 		// but you should never set them directly. Use setx, sety, sett and setr instead. This 
 36 		// (non OO) approach was chosen deliberately for speed reasons; no whining. 
 37 		// +x is right, +y is up. t is in radians with t=0 in the +x direction and t = PI 
 38 		// in the -r direction, increasing CCW. 
 39 		// NOTE: Vec2's can have direction without magnitude, i.e. theta has meaning even 
 40 		// if x, y and r == 0.
 41 
 42 		Vec2 a;
 43 		Vec2 b;
 44 
 45 		a = new Vec2(0,0);
 46 		b = new Vec2(a);
 47 		System.out.println("before "+b.x);
 48 		a.setx(1);
 49 		System.out.println("after  "+b.x);
 50 		System.out.println("after  "+a.x);
 51 
 52 		//======
 53 		// Конфигурация "железа"
 54 		//======
 55 		// abstract_robot - робот, который присоединен к этой системе управления
 56 
 57 		//setObstacleMaxRange - Set the maximum range at which a sensor reading should 
 58 		//be considered an obstacle. Beyond this range, the readings are ignored. 
 59 		//The default range on startup is 1 meter.
 60 
 61 		abstract_robot.setObstacleMaxRange(3.0); // don't consider 
 62 	 						 // things further away
 63 
 64 		//setBaseSpeed - Set the base speed for the robot (translation) in meters per second. 
 65 		//Base speed is how fast the robot will move when setSpeed(1.0) is called. The speed must 
 66 		//be between 0 and MAX_TRANSLATION. It will be clipped to whichever limit it exceeds.
 67 
 68 		abstract_robot.setBaseSpeed(0.4*abstract_robot.MAX_TRANSLATION);
 69 
 70 		//======
 71 		// perceptual schemas
 72 		//======
 73 		//--- robot's global position
 74 		//Класс NodeVec2 - A Node that returns Vec2 values - узел, который содержит значение класса Vec2 (?)
 75 		//Класс v_GlobalPosition_r - Report a Vec2 representing the robot's position in global coordinates
 76 		//v_GlobalPosition_r(SimpleInterface ar) - Instantiate a v_GlobalPosition_r schema.
 77 		//SimpleInterface - интерфейс (см. ниже)
 78 
 79 		NodeVec2 PS_GLOBAL_POS = new v_GlobalPosition_r(abstract_robot);
 80 
 81 		//--- Сканирование локатором препятствий
 82 		//va_Obstacles_r - Report a list of Vec2s pointing to obstacles detected by the robot.
 83 		// PS_OBS - список векторов, где обнаруженно препятствие
 84 		NodeVec2Array PS_OBS = new va_Obstacles_r(abstract_robot);
 85 
 86 		// v_FixedPoint_ - используется при движении к известному положению
 87 		// PS_HOMEBASE_GLOBAL - расположение цели
 88 		NodeVec2 PS_HOMEBASE_GLOBAL = new v_FixedPoint_(10.0,0.0);
 89 
 90 		// Convert a global Vec2 to egocentric coordinates based on the positional 
 91 		// information provided by a SimpleInterface robot.
 92 		NodeVec2  PS_HOMEBASE = new v_GlobalToEgo_rv(abstract_robot, PS_HOMEBASE_GLOBAL);
 93 
 94 		//======
 95 		// Схема мотора (This software module is based on the motor schema formulation 
 96 		// developed by Ronald C. Arkin)
 97 		//======
 98 
 99 		// Избегание препятствий
100 		// v_Avoid_va - This node (motor schema) generates a vector away from the items detected by 
101 		// its embedded perceptual schema. Magnitude varies from 0 to 1. This version works differently 
102 		// than Arkin's original formulation. In the original, a repulsion vector is computed for each 
103 		// detected obstacle, with the result being the sum of these vectors. The impact is that several 
104 		// hazards grouped closely together are more repulsive than a single hazard. This causes problems 
105 		// when each sonar return is treated as a separate hazard --- walls for instance are more 
106 		// repulsive than a small hazard. This version computes the direction of the repulsive vector as 
107 		// in the original, but the returned magnitude is the largest of the vectors, not the sum. 
108 		// Конструктор
109 		// public v_Avoid_va(double soe, double s, NodeVec2Array im1)
110 		// soe - double, the sphere of influence beyond which the hazards are not considered.
111 		// s - double, the safety zone, inside of which a maximum repulsion from the object is generated.
112 		// im1 - NodeVec2Array, the embedded node that generates a list of items to avoid.
113 
114 		NodeVec2 MS_AVOID_OBSTACLES = new v_Avoid_va(3.0, abstract_robot.RADIUS + 0.1, PS_OBS);
115 
116 		// Движение к цели
117 		// v_LinearAttraction_v - Generates a vector towards a goal location that varies with distance 
118 		// from the goal. The attraction is increased linearly at greater distances. 
119 		NodeVec2 MS_MOVE_TO_HOMEBASE = new v_LinearAttraction_v(0.4,0.0,PS_HOMEBASE);
120 
121 		// Вектор шума (?)
122 		// v_Noise_ - Generates a vector in a random direction for a specified time.
123 		NodeVec2 MS_NOISE_VECTOR = new v_Noise_(10,5);
124 
125 		//======
126 		// AS_GO_HOME
127 		//======
128 		// v_StaticWeightedSum_va - Combine an array of embedded schemas using static weights set 
129 		// at configuration time. Configuration is done by setting the values of the embedded[] 
130 		// and weights[] arrays.
131 
132 		v_StaticWeightedSum_va AS_GO_HOME = new v_StaticWeightedSum_va();
133 
134 		AS_GO_HOME.weights[0]  = avoidgain;
135 		AS_GO_HOME.embedded[0] = MS_AVOID_OBSTACLES;
136 
137 		AS_GO_HOME.weights[1]  = noisegain;
138 		AS_GO_HOME.embedded[1] = MS_NOISE_VECTOR;
139 
140 		AS_GO_HOME.weights[2]  = mtggain;
141 		AS_GO_HOME.embedded[2] = MS_MOVE_TO_HOMEBASE;
142 
143 		turret_configuration = AS_GO_HOME;
144 		steering_configuration = AS_GO_HOME;
145 	}
146 		
147 	/**
148 	 * Called every timestep to allow the control system to
149 	 * run.
150 	 */
151 	public int takeStep()
152 	{
153 		Vec2	result;
154 		double	dresult;
155 		long	curr_time = abstract_robot.getTime();
156 		Vec2	p;
157 
158 		// Управление основанием
159 		// Получить значение вектора от узла steering_configuration на момент curr_time (текущие время)
160 		result = steering_configuration.Value(curr_time);
161 
162 		// public void setSteerHeading(long timestamp, double heading) - 
163 		// Set the desired heading for the steering motor.
164 		// Параметры:
165 		// heading - the heading in radians.
166 		// timestamp - only get new information if timestamp > than last call or timestamp == -1.
167 
168 		// Vec2.t - угол поворота в полярных координатах
169 
170 		abstract_robot.setSteerHeading(curr_time, result.t);
171 
172 		// public void setSpeed(long timestamp, double speed)
173 		// Set the desired speed for the robot (translation). The speed must be between 0 and 1; 
174 		// where 0 is stopped and 1.0 is "full blast". It will be clipped to whichever limit it exceeds.
175 		// Also, underlying software will keep the actual speed at zero until the steering motor is 
176 		// close to the desired heading. Use setBaseSpeed to adjust the top speed.
177 		// Параметры:
178 		// timestamp - only get new information if timestamp > than last call or timestamp == -1.
179 		// speed - the desired speed from 0 to 1.0, where 1.0 is the base speed.
180 
181 		// Vec2.r - радиус в полярных координатах 
182 
183 		abstract_robot.setSpeed(curr_time, result.r);
184 
185 		// Управление "башенкой"
186 		// Получить значение вектора от узла turret_configuration на момент curr_time (текущие время)
187 		result = turret_configuration.Value(curr_time);
188 
189 
190 		// public void setTurretHeading(long timestamp, double heading)
191 		// Set the desired heading for the turret motor.
192 		// Параметры:
193 		// timestamp - only get new information if timestamp > than last call or timestamp == -1.
194 		// heading - the heading in radians.
195 
196 		abstract_robot.setTurretHeading(curr_time, result.t);
197 
198 		// Установка строки состояния, которая отображается для робота. Для реального робота она 
199 		// отображена на консоли, при моделировании она отображена рядом с агентом если выбрать
200 		// "Robot State". Параметр - текст для отображения.
201 
202 		abstract_robot.setDisplayString("trying to go to the goal");
203 
204 		return(CSSTAT_OK);
205 	}
206 }

См. также[]

Advertisement