Разработка роботизированной платформы

Обзор методов реализации алгоритмов искусственного интеллекта. Примеры интеллектуальных систем, основанных на алгоритмах самообучения и кластеризации данных. Создание общей структурной схемы. Выбор языков программирования и инструментальных средств.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 20.08.2017
Размер файла 1,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Развитие и совершенствование разработанной системы

Для дальнейшего развития системы и возможного улучшения получаемых результатов были выявлены следующие пути работ:

объединение клиентской и серверной частей в единое устройство (при наличии возможности), что позволит избежать использования сетевых протоколов передачи данных и уменьшить время отклика каждой из частей системы;

разработка системы предварительного анализа входных и выходных данных системы, позволяющей максимально автоматизировать процесс нормализации данных и минимизировать вмешательство пользователей;

для систем, включающих клиент, схожий с разработанным (роботизированная передвигающаяся платформа) - увеличение количества датчиков, добавление контактных датчиков для более точной фиксации столкновений клиента, расширение угла обзора цифровой видеокамеры, что позволит более точно определять имеющуюся ситуацию и контролировать происходящие вокруг события.

Результаты, полученные каждым автором работы

Ниже представлены списки проделанных каждым автором работ в рамках выполнения всей работы.

Некрасов Даниил:

выбор и реализация алгоритма самообучения;

выбор и реализация методов предварительной обработки входных данных;

проведение конечного обучения и тестирования системы.

Русанов Андрей:

выбор элементной базы клиентской части системы;

реализация программных интерфейсов клиентской и серверной частей системы;

сборка устройства-клиента;

тестирование и отладка клиентской части системы.

Список использованных источников

1. Guizzo E.: How google's self-driving car works // IEEE Spectrum Online, October, vol.18, 2011.

2. Rojo J., Rojas R.: Spirit of Berlin: An Autonomous Car for the DARPA Urban Challenge Hardware and Software Architecture, 2007.

3. Marc Raibert, Kevin Blankespoor, Gabriel Nelson, Rob Playter: BigDog, the Rough-Terrain Quadruped Robot, Boston Dynamics, Waltham, USA, 2008

4. Atlas - The Agile Anthropomorphic Robot // BOSTONDYNAMICS.com: официальный сайт компании Boston Dynamics. URL: http://www.bostondynamics.com/bd_about.html (дата обращения: 21.04.2017)

5. Metz C.: Google's AI Wins Pivotal Second Game in Match With Go Grandmaster. // Wired News, 10 March 2016

6. Maas D.: How AlphaGo Works. // Maas Digital, 28 January 2016

7. Documentation for Arduino Uno // ARDUINO. CC: официальный сайт разработчиков. URL: https: // www.arduino. cc/en/Main/ArduinoBoardUno (дата обращения: 20.10.2016)

8. Raspberry Pi documentation // RASPBERRYPI.org: официальный сайт разработчиков / Raspberry Pi Foundation. URL: https: // www.raspberrypi.org/documentation/ (дата обращения: 10.01.2017)

9. Флах П. Машинное обучение. Наука и искусство построения алгоритмов, которые извлекают знания из данных // Litres, 2017.

10. Hartigan J. A., Wong M. A. Algorithm AS 136: A k-means clustering algorithm // Journal of the Royal Statistical Society. Series C (Applied Statistics). - 1979. - Т.28. - №.1. - С.100-108.

11. Кохонен Т. Самоорганизующиеся карты Пер. с англ // М.: Бином. Лаборатория знаний. - 2008

12. RaspiCam Documentation // RASPBERRYPI.org: официальный сайт разработчиков / Raspberry Pi Foundation, июль 2013. URL: https: // www.raspberrypi.org/wp-content/uploads/2013/07/RaspiCam-Documentation. pdf

13. Ultrasonic ranging module: HC-SR04 documentation // ITead Studio. URL: http://iarduino.ru/lib/HC-SR04. pdf (дата обращения: 3.03.2017)

