ФЭНДОМ


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

Архитектура Править

Файл:Teambots Arhitecture.gif


Интерфейс 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

Запуск среды запускается следующей командной строкой: 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. }

См. также Править

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на ФЭНДОМЕ

Случайная вики