Работа предсьтавляет собой проект робота спасателя на базе Lego Mindstorm EV3. Программное обеспечение написано на платформе LeJos на языке Java. Робет предназначен для обнаружения людей в шахтах из под завалов. А так же, для доставки им медикаментов и продуктов.
Вложение | Размер |
---|---|
spasatel.docx | 665.2 КБ |
listing_programmy.docx | 21.03 КБ |
spasatel.pptx | 1.52 МБ |
Муниципальное бюджетное образовательное учреждение
«Гимназия п. Нижний Куранах»
«Прототип робота-спасателя»
Авторы: Слабажанин Павел
Ученик 8β класса МБОУ
«Гимназия п. Нижний Куранах»,
Максимов Денис
Ученик 8β класса МБОУ
«Гимназия п. Нижний Куранах».
Руководитель:
Бредихин Валерий Владимирович,
Учитель информатики МБОУ
«Гимназия п. Нижний Куранах».
e-mail: v_bredihin@mail.ru
тел.: +7-924-464-13-94
Оглавление.
Введение.
На сегодняшний день, как в золотодобывающей, так и других отраслях используется шахтовый метод добычи. Как известно – это довольно опасный способ добычи полезных ископаемых. Довольно часто на шахтах случаются аварии, обвалы грунта и под обвалами остаются люди. Обнаружить и спасти этих людей довольно проблематично и, так же, сопряжено с большим риском для спасателей. При последней большой аварии на шахте «Мир» несколько человек не удалось найти и спасти.
Поэтому мы решили попробовать разработать и создать прототип робота спасателя.
Цель работы – на базе конструктора Lego Mindstorms EV3 провести исследование по возможности создания прототипа робота спасателя для шахт.
Объект – датчики и моторы базового комплекта Lego Mindstorms EV3, программное обеспечение.
Предмет – электронный прототип робота спасателя.
Новизна состоит в том, что в данной работе представлена разработка прототипа автономного робота спасателя с помощью Lego Mindstorms EV3
Задачи:
Работа осуществлялась в несколько этапов.
Первый этап.
На этом этапе проводилось знакомство с литературой по имеющимся конструкциям роботов спасателей. На этом этапе было решено разрабатывать модель робота, который бы самостоятельно проникал в завал и передавал окружающую обстановку оператору. Второй этап.
На втором этапе анализировались модели робота. Было решено использовать модель которая способна сама бурить породу, подавать звуковые сигналы и снимать окружающую обстановку на камеру, а так же какие моторы будут использованы в модели.
Третий этап.
На этом этапе осуществлялась сборка модели.
Технические характеристики моделей.
Модель спасателя представляет собой робота размерами: 190х250х150 мм.
Модель прототипа робота спасателя. Конструкцию модели решено было использовать по подобию танка, т.е. кабина (микроконтроллер управления), бур для сверления породы, 2 больших мотора управления гусеницами, средний мотор для вращения камеры, средний мотор для вращения бура, мелкие детали из конструктора.
Четвертый этап.
На этом этапе разрабатывался алгоритм работы спасателя.
Прототип должен прибыть на место аварии и с помощью бура углубится в завал, через определенные моменты времени он должен останавливаться, подавать звуковые сигналы и обследовать окружающую обстановку. После чего возобновлять движение. В перспективе, планируется осуществлять передачу данных об окружающей обстановке на пульт оператора и возможность управления роботом с пульта оператора.
Пятый этап. На этом этапе проверялись технические возможности модели.
Шестой этап. На этом этапе анализировались полученные результаты по данной модели.
При анализе результатов выяснилось следующее. Возникли трудности с изготовлением на 3-D принтере модели бура. При печати бура большого диаметра, происходило отставание бура от площадки. При исследовании модели, так же выяснилось, что при имеющихся возможностях EV3 не удастся подключить камеру для трансляции видео и звука на пульт оператора. Так же, необходимо предусмотреть наличие датчиков загазованности.
Заключение.
После проведенных исследований было сделано заключение, что на базе программного обеспечения EV3 невозможно создать достаточно работоспособную модель такого робота. Поэтому было решено продолжить работу над этой моделью. Перевести программное обеспечение на LeJos и написать другую программу. На базе данного программного обеспечения предусматривается съемка окружающей обстановки, прослушка окружающего пространства, определение загазованности и передача этих данных на пульт диспетчера. При необходимости, к роботу можно прицепить тележку для доставки продуктов и медикаментов пострадавшим до прибытия основной помощи. Даже на базе конструктора Lego Mindstorms EV3 можно собрать действующую модель такого транспорта, которая достаточно реалистично показывают технологию организации спасательной операции. Было решено продолжить изучение возможностей данного конструктора для усовершенствования модели.
Список литературы.
Листинг программы:
package MoiSpas;
//import java.awt.Button;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import lejos.hardware.Button;
import javax.imageio.ImageIO;
import lejos.hardware.BrickFinder;
import lejos.hardware.ev3.EV3;
import lejos.hardware.video.Video;
import lejos.robotics.RegulatedMotor;
import lejos.utility.Delay;
import lejos.hardware.motor.EV3MediumRegulatedMotor;
import lejos.hardware.port.MotorPort;
public class vid {
private static int WIDTH = 160;
private static int HEIGHT = 120;
private static int NUM_PIXELS = WIDTH * HEIGHT;
private static int FRAME_SIZE = NUM_PIXELS * 2;
static RegulatedMotor mB = new EV3MediumRegulatedMotor(MotorPort.B);
private static int count = 0;
static RegulatedMotor mC = new EV3MediumRegulatedMotor(MotorPort.C);
static RegulatedMotor mA = new EV3MediumRegulatedMotor(MotorPort.A);
static RegulatedMotor mD = new EV3MediumRegulatedMotor(MotorPort.D);
public static void main(String[] args) throws IOException {
EV3 ev3 = (EV3) BrickFinder.getLocal();
Video video = ev3.getVideo();
video.open(WIDTH, HEIGHT);
byte[] frame = video.createFrame();
BufferedImage img = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
ServerSocket ss = new ServerSocket(8080);
Socket sock = ss.accept();
String boundary = "Thats it folks!";
writeHeader(sock.getOutputStream(), boundary);
while (Button.ESCAPE.isUp()) {
video.grabFrame(frame);
for(int i=0;i<FRAME_SIZE;i+=4) {
int y1 = frame[i] & 0xFF;
int y2 = frame[i+2] & 0xFF;
int u = frame[i+1] & 0xFF;
int v = frame[i+3] & 0xFF;
int rgb1 = convertYUVtoARGB(y1,u,v);
int rgb2 = convertYUVtoARGB(y2,u,v);
img.setRGB((i % (WIDTH * 2)) / 2, i / (WIDTH * 2), rgb1);
img.setRGB((i % (WIDTH * 2)) / 2 + 1, i / (WIDTH * 2), rgb2);
}
writeJpg(sock.getOutputStream(), img, boundary);
}
video.close();
sock.close();
ss.close();
}
private static void writeHeader(OutputStream stream, String boundary) throws IOException {
stream.write(("HTTP/1.0 200 OK\r\n" +
"Connection: close\r\n" +
"Max-Age: 0\r\n" +
"Expires: 0\r\n" +
"Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0\r\n" +
"Pragma: no-cache\r\n" +
"Content-Type: multipart/x-mixed-replace; " +
"boundary=" + boundary + "\r\n" +
"\r\n" +
"--" + boundary + "\r\n").getBytes());
//Delay.msDelay(5000);
mC.setSpeed(510); mC.forward();
mB.setSpeed(50);
mB.rotateTo(90);
mB.rotateTo(0);
mB.rotateTo(-90);
mB.rotateTo(0);
mA.synchronizeWith(new RegulatedMotor[] {mD});
mA.startSynchronization();
mA.backward();
mD.backward();
mA.endSynchronization();
//Delay.msDelay(5000);
mA.startSynchronization();
mA.stop(true);
mD.stop(true);
mA.endSynchronization();
int count = 0;
while(count<2) {
mB.setSpeed(50);
mB.rotateTo(90);
mB.rotateTo(0);
mB.rotateTo(-90);
mB.rotateTo(0);
count ++;}
}
private static void writeJpg(OutputStream stream, BufferedImage img, String boundary) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
byte[] imageBytes = baos.toByteArray();
stream.write(("Content-type: image/jpeg\r\n" +
"Content-Length: " + imageBytes.length + "\r\n" +
"\r\n").getBytes());
stream.write(imageBytes);
stream.write(("\r\n--" + boundary + "\r\n").getBytes());
}
private static int convertYUVtoARGB(int y, int u, int v) {
int c = y - 16;
int d = u - 128;
int e = v - 128;
int r = (298*c+409*e+128)/256;
int g = (298*c-100*d-208*e+128)/256;
int b = (298*c+516*d+128)/256;
r = r>255? 255 : r<0 ? 0 : r;
g = g>255? 255 : g<0 ? 0 : g;
b = b>255? 255 : b<0 ? 0 : b;
return 0xff000000 | (r<<16) | (g<<8) | b;
}
}
Слайд 1
Авторы: Слабажанин Павел, Ученик 8 класса Прототип Робота спасателяСлайд 2
Цель работы – на базе конструктора Lego Mindstorms EV 3 провести исследование по возможности создания прототипа робота спасателя для шахт. Объект – датчики и моторы базового комплекта Lego Mindstorms EV 3, программное обеспечение. Предмет – электронный прототип робота спасателя.
Слайд 3
Задачи: изучить литературу по данной теме, определиться с необходимыми датчиками и конструкцией модели, собрать модель, написать программу для движения собранной модели по требуемому алгоритму, провести пробные испытания движения модели, провести анализ полученных результатов.
Слайд 4
Спасатель. Прототип должен прибыть на место аварии и с помощью бура углубится в завал, через определенные моменты времени он должен останавливаться, подавать звуковые сигналы и обследовать окружающую обстановку. После чего возобновлять движение. В перспективе, планируется осуществлять передачу данных об окружающей обстановке на пульт оператора и возможность управления роботом с пульта оператора.
Слайд 8
Выводы : При анализе результатов выяснилось следующее. Возникли трудности с изготовлением на 3- D принтере модели бура. При печати бура большого диаметра, происходило отставание бура от площадки. При исследовании модели, так же выяснилось, что при имеющихся возможностях EV 3 не удастся подключить камеру для трансляции видео и звука на пульт оператора. Так же, необходимо предусмотреть наличие датчиков загазованности.
Слайд 9
Заключение. После проведенных исследований было сделано заключение, что на базе программного обеспечения EV 3 невозможно создать достаточно работоспособную модель такого робота. Поэтому было решено продолжить работу над этой моделью. Перевести программное обеспечение на LeJos и написать другую программу. На базе данного программного обеспечения предусматривается съемка окружающей обстановки, прослушка окружающего пространства, определение загазованности и передача этих данных на пульт диспетчера. При необходимости, к роботу можно прицепить тележку для доставки продуктов и медикаментов пострадавшим до прибытия основной помощи. Даже на базе конструктора Lego Mindstorms EV 3 можно собрать действующую модель такого транспорта, которая достаточно реалистично показывают технологию организации спасательной операции. Было решено продолжить изучение возможностей данного конструктора для усовершенствования модели.
Слайд 10
После перевода программного обеспечения на базу LeJos , выяснилось следующее: появилась возможность подключить видеокамеру и передавать потоковое видео прямо на компьютер, есть возможность управлять всеми двигателями, есть возможность подключения различных дополнительных датчиков (например – загазованности, влажности и т.п.).
Слайд 12
Проблемы: При включении управления моторами, не удалось сразу передавать видео. Подключение по блютузу , тоже вызывает нарекания из за неустойчивой связи. Для удаленного управления моторами, необходимо писать дополнительную программу, что бы диспетчер мог управлять роботом с компьютера. Выводы. По результатам проведенной работы, можно сделать вывод, что прототип робота-спасателя вполне работоспособен. Для дальнейшего усовершенствования необходимо продолжить изучение языка Java . После чего можно будет доработать данную модель и снабдить ее дополнительным оборудованием.
Слайд 13
Листинг программы: package MoiSpas ; //import java.awt.Button ; import java.awt.image.BufferedImage ; import java.io.ByteArrayOutputStream ; import java.io.IOException ; import java.io.OutputStream ; import java.net.ServerSocket ; import java.net.Socket ; import lejos.hardware.Button ; import javax.imageio.ImageIO ; import lejos.hardware.BrickFinder ; import lejos.hardware.ev3.EV3; import lejos.hardware.video.Video ; import lejos.robotics.RegulatedMotor ; import lejos.utility.Delay ; import lejos.hardware.motor.EV3MediumRegulatedMotor; import lejos.hardware.port.MotorPort ; public class vid { private static int WIDTH = 160; private static int HEIGHT = 120; private static int NUM_PIXELS = WIDTH * HEIGHT ; private static int FRAME_SIZE = NUM_PIXELS * 2; static RegulatedMotor mB = new EV3MediumRegulatedMotor( MotorPort. B ); private static int count = 0; static RegulatedMotor mC = new EV3MediumRegulatedMotor( MotorPort. C ); static RegulatedMotor mA = new EV3MediumRegulatedMotor( MotorPort. A ); static RegulatedMotor mD = new EV3MediumRegulatedMotor( MotorPort. D ); public static void main(String[] args ) throws IOException { EV3 ev3 = (EV3) BrickFinder. getLocal (); Video video = ev3.getVideo(); video.open ( WIDTH , HEIGHT ); byte [] frame = video.createFrame (); BufferedImage img = new BufferedImage ( WIDTH , HEIGHT ,BufferedImage. TYPE_INT_RGB ); ServerSocket ss = new ServerSocket (8080); Socket sock = ss.accept (); String boundary = " Thats it folks!"; writeHeader ( sock.getOutputStream (), boundary); while ( Button. ESCAPE .isUp ()) { video.grabFrame (frame); for ( int i=0;i< FRAME_SIZE ;i +=4) { int y1 = frame[i] & 0xFF; int y2 = frame[i+2] & 0xFF; int u = frame[i+1] & 0xFF; int v = frame[i+3] & 0xFF; int rgb1 = convertYUVtoARGB (y1,u,v); int rgb2 = convertYUVtoARGB (y2,u,v); img.setRGB ((i % ( WIDTH * 2)) / 2, i / ( WIDTH * 2), rgb1); img.setRGB ((i % ( WIDTH * 2)) / 2 + 1, i / ( WIDTH * 2), rgb2);
Слайд 14
} writeJpg ( sock.getOutputStream (), img , boundary); } video.close (); sock.close (); ss.close (); } private static void writeHeader ( OutputStream stream, String boundary) throws IOException { stream.write (("HTTP/1.0 200 OK\r\n" + "Connection: close\r\n" + "Max-Age: 0\r\n" + "Expires: 0\r\n" + "Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0\r\n" + "Pragma: no-cache\r\n" + "Content-Type: multipart/x-mixed-replace; " + "boundary=" + boundary + "\r\n" + "\r\n" + "--" + boundary + "\r\n"). getBytes ()); // Delay.msDelay (5000); mC .setSpeed (510); mC .forward (); mB .setSpeed (50); mB .rotateTo (90); mB .rotateTo (0); mB .rotateTo (-90); mB .rotateTo (0); mA .synchronizeWith ( new RegulatedMotor [] { mD }); mA .startSynchronization (); mA .backward (); mD .backward (); mA .endSynchronization (); // Delay.msDelay (5000); mA .startSynchronization (); mA .stop ( true ); mD .stop ( true ); mA .endSynchronization (); int count = 0; while (count<2) { mB .setSpeed (50); mB .rotateTo (90); mB .rotateTo (0); mB .rotateTo (-90); mB .rotateTo (0); count ++;} } private static void writeJpg ( OutputStream stream, BufferedImage img , String boundary) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream (); ImageIO. write ( img , "jpg", baos ); byte [] imageBytes = baos.toByteArray (); stream.write (("Content-type: image/jpeg\r\n" + "Content-Length: " + imageBytes.length + "\r\n" + "\r\n"). getBytes ());
Слайд 15
stream.write ( imageBytes ); stream.write (("\r\n--" + boundary + "\r\n"). getBytes ()); } private static int convertYUVtoARGB ( int y, int u, int v) { int c = y - 16; int d = u - 128; int e = v - 128; int r = (298*c+409*e+128)/256; int g = (298*c-100*d-208*e+128)/256; int b = (298*c+516*d+128)/256; r = r>255? 255 : r<0 ? 0 : r; g = g>255? 255 : g<0 ? 0 : g; b = b>255? 255 : b<0 ? 0 : b; return 0xff000000 | (r<<16) | (g<<8) | b; } }
Прыжок (быль). Л.Н.Толстой
Лягушка-путешественница
Рисуем одуванчики гуашью (картина за 3 минуты)
О путнике
Чья проталина?