14. Некоторые подходы к организации содержательного поиска изображений и видеоинформации // Под ред. ИПМ им. М.В. Келдыша РАН, Россия, Москва. 2002

Приложения

Приложение 1

Исходный код скрипта, передающий коды действий клиенту

#! /usr/bin/python3

import socket

import sys,tty,termios

s = socket. socket (socket. AF_INET, socket. SOCK_STREAM)

host ='192.168.43.122'

port =8000

s. connect ( (host,port))

#! /usr/bin/env python

import sys

import termios

import contextlib

@contextlib. contextmanager

def raw_mode (file):

old_attrs = termios. tcgetattr (file. fileno ())

new_attrs = old_attrs [:]

new_attrs [3] = new_attrs [3] & ~ (termios. ECHO | termios. ICANON)

try:

termios. tcsetattr (file. fileno (), termios. TCSADRAIN, new_attrs)

yield

finally:

termios. tcsetattr (file. fileno (), termios. TCSADRAIN, old_attrs)

def main ():

print 'exit with ^C or ^D'

with raw_mode (sys. stdin):

try:

while True:

ch = sys. stdin. read (1)

if not ch or ch == chr (4):

break

while (1):

k=ord (ch)

if k! ='': break

if k==119:

s. send ('1')

elif k==120:

s. send ('4')

elif k==101:

s. send ('3')

elif k==113:

s. send ('2')

elif k==122:

s. send ('5')

elif k==99:

s. send ('6')

elif k==115:

s. send ('0')

else:

print "not an arrow key!"

except (KeyboardInterrupt, EOFError):

pass

if __name__ == '__main__':

main ()

s. close ()

Приложение 2

Исходный код скрипта, считывающий показания датчиков

import RPi. GPIO as GPIO

import io

import time

from socket import *

from io import BytesIO

from time import sleep

from picamera import PiCamera

from PIL import Image

import struct

import serial

host = '192.168.43.122'

port = 8000

addr = (host,port)

tcp_socket = socket (AF_INET, SOCK_STREAM)

tcp_socket. bind (addr)

tcp_socket. listen (5)

conn, addr = tcp_socket. accept ()

GPIO. setwarnings (False)

GPIO. setmode (GPIO. BOARD)

TRIG = 16

ECHO = 18

GPIO. setup (TRIG, GPIO. OUT, initial=0)

GPIO. setup (ECHO, GPIO. IN)

stream = io. BytesIO ()

camera = PiCamera ()

camera. color_effects = (128,128)

camera. resolution = (320,240)

camera. start_preview ()

ser = serial. Serial ('/dev/ttyUSB0', 9600)

outfile = open ('out', 'wb')

try:

while True:

comand = conn. recv (1024)

GPIO. output (TRIG,1)

time. sleep (0.00001)

GPIO. output (TRIG,0)

while GPIO. input (ECHO) == 0:

pass

start = time. time ()

while GPIO. input (ECHO) == 1:

pass

stop = time. time ()

distance = int ( (stop - start) *17000)

camera. capture (stream, format='jpeg')

stream. seek (0)

image = Image. open (stream)

#stream. seek (0)

#stream. truncate (0)

graylist = []

rgblist = list (image. getdata ())

for rgbpixel in rgblist:

graylist. append (rgbpixel [0]);

graylist. append (distance)

graylist. append (int (comand))

outfile. write (str (graylist) + '\n')

ser. write (str (comand) +'; \n')

time. sleep (0.3)

ser. write ('0; \n')

stream. seek (0)

stream. truncate (0)

except KeyboardInterrupt:

GPIO. cleanup ()

tcp_socket. close ()

Приложение 3

Исходный код класса "teacher"

teacher. h

#ifndef teacher_H

#define teacher_H

#include "som. h"

#include "neuron. h"

#include <stdio. h>

#include <algorithm>

struct situation_act

{

neuron situation;

unsigned int act;

};

#define IMAGE_LEN 76800

#define MAXERA 100

#define ACTIONMAX 7

#define MAPS_FOLDER "saves/maps"

#define TRANSLATOR_FOLDER "saves/translator"

class teacher

{

public:

teacher ();

void train (std:: string trainingSetFolder, float Rcritical, float v, float dv);

void test (std:: string testFolder, int testNumber);

private:

typedef std:: vector<unsigned int> clusterAction;

SOM *map;

std:: vector<clusterAction> translator;

std:: vector<situation_act> currentTrainingSet;

int currentDataBaseNumber;

int lastMapNumber;

int lastTranslatorNumber;

unsigned int start_with_era;

void loadLastState ();

bool loadNextDataBase (std:: string trainingSetFolder);

void teachCurrentTrainingSet (float Rcritical, float v, float dv);

unsigned int situationToAction (neuron situation);

void nextEra ();

std:: vector<situation_act> loadSituationVector (FILE *f);

double discretSensorValue (double val);

std:: string getFileName (const std:: string folder, const int counter);

void writeTranslatorToFile (FILE *f, unsigned int currEra);

int getLastFileNumberInFolder (const std:: string folder);

};

#endif // teacher_H

teacher. cpp

#include "teacher. h"

teacher:: teacher ()

{

currentDataBaseNumber = 0;

map = new SOM ();

start_with_era = 0;

loadLastState ();

}

void teacher:: loadLastState ()

{

FILE *f;

lastMapNumber = getLastFileNumberInFolder (MAPS_FOLDER);

f = fopen (getFileName (MAPS_FOLDER, lastMapNumber++). data (), "r");

if (f)

map->loadState (f);

fclose (f);

lastTranslatorNumber = getLastFileNumberInFolder (TRANSLATOR_FOLDER);

f = fopen (getFileName (TRANSLATOR_FOLDER, lastTranslatorNumber++). data (), "r");

if (f)

{

// TODO

printf ("Translator: Loading from file\n");

unsigned int size;

fscanf (f, "%u\n", &start_with_era);

start_with_era++; // because in file we save the last era number

fscanf (f, "%d\n",&size);

for (unsigned int i = 0; i < size; i++)

{

translator. push_back (clusterAction (ACTIONMAX, 0));

for (unsigned int j = 0; j < ACTIONMAX; j++)

fscanf (f, "%d", &translator. at (i). at (j));

}

}

fclose (f);

}

void teacher:: train (std:: string trainingSetFolder, float Rcritical, float v, float dv)

{

printf ("Train\n");

while (loadNextDataBase (trainingSetFolder))

{

// FILE *f;

// f = fopen ("ro. txt", "w");

// for (int i = 0; i < currentTrainingSet. size () - 1; i++)

// for (int j = i + 1; j < currentTrainingSet. size (); j++)

// fprintf (f, "%f\n", currentTrainingSet. at (i). situation. getDistance (currentTrainingSet. at (j). situation));

// fclose (f);

printf ("Database loaded\n");

teachCurrentTrainingSet (Rcritical, v, dv);

}

printf ("Not found database file anymore\n");

}

bool teacher:: loadNextDataBase (std:: string trainingSetFolder)

{

FILE *f;

std:: string filename = getFileName (trainingSetFolder, currentDataBaseNumber++);

f = fopen (filename. data (), "r");

if (! f)

return false;

currentTrainingSet = loadSituationVector (f);

return true;

}

std:: vector<situation_act> teacher:: loadSituationVector (FILE *f)

{

printf ("Loading file: \n");

std:: vector<situation_act> res;

res. clear ();

if (f)

{

neuron tempNeu;

int tmp;

situation_act situation;

while (EOF! = fscanf (f, " ["))

{

if (res. size () % 100 == 0)

printf ("Current lenght of res: %d\n",res. size ());

tempNeu. clear ();

// read cam image

for (unsigned int i = 0; i < IMAGE_LEN; i++)

{

fscanf (f, "%d,", &tmp);

tempNeu. w. push_back (double (tmp / 8) / 15);

}

// read sensor

fscanf (f, "%d,", &tmp);

tempNeu. w. push_back (discretSensorValue (tmp));

// read action

fscanf (f, "%d] \n", &tmp);

// insert into situatin vector

situation. situation = tempNeu;

situation. act = tmp;

res. push_back (situation);

}

fclose (f);

}

return res;

}

void teacher:: teachCurrentTrainingSet (float Rcritical, float v, float dv)

{

printf ("Training on database: %d\n", currentDataBaseNumber - 1);

map->Rcritical = Rcritical;

map->setVandDV (v - (dv * start_with_era), dv);

for (unsigned int era = start_with_era; era < MAXERA; era++)

{

printf ("Start of %d era\n", era);

nextEra ();

// end of Era actions:

std:: vector<bool> neuronUsage = map->getUsage ();

for (unsigned int i = 0; i < neuronUsage. size ();)

if (neuronUsage [i])

i++;

else

{

translator. erase (translator. begin () + i);

neuronUsage. erase (neuronUsage. begin () + i);

}

map->endOfEra ();

if (era && era % 10 == 0)

{

FILE *f;

f = fopen (getFileName (MAPS_FOLDER, lastMapNumber++). data (), "w");

if (f)

{

map->saveStateToFile (f);

fclose (f);

}

else

printf ("Save map state error: folder not found. \n");

f = fopen (getFileName (TRANSLATOR_FOLDER, lastTranslatorNumber++). data (), "w");

if (f)

{

writeTranslatorToFile (f, era);

fclose (f);

}

else

printf ("Save translator state error: folder not found. \n");

}

}

start_with_era = 0;

}

unsigned int teacher:: situationToAction (neuron situation)

{

return = map->sendNeuron (situation, true);

}

void teacher:: writeTranslatorToFile (FILE *f, unsigned int currEra)

{

fprintf (f, "%d\n", currEra);

fprintf (f, "%d\n", translator. size ());

for (unsigned int i = 0; i < translator. size (); i++)

{

for (unsigned int j = 0; j < translator. at (i). size (); j++)

fprintf (f, "%d", translator. at (i). at (j));

fprintf (f, "\n");

}

}

int teacher:: getLastFileNumberInFolder (const std:: string folder)

{

FILE *f;

int counter = 0;

// search last file

while ( (f = fopen (getFileName (folder, counter++). data (), "r")))

{

if (f)

fclose (f);

}

counter - = 2;

f = fopen (getFileName (folder, counter). data (), "r");

if (f)

fclose (f);

return counter;

}

void teacher:: test (std:: string testFolder, int testNumber)

{

printf ("Testing: \n");

std:: vector<situation_act> testSituationVector;

FILE *f;

f = fopen (getFileName (testFolder, testNumber). data (), "r");

unsigned int cluster;

int good = 0;

int maxID;

if (f)

{

testSituationVector = loadSituationVector (f);

for (unsigned int i = 0; i < testSituationVector. size (); i++)

{

cluster = map->sendNeuron (testSituationVector. at (i). situation, true);

if (cluster >= translator. size ())

printf ("Test fail! (New cluster number) \n");

else

{

maxID = 0;

for (unsigned int j = 1; j < ACTIONMAX; j++)

if (translator. at (cluster). at (j) > translator. at (cluster). at (maxID))

maxID = j;

if (maxID == testSituationVector. at (i). act)

good++;

}

}

printf ("Total: %d; good: %d (%0.2f\%) \n", testSituationVector. size (), good,

100 * float (good) / testSituationVector. size ());

fclose (f);

}

}

void teacher:: nextEra ()

{

std:: clock_t start;

start = std:: clock ();

std:: srand (std:: time (0));

std:: random_shuffle (currentTrainingSet. begin (), currentTrainingSet. end ());

neuron situation;

int currentAct;

unsigned int currentClusterNumber;

for (unsigned int i = 0; i < currentTrainingSet. size (); i++)

{

situation = currentTrainingSet. at (i). situation;

currentAct = currentTrainingSet. at (i). act;

currentClusterNumber = map->sendNeuron (situation);

if (currentClusterNumber == translator. size ())

// if new cluster

translator. push_back (clusterAction (ACTIONMAX, 0));

translator. at (currentClusterNumber). at (currentAct) ++;

}

printf ("Era time: %d s\n", int ( (std:: clock () - start) / (double) (CLOCKS_PER_SEC / 1000)) / 1000);

}

double teacher:: discretSensorValue (double val)

{

// return val / 255;

if (val < 40)

return 0;

if (val > 50)

return 1;

return 0.5;

}

std:: string teacher:: getFileName (const std:: string folder, const int counter)

{

std:: string filename (folder);

filename. append ("/");

filename. append (std:: to_string (counter));

filename. append (". txt");

return filename;

}

Приложение 4

Исходный код класса "neuron"

neuron. h

#ifndef NEURON_H

#define NEURON_H

#include<vector>

#include<math. h>

#include<stdio. h>

#include<limits. h>

#include<ctime>

class neuron

{

public:

std:: vector<double> w; // coordinates in n-dimensional space

neuron ();

double getDistance (neuron other);

void saveToFile (FILE *f);

void loadFromFile (FILE *F);

void normalize (unsigned int maxValue = 255, unsigned int minValue = 0);

void clear ();

};

#endif // NEURON_H

neuron. cpp

#include "neuron. h"

neuron:: neuron ()

{

w. clear ();

}

double neuron:: getDistance (neuron other)

{

double sum = 0;

for (unsigned int i = 0; i < w. size (); i++)

sum += pow (w [i] - other. w [i],

2);

return sqrt (sum);

}

void neuron:: saveToFile (FILE *f)

{

for (unsigned int i = 0; i < w. size (); i++)

fprintf (f,"%f ",w. at (i));

fprintf (f,"\n");

}

void neuron:: normalize (unsigned int maxValue, unsigned int minValue)

{

// normalize in loadFromImage by calling redF, greenF, blueF

}

void neuron:: clear ()

{

w. clear ();

}

Приложение 5

Исходный код класса "som"

som. h

#ifndef SOM_H

#define SOM_H

#include <vector>

#include "neuron. h"

#include <stdio. h>

#include <thread>

#define VMIN 0.05

class SOM

{

private:

std:: vector<neuron> map; // neuron map

std:: vector<bool> mapUsage; // vector of map usage

double v; // speed of study

double dv; // delta of study speed

unsigned int addNewCenter (neuron neu);

unsigned int correntWinnerWeight (neuron neu, int winID);

int tAnswer [4];

public:

SOM ();

bool setVandDV (double _v, double _dv);

unsigned int sendNeuron (neuron neu, bool isNoChange = false);

std:: vector<bool> getUsage ();

void endOfEra ();

void saveStateToFile (FILE *f);

void loadState (FILE *f);

void getMin (unsigned int id, unsigned int begin, unsigned int end, neuron neu);

double Rcritical; // The maximum Euclidean distance between an example of inputs and weights of the neuron-winner

// If distance is less than this variable a new neuron will be created

};

#endif // SOM_H

som. cpp

#include "som. h"

SOM:: SOM ()

{

Rcritical = 1;

v = 0.5;

}

bool SOM:: setVandDV (double _v, double _dv)

{

if (_v >= VMIN && _v <= 1 && _v > _dv && _dv > 0)

{

v = _v;

dv = _dv;

return true;

}

return false;

}

void SOM:: endOfEra ()

