воскресенье, 3 июня 2012 г.

Lego Mindstorms на Linux Install Fest 12.04 в Нижнем Новгороде

Неделю назад, 27 мая в Нижнем Новгороде проходил Linux Install Fest, проводимый активистами Нижегородской группой пользователей Linux. Цель мероприятия - ознакомить участников фестиваля с последними новинками среди Свободного Программного Обеспечения (СПО), в том числе с последними дистрибутивами ОС Linux.
Также здесь можно было узнать, какие аналогичные программные пакеты СПО можно использовать взамен проприетарного, найти ответы на вопросы, связанные с Linux и СПО, да и просто свободно пообщаться с единомышленниками, завести новые полезные знакомства.

Одной из презентаций на данном мероприятии, был доклад, посвященный LEGO. Основной задачей доклада было рассказать, что в ОС Linux, тоже существует возможность программировать LEGO роботов. Особенно актуально это может быть для преподавателей таких школ, где в целях экономии было принято решение перейти на СПО, таким образом становятся недоступными такие среды программирования, как NXT-G, LabView, RobotC и т.п.

Помимо краткого ознакомления с конструктором LEGO Mindstorms NXT, в ходе презентации участниками были продемонстрированы:
  1. возможность программировать на языке Not eXactly C (NXC) в редакторе nxcEditor. В качестве "живого экспоната" здесь выступал робот-сканер, собранный на базе широко известного Sudoku Solver (инструкции по сборке доступны здесь)


    Программу на языке NXC можно посмотреть в конце заметки.
  2. возможность запускать виртуальных роботов в среде nxcSimulator
  3. возможность управлять роботами с компьютера или ноутбука с помощью программ, написанных на скриптовом языке 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);
}

Тексты программ на языке Python
Программа первая - движение моторами.
#!/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)

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...