/worlds/make_rsn.c

https://bitbucket.org/odellus/stage · C · 240 lines · 190 code · 43 blank · 7 comment · 33 complexity · 4d0de6e3c9228c60f1b4691e6cb160a5 MD5 · raw file

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #define USAGE \
  6. "USAG: make_motes [-n <number> -p <base port> -f <pnm file>"\
  7. " -r <resolution> -s <scale> -i <base index>"\
  8. " -o <world_file> -g <swarm geometry>]"
  9. /************************************************************************/
  10. typedef struct{
  11. double x;
  12. double y;
  13. double th;
  14. } pos_t;
  15. pos_t *pos_list;
  16. int num_nodes = 25;
  17. int base_index = 0;
  18. int base_port = 6660;
  19. float scale = 0.09;
  20. float res = 0.15;
  21. char shape_name[32] = "random";
  22. char world_filename[32] = "gts.world";
  23. char pnm_filename[32] = "simple.pnm";
  24. FILE *world_file;
  25. /************************************************************************/
  26. void parse_args(int argc, char** argv)
  27. {
  28. int i;
  29. i=1;
  30. while(i<argc){
  31. if(!strcmp(argv[i],"-g")){
  32. if(++i<argc){
  33. strcpy(shape_name,argv[i]);
  34. }
  35. else{
  36. puts(USAGE);
  37. exit(1);
  38. }
  39. }
  40. else if(!strcmp(argv[i],"-o")){
  41. if(++i<argc)
  42. strcpy(world_filename,argv[i]);
  43. else{
  44. puts(USAGE);
  45. exit(1);
  46. }
  47. }
  48. else if(!strcmp(argv[i],"-n")){
  49. if(++i<argc){
  50. num_nodes = atoi(argv[i]);
  51. }
  52. else{
  53. puts(USAGE);
  54. exit(1);
  55. }
  56. }
  57. else if(!strcmp(argv[i],"-i")){
  58. if(++i<argc){
  59. base_index = atoi(argv[i]);
  60. }
  61. else{
  62. puts(USAGE);
  63. exit(1);
  64. }
  65. }
  66. else if(!strcmp(argv[i],"-s")){
  67. if(++i<argc){
  68. scale = atof(argv[i]);
  69. }
  70. else{
  71. puts(USAGE);
  72. exit(1);
  73. }
  74. }
  75. else if(!strcmp(argv[i],"-r")){
  76. if(++i<argc){
  77. res = atof(argv[i]);
  78. }
  79. else{
  80. puts(USAGE);
  81. exit(1);
  82. }
  83. }
  84. else if(!strcmp(argv[i],"-p")){
  85. if(++i<argc)
  86. base_port = atoi(argv[i]);
  87. else{
  88. puts(USAGE);
  89. exit(1);
  90. }
  91. }
  92. else{
  93. puts(USAGE);
  94. exit(1);
  95. }
  96. i++;
  97. }
  98. }
  99. /************************************************************************/
  100. #define X_BASE_OFFSET 15.0
  101. #define Y_BASE_OFFSET 15.0
  102. #define POS_SCALER 3.0
  103. #define DEG_SCALER 3.0
  104. pos_t *make_wave(void)
  105. {
  106. int i, j, sq_side;
  107. sq_side =(int)sqrt((double)num_nodes);
  108. for(j = 0 ; j < sq_side; j++){
  109. for(i = 0 ; i < sq_side; i++){
  110. pos_list[j*sq_side+i].x = i*POS_SCALER + X_BASE_OFFSET;
  111. pos_list[j*sq_side+i].y = j*POS_SCALER + Y_BASE_OFFSET;
  112. pos_list[j*sq_side+i].th = (j*sq_side + i) * DEG_SCALER;
  113. }
  114. }
  115. return NULL;
  116. }
  117. /************************************************************************/
  118. pos_t *make_random(void)
  119. {
  120. int i, j, sq_side;
  121. sq_side =(int)sqrt((double)num_nodes);
  122. srand(time(NULL));
  123. for(j = 0 ; j < sq_side; j++){
  124. for(i = 0 ; i < sq_side; i++){
  125. pos_list[j*sq_side+i].x = i*POS_SCALER + X_BASE_OFFSET;
  126. pos_list[j*sq_side+i].y = j*POS_SCALER + Y_BASE_OFFSET;
  127. pos_list[j*sq_side+i].th = rand()%360;
  128. }
  129. }
  130. return NULL;
  131. }
  132. /************************************************************************/
  133. pos_t *make_grid(void)
  134. {
  135. int i, j, sq_side;
  136. sq_side =(int)sqrt((double)num_nodes);
  137. for(j = 0 ; j < sq_side; j++){
  138. for(i = 0 ; i < sq_side; i++){
  139. pos_list[j*sq_side+i].x = i*POS_SCALER + X_BASE_OFFSET;
  140. pos_list[j*sq_side+i].y = j*POS_SCALER + Y_BASE_OFFSET;
  141. pos_list[j*sq_side+i].th = 15;
  142. }
  143. }
  144. return NULL;
  145. }
  146. /************************************************************************/
  147. pos_t *build_pos_list(void)
  148. {
  149. pos_list = (pos_t*)malloc(sizeof(pos_t) * num_nodes);
  150. if(!strcmp(shape_name, "random")) return make_random();
  151. if(!strcmp(shape_name, "wave")) return make_wave();
  152. if(!strcmp(shape_name, "grid")) return make_grid();
  153. printf("Unknown shape: %s!\n", shape_name);
  154. exit(3);
  155. }
  156. /************************************************************************/
  157. int main(int argc, char** argv)
  158. {
  159. int i;
  160. parse_args(argc, argv);
  161. if((world_file = fopen(world_filename, "w")) == NULL){
  162. perror("opening world file");
  163. exit(1);
  164. }
  165. build_pos_list();
  166. fprintf(world_file, "begin environment\n"
  167. " file %s\n"
  168. " resolution %.3f\n"
  169. " scale %.3f\n"
  170. "end\n\n",
  171. pnm_filename, res, scale);
  172. for(i = 0 ; i < num_nodes; i++){
  173. fprintf(world_file, "begin position_device\n"
  174. " port %d\n"
  175. " pose (%.1f %.1f %.1f)\n"
  176. " begin sonar_device\n"
  177. " end\n"
  178. " begin mote_device\n"
  179. " index %d\n"
  180. " end\n"
  181. " begin player_device\n"
  182. " end\n"
  183. "end\n\n",
  184. i+base_port, pos_list[i].x, pos_list[i].y,
  185. pos_list[i].th, i+base_index);
  186. }
  187. printf("wrote world file: %s\n"
  188. " nodes: %d\n"
  189. " shape: %s\n"
  190. " base port: %d\n"
  191. " base index: %d\n"
  192. " .pnm file: %s\n"
  193. " resolution: %.3f\n"
  194. " scale: %.3f\n",
  195. world_filename, num_nodes, shape_name,
  196. base_port, base_index, pnm_filename, res, scale);
  197. }