Group:Group Howto
Contents |
Intro
Group robotics typically require a number of physical robots to conduct an exercise. However, given the fact that you may not have a dozen Roomba/Creates lying around, you can make use of a simulator to create a series of robots.
Stage
Using the stage simulator, a great number of robots can be created. Here is an example stage world file that uses 11 robots:
# Desc: Stage demo with lots of models. Works with everything.cfg.
# CVS: $Id: everything.world,v 1.85 2006/03/29 05:11:00 rtv Exp $
# the size of a pixel in Stage's underlying raytrace model in meters
resolution 0.02
interval_sim 100 # milliseconds per update step
interval_real 100 # real-time milliseconds per update step
# defines Pioneer-like robots
include "pioneer.inc"
# defines 'map' object used for floorplans
include "map.inc"
# defines the laser model `sick_laser' configured like a Sick LMS-200
include "sick.inc"
size [20 20 ]
gui_disable 0
gui_interval 100
gui_menu_interval 20
window(
size [ 800 800.000 ]
center [0 0 ]
scale 0.025
)
map(
bitmap "blank-room.png"
map_resolution 0.02
size [20 20]
name "hospital"
)
# extend the pioneer2dx definition from pioneer.inc
#
define trickedoutpioneer pioneer2dx
(
sick_laser(
pose [0.030 0.000 0.000 ]
fiducialfinder( range_max 8 range_max_id 5 )
ptz(
blobfinder(
channel_count 6
channels [ "red" "blue" "green" "cyan" "yellow" "magenta" ]
)
)
)
fiducial_return 1
gripper_return 0
localization "gps"
localization_origin [ 0 0 0 ]
bumper( bcount 3
blength 0.2
bpose[0] [0 -0.165 90]
bpose[1] [0 0.165 -90]
bpose[2] [-0.26 0 0]
blength[2] 0.1 # set the length of a single bumper
)
)
trickedoutpioneer ( name "robot1" pose [ 0 0 0 ] )
trickedoutpioneer ( name "robot2" pose [ 0 5 0 ] )
trickedoutpioneer ( name "robot3" pose [ 0 6 0 ] )
trickedoutpioneer ( name "robot4" pose [ 0 3 0 ] )
trickedoutpioneer ( name "robot5" pose [ 3 5 0 ] )
trickedoutpioneer ( name "robot6" pose [ 4 5 0 ] )
trickedoutpioneer ( name "robot7" pose [ 5 5 0 ] )
trickedoutpioneer ( name "robot8" pose [ -4 -5 0 ] )
trickedoutpioneer ( name "robot9" pose [ -3 -5 0 ] )
trickedoutpioneer ( name "robot10" pose [ -2 -5 0 ] )
trickedoutpioneer ( name "robot11" pose [ -5 5 0 ] )
Save this file as everything.world. In addition to this file, a .png file is used as a model for the room:
Save this file as blank-room.png
Player
To control all of these robots, the following player file can be used:
# Desc: Player sample configuration file for controlling Stage devices # Date: 18 Apr 2003 # CVS: $Id: everything.cfg,v 1.33 2006/03/29 05:11:00 rtv Exp $ driver ( name "stage" provides ["simulation:0"] plugin "libstageplugin" worldfile "everything.world" ) driver( name "stage" provides ["map:0" ] model "hospital" ) # robot 0 driver( name "stage" provides [ "position2d:0" "sonar:0" "laser:0" "ptz:0" "blobfinder:0" "fiducial:0" "graphics2d:0" "bumper:0" ] model "robot1" ) # robot 1 driver( name "stage" provides [ "position2d:1" "sonar:1" "laser:1" "ptz:1" "blobfinder:1" "fiducial:1" "graphics2d:1" "bumper:1" ] model "robot2" ) driver( name "stage" provides [ "position2d:2" "sonar:2" "laser:2" "ptz:2" "blobfinder:2" "fiducial:2" "graphics2d:2" "bumper:2" ] model "robot3" ) driver( name "stage" provides [ "position2d:3" "sonar:3" "laser:3" "ptz:3" "blobfinder:3" "fiducial:3" "graphics2d:3" "bumper:3" ] model "robot4" ) driver( name "stage" provides [ "position2d:4" "sonar:4" "laser:4" "ptz:4" "blobfinder:4" "fiducial:4" "graphics2d:4" "bumper:4" ] model "robot5" ) driver( name "stage" provides [ "position2d:5" "sonar:5" "laser:5" "ptz:5" "blobfinder:5" "fiducial:5" "graphics2d:5" "bumper:5" ] model "robot6" ) driver( name "stage" provides [ "position2d:6" "sonar:6" "laser:6" "ptz:6" "blobfinder:6" "fiducial:6" "graphics2d:6" "bumper:6" ] model "robot7" ) driver( name "stage" provides [ "position2d:7" "sonar:7" "laser:7" "ptz:7" "blobfinder:7" "fiducial:7" "graphics2d:7" "bumper:7" ] model "robot8" ) driver( name "stage" provides [ "position2d:8" "sonar:8" "laser:8" "ptz:8" "blobfinder:8" "fiducial:8" "graphics2d:8" "bumper:8" ] model "robot9" ) driver( name "stage" provides [ "position2d:9" "sonar:9" "laser:9" "ptz:9" "blobfinder:9" "fiducial:9" "graphics2d:9" "bumper:9" ] model "robot10" ) driver( name "stage" provides [ "position2d:10" "sonar:10" "laser:10" "ptz:10" "blobfinder:10" "fiducial:10" "graphics2d:10" "bumper:10" ] model "robot11" )
Save that file as everything.cfg. The simulator and player can be run with the command:
player everything.cfg
When that is done, a window such as this should appear:
Exercise Code
In the client.xml file, the following change should be made:
<?xml version='1.0'?> <client xmlns:player='http://www.roombadev.com/xmlschema/psg/#player' xmlns:roomba='http://www.roombadev.com/xmlschema/psg/#roomba'> <player:params> <host>localhost</host> <port>6665</port> <num_clients>11</num_clients> </player:params> </client>
Then when editing the exercise.cc file, robot client functions such as:
client->SetSpeed( 0.5, 0.0 );
become:
clients[i]->SetSpeed( 0.5, 0.0 );
where i is the robot number from 0..n-1
Notice the line:
<num_clients>11</num_clients>
This tells the program to instantiate 11 robots using the player config file. This number defaults to 1.
client->SetSpeed, etc. still works, which defaults to clients[0].
![[LOGO]](/workbook/skins/workbook/create_small2.png)