{

if (v - dv >= VMIN)

v - = dv;

for (unsigned int i = 0; i < map. size ();)

if (mapUsage [i])

{

mapUsage [i] = false;

i++;

}

else

{

map. erase (map. begin () + i);

mapUsage. erase (mapUsage. begin () + i);

}

}

void SOM:: saveStateToFile (FILE *f)

{

fprintf (f,"%d\n",map. size ());

fprintf (f,"%d\n",map. at (0). w. size ());

for (unsigned int i = 0; i < map. size (); i++)

map. at (i). saveToFile (f);

}

void SOM:: loadState (FILE *f)

{

printf ("SOM: Loading from file\n");

unsigned int _size, _size_neu;

fscanf (f,"%d",&_size);

fscanf (f,"%d",&_size_neu);

neuron tempNeu;

double tempValue;

for (unsigned int i = 0; i < _size; i++)

{

tempNeu. clear ();

for (unsigned int j = 0; j < _size_neu; j++)

{

fscanf (f, "%lf", &tempValue);

tempNeu. w. push_back (tempValue);

}

map. push_back (tempNeu);

mapUsage. push_back (false);

}

}

void SOM:: getMin (unsigned int id, unsigned int begin, unsigned int end, neuron neu)

{

unsigned int minDistanceID = begin;

double minDistance = neu. getDistance (map [begin]), currentDistance;

for (unsigned int i = begin + 1; i <= end; i++)

{

currentDistance = neu. getDistance (map [i]);

if (currentDistance < minDistance)

{

minDistanceID = i;

minDistance = currentDistance;

}

}

tAnswer [id] = minDistanceID;

}

unsigned int SOM:: sendNeuron (neuron neu, bool isNoChange)

{

neu. normalize ();

// if we have an empty map, add first neuron

if (map. empty ())

return addNewCenter (neu); // create new claster center

int minDistanceID;

double minDistance, currentDistance;

// search for winner neuron

if (map. size () < 4)

{

minDistanceID = 0;

minDistance = neu. getDistance (map [minDistanceID]);

for (unsigned int i = 1; i < map. size (); i++)

{

currentDistance = neu. getDistance (map [i]);

if (currentDistance < minDistance)

{

minDistanceID = i;

minDistance = currentDistance;

}

}

}

else

{

std:: thread t1 (&SOM:: getMin, this, 0, 0, map. size () / 4 - 1, neu);

std:: thread t2 (&SOM:: getMin, this, 1, map. size () / 4, map. size () / 2 - 1, neu);

std:: thread t3 (&SOM:: getMin, this, 2, map. size () / 2, 3 * map. size () / 4 - 1, neu);

std:: thread t4 (&SOM:: getMin, this, 3, 3 * map. size () / 4, map. size () - 1, neu);

t1. join ();

t2. join ();

t3. join ();

t4. join ();

minDistanceID = tAnswer [0];

minDistance = neu. getDistance (map [minDistanceID]);

for (int i = 1; i < 4; i++)

{

currentDistance = neu. getDistance (map [tAnswer [i]]);

if (currentDistance < minDistance)

{

minDistanceID = tAnswer [i];

minDistance = currentDistance;

}

}

}

if (isNoChange)

return minDistanceID;

if (minDistance > Rcritical)

// create new claster center

return addNewCenter (neu);

else

// correct winner weight

return correntWinnerWeight (neu, minDistanceID);

}

std:: vector<bool> SOM:: getUsage ()

{

return mapUsage;

}

unsigned int SOM:: addNewCenter (neuron neu)

{

map. push_back (neu);

mapUsage. push_back (true);

return map. size () - 1;

}

unsigned int SOM:: correntWinnerWeight (neuron neu, int winID)

{

for (unsigned int i = 0; i < neu. w. size (); i++)

map [winID]. w [i] = map [winID]. w [i] + v * (neu. w [i] - map [winID]. w [i]);

mapUsage [winID] = true;

return winID;

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.