|  | Неделю назад, 27 мая в Нижнем Новгороде проходил Linux Install Fest, проводимый активистами Нижегородской группой пользователей Linux. Цель мероприятия - ознакомить участников фестиваля с последними новинками среди Свободного Программного Обеспечения (СПО), в том числе с последними дистрибутивами ОС Linux. | 
Одной из презентаций на данном мероприятии, был доклад, посвященный LEGO. Основной задачей доклада было рассказать, что в ОС Linux, тоже существует возможность программировать LEGO роботов. Особенно актуально это может быть для преподавателей таких школ, где в целях экономии было принято решение перейти на СПО, таким образом становятся недоступными такие среды программирования, как NXT-G, LabView, RobotC и т.п.
Помимо краткого ознакомления с конструктором LEGO Mindstorms NXT, в ходе презентации участниками были продемонстрированы:
- возможность программировать на языке Not eXactly C (NXC) в редакторе nxcEditor. В качестве "живого экспоната" здесь выступал робот-сканер, собранный на базе широко известного Sudoku Solver (инструкции по сборке доступны здесь)
 
 
 Программу на языке NXC можно посмотреть в конце заметки.
- возможность запускать виртуальных роботов в среде nxcSimulator
- возможность управлять роботами с компьютера или ноутбука с помощью программ, написанных на скриптовом языке Python, с использованием модуля nxt-python. Тексты демонстрированных программ - в конце заметки.
Текст программы робота-сканера:
#define WIDTH   720
#define SCR_W   100
#define STEP    45
#define SHIFT   3
task main() {
  SetSensorColorRed(S3);
  ClearScreen();
  //Move the head to the right position
  RotateMotor(OUT_B, 50, WIDTH/2);
  //Perform calibration
  int Light=Sensor(S3);
  int x = 0;
  int y = 63;
  int Pos;
  while (y>=0) {
    //Start moving the head to left
    OnRev(OUT_B, 50);
    Pos=abs(MotorTachoCount(OUT_B));
    //Check in the loop if the head achieved
    //the left boundary
    while(Pos<WIDTH) {
      //if somthing dark is under the sensor, draw a point
      if (Sensor(S3) < (Light-10)) {
        x=SCR_W-(Pos*SCR_W)/WIDTH+SHIFT;
        PointOut(x,y, DRAW_OPT_NORMAL);
      }
      Pos=abs(MotorTachoCount(OUT_B));
    }
    Off(OUT_B);
    //Perform one step by the robot to
    //start scanning the next line
    y = y - 1;
    RotateMotor(OUT_A, 80, STEP);
    //Start moving the head to right
    OnFwd(OUT_B, 50);
    Pos=MotorTachoCount(OUT_B);
    //Check in the loop if the head achieved
    //the right boundary
    while(abs(Pos)<WIDTH) {
      //if somthing dark is under the sensor, draw a point
      if (Sensor(S3) < (Light-10)) {
        x=((Pos*SCR_W)/WIDTH)-SHIFT;
        PointOut(x,y, DRAW_OPT_NORMAL);
      }
      Pos=MotorTachoCount(OUT_B);
    }
    Off(OUT_B);
    //Perform one step by the robot to
    //start scanning the next line
    y = y - 1;
    RotateMotor(OUT_A, 80, STEP);
  }
  //Move the head at start position
  RotateMotor(OUT_B, -50, WIDTH/2);
  PlayTone(440, 500);
  Wait(10000);
}
Программа первая - движение моторами.
#!/usr/bin/env python import nxt.locator from nxt.motor import * b = nxt.locator.find_one_brick() back = Motor(b, PORT_A) back.turn(-100, 1080*3) back.turn(100, 1080*3) head = Motor(b, PORT_B) head.turn(-100, 540) head.turn(100, 1080) head.turn(-100, 540) back.idle() head.idle()
Программа вторая - работа с цветовым сенсором.
#!/usr/bin/env python import nxt.locator from nxt.sensor import * from time import sleep b = nxt.locator.find_one_brick() sens = Color20(b, PORT_3) i = 0; while (i<10): print 'Light:', sens.get_reflected_light(Type.COLORBLUE) sleep(1) i = i + 1 sens.set_light_color(Type.COLORRED) sleep(1) sens.set_light_color(Type.COLORBLUE) sleep(1) sens.set_light_color(Type.COLORGREEN) sleep(1) sens.set_light_color(Type.COLORNONE)
 
Комментариев нет:
Отправить комментарий