roboforum.ru

Технический форум по робототехнике.

Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

Michael_K » 01 янв 2010, 23:51

Не-не...
Я про то, что обучать-то видимо надо на какой-то выборке из всевозможных трасс.
Иначе оно научится на конкретную ширину линии и широкие левые повороты,
а на другой трассе работать откажется... Какой же это лайн трейсер тогда?
У этих же НС и всяких ГА так - фиг знает, чему оно учится на самом деле :)

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

MiBBiM » 02 янв 2010, 00:13

дык в фактически это одно и то же: бот, обученный только на одну трассу, противоречит идее соревнования.

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

JoHn_Syber » 03 янв 2010, 00:11

С новым годом, всех фанатов робототехники !:)
Ну-с начнем :)!

MiBBiM » Сегодня, 00:13
дык в фактически это одно и то же: бот, обученный только на одну трассу, противоречит идее соревнования.

Мне кажется, есть две большие разницы между «Идеей» и «Правилами». В правилах сказано :
Ограничения:
Робот должен быть автономным (включая BEAM-роботов) или полуавтономным (управляемым программой с PC по радиоканалу), управляемым в любом случае без участия человека или живых существ.

Как я понимаю, это означает, что без участия человека :) !
--------------------------------------------------------------------------------------------------------
MiBBiM » Вчера, 23:20
этот вопрос можно поставить даже более широко: а не получится ли так, что участники соревнований будут подстраивать свои машины именно под каждую трассу (можно даже забить её в память, наподобие 10 сек влево, 50 щелчков энкодера и т.д.)?


Думаю, что данное применение решение имеет место в этих соревнованиях, так как это не противоречит правилам. И кажись запись трасы в память и по памяти прохождение (как по карте) – это даже классная идея , которую можно в дальнейшем использовать например управлении пылесосом который, пользуясь планом дома будет пылесосить. И эта реализация на порядок будет сложнее чем простая автоматика «фотодиод – транзистор – мотор – обратная связь».

---------------------------------------------------------------------------------------------------------
Lockdog » Вчера, 20:20
Обобщу вопросы D1mcon'а - можно код в студию?=)
Тоже очень интересны нейронные сети, сам их мучаю, потому интересна уже готовая реализация.


Код :) еще не дописан потому что идет доработка робота и кода, но вот куски и объяснение.
А рабочий код и полнометражное видео предоставлю, если справлюсь на себя самим возложенную задачу.
Начну по порядку :
Изначально хотел просто победить соревновании, но как уточнил мало было времени.
Собрал робота из того что было то бишь, мусор и просто запчасти :), (говоря по секрету я хотел туда втулить акселерометр и сделать полный программный автомат который летает с бешеной скоростью, но праздники и стоимость прибора остановили от затеи) и вот что было с того слепил и полюбил :). Но не учел интересный момент как говориться «не важно откуда растут руки, если они золотые ». И после проверки простого кода увидел тьму ошибок в конструкции и расчетах вот они :
1. «оНо» получилось очень тяжелым и быстрым – следовательно как вы видели на видео на скорости «оно», вылетает с трасы.
2. Так как задний привод и при этом крутятся два колеса, «оНо» после определенного угла поворота руля – эта хрень прет прямо, из-за этого мне пришлось добавить на переднее колесо мотор.
3. Плюс «оНо» на скорости какого – то чуда подпрыгивает и сцепление меняется то левое или правое колесо, а с учетом что его вообще трудно заставить ехать прямо, пришлось отказаться от простой программной автоматики.
Вот код :
Код: Выделить всёРазвернуть
Config Servos = 1 , Servo1 = Portd.5 , Reload = 10
Do
If Pinc.5 = 1 And Pinc.6 = 0 Then Rul = Rul + 10 : Set Rotot   
If Pinc.6 = 0 And Pinc.7 = 0 Then Rul = Rul + 20 : Set Rotot           
If Pinc.6 = 1 And Pinc.7 = 0 Then Rul = Rul + 35 : Set Rotot
If Pinc.5 = 0 And Pinc.6 = 1 Then Rul = Rul - 5             ':Set Motor
If Pinc.4 = 0 And Pinc.5 = 0 Then Rul = Rul - 10            ':Set Motor
If Pinc.4 = 0 And Pinc.5 = 1 Then Rul = Rul - 15            ':Set Motor

If Rul > Maxserv Or Rul < Minserv Then Rul = Center
If Rul < Center Then Reset Rotot
If Rul = Rul_pred Then Reset Rotot
Servo(1) = Rul
If Pinc.5 = 0 And Pinc.6 = 0 Then Set Motor : Rul = Center
If Pinc.4 = 0 Or Pinc.5 = 0 Or Pinc.6 = 0 Or Pinc.7 = 0 Then Set Motor
If Pinc.4 = 0 And Pinc.5 = 0 And Pinc.6 = 0 And Pinc.7 = 0 Then Reset Motor
If Pinc.4 = 1 And Pinc.5 = 1 And Pinc.6 = 1 And Pinc.7 = 1 Then Reset Motor
Loop

Самое прикольное как «оНо» едет по линии, как велосипедист, балансируя передним колесом
И после всего этого решил опробывать нейроную сеть.

Переходим к нейронной сети.
После танцев с бубном над массивом нейронов 4х4, все упростил
Сеть такая :
Net.jpg


Лучше было бы представить матрицу связей как двухмерный массив, но увы, басик только с одномерными работает кажись .
Код: Выделить всёРазвернуть
Dim W1(3) As Single                                         'связь 1-го нейрона с выходными
Dim W2(3) As Single                                         'связь 2-го нейрона с выходными
Dim W3(3) As Single                                         'связь 3-го нейрона с выходными
Dim W4(3) As Single                                         'связь 4-го нейрона с выходными

Dim Y1(4) As Single                                         'матрица входов фотосенсоров
Dim Y2(3) As Single                                         ' выходная матрица

Dim Rul As Byte

Psound Alias Portc.2
Motor Alias Portc.0
Rotor Alias Portc.1

F0 Alias Pinc.4
F1 Alias Pinc.5
F2 Alias Pinc.6
F3 Alias Pinc.7



Const Xporog = 0 ' констант для пороговой функции


Const Maxserv = 120                                         ' максимальный поворот влево
Const Minserv = 45                                          ' максимальный поворот право
Const Center = 100                                          ' центральное положение

Const Xmin = -1
Const Xmax = 1

Dim Cc As Single
Dim Aa As Single
Dim Devsevr As Single
Dim Devx As Single
Dim I As Byte

Devsevr = Maxserv - Minserv
Devx = Xmax - Xmin

Aa = Devsevr / Devx
Cc = Aa * Xmin
Cc = Minserv - Cc

Declare Function Porog(x As Single) As Byte                 ' пороговая функция для моторов
Declare Function My_fun_serv(x As Single) As Byte           ' функция для сервы
Declare Sub Teacher                                         ' обучение - самое вкусное :)
Declare Sub Loadnet                                         ' загрузка сети в память

Call Loadnet

Do

'с входов фотосенсоров на вход нейронной сети
If F0 = 0 Then
            Y1(1) = 1
          Else
          Y1(1) = 0
End If

If F1 = 0 Then
          Y1(2) = 1
          Else
          Y1(2) = 0
End If

If F2 = 0 Then
          Y1(3) = 1
          Else
          Y1(3) = 0
End If

If F3 = 0 Then
          Y1(4) = 1
          Else
          Y1(4) = 0
End If


If F0 = 1 And F1 = 1 And F2 = 1 And F3 = 1 Then Call Teacher


'расчет выходов

Dim Temp As Single
Dim Moto As Byte
Dim Temp_moto As Byte

' серва
Y2(1) = Y1(1) * W1(1)

Temp = Y1(2) * W2(1)
Y2(1) = Y2(1) + Temp

Temp = Y1(3) * W3(1)
Y2(1) = Y2(1) + Temp

Temp = Y1(4) * W4(1)
Y2(1) = Y2(1) + Temp

Temp = Y2(1)
Moto = My_fun_serv(temp)
Servo(1) = Moto

' мотор поворота
Y2(2) = Y1(1) * W1(2)
Temp = Y1(2) * W2(2)
Y2(2) = Temp + Y2(2)

Temp = Y1(3) * W3(2)
Y2(2) = Temp + Y2(2)

Temp = Y1(4) * W4(2)
Y2(2) = Temp + Y2(2)


Temp = Y2(2)
Moto = Porog(temp)
If Moto = 1 Then Set Motor Else Reset Rotor



' мотор вперед
Y2(3) = Y1(1) * W1(3)
Temp = Y1(2) * W2(3)
Y2(3) = Temp + Y2(3)

Temp = Y1(3) * W3(3)
Y2(3) = Temp + Y2(3)

Temp = Y1(4) * W4(3)
Y2(3) = Temp + Y2(3)


Temp = Y2(3)
Moto = Porog(temp)
If Moto = 1 Then Set Rotor Else Reset Motor

Loop

такой маленький кусочек, а да функции активации кажись

Function Porog(x As Single) As Byte

If X < Xporog Then Porog = 0 Else Porog = 1

End Function
'-----------------------------------------
Function My_fun_serv(x As Single) As Byte
Dim Xx As Single

Xx = Aa * X
Xx = Xx + Cc
Xx = Abs(xx)
Rul = Int(xx)

If Rul > Maxserv Then Rul = Maxserv
If Rul < Minserv Then Rul = Minserv
My_fun_serv = Rul
End Function

так на чем я там остановился ...., обучение отлаживаю и там такое ...

D1mcon » 31 дек 2009, 15:30
1) В сети должна быть одна функция активации.

Честно не знаю, учусь и пишу как мысля пришла,Эйнштейн тоже физику не знал :oops:
3) Про формулу - почему при рассчете весов не используется функция активации?

Чуть не понял вопроса - кажись используется : :shock: .Может я путаю с функцией активности ?

Весовые коеффициенты не могут быть нулевыми.

Я ж сам пытаюсь обучать сеть, еще учителя не отладил.


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

структуру я вижу малость сложнее, я хочу чтоб оно говорило, точнее сеть на каком участке "оно" находится " прямая или поворот и т.д."


6. Почему связи отмирают? У вас в сети уже наступил паралич? Тогда попробуйте поменять трассу. Структура сети, обычно, задается, ее поведение определяют весовые коэффициенты, связи если "отмирают" или каким-то образом добавляют новые приводят к небходимости перерасчета всех весовых коэффициентов.

Да наступал :)
Последний раз редактировалось JoHn_Syber 03 янв 2010, 20:08, всего редактировалось 1 раз.

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

ALHIMIK » 03 янв 2010, 01:30

для кода есть тег code

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

D1mcon » 03 янв 2010, 10:26

Может я невнимательно посмотрел, но где код для тела функции Teacher :)

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

JoHn_Syber » 03 янв 2010, 11:12

D1mcon » 28 минут назад
Может я невнимательно посмотрел, но где код для тела функции Teacher

Да, я не добавил, функцию «Teacher», потому что похоже я там что то, начудил и в результате она как то сказать, убивает – обнуляет весовые коэффициенты, после последнего неудачного заезда робот налетел на стену и не хило себя покалечил, сейчас я делаю крепче корпус, добавил LCD дисплей 16*2, чтоб можно было посмотреть о чем задумался «оно» и добавил еще по 2 фототранзистора, которые будут аварийными. А корректировку весов я пробовал делать методом наименьших квадратов, но там я уже и сам запутался, перепишу, найду ошибку и с удовольствием выложу, мне просто тяжело добиться того чтоб сеть полностью автоматически без моего участия обучалась, тобишь «оно» само училось ездить учитывая глюкавость конструкции и всякие побочные явления такие как ускорение, скольжение и заносы, может я не правильно выбрал модель нейронной сети – тоже вариант. С удовольствием приму советы по программировании НС.

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

Andrew » 03 янв 2010, 17:21

JoHn_Syber, я бы предположил, что вы мало понимаете, что такое нс и зачем нс нужны. займитесь теорией сначала. посмотрите книгу: руденко, бодянский. искусственные нейронные сети (есть в нете и на рус и на укр). там хорошо описаны нс с примерами для студентов и есть раздел "система автоматического управления автомобилем" (у меня на стр.357-359)

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

JoHn_Syber » 03 янв 2010, 20:10

ALHIMIK писал(а):для кода есть тег code

Большое спасибо! Век живи - век учись!

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

Dimitri » 11 янв 2010, 14:24

Мне понравилась идея использования НС для хождения по линиям но та структура, которая здесь используется (ИМХО) мало эффективен, по сути своей это тот же автомат но с "нечеткой логикой". На мой взгляд есть два варианта создания мозгов для робота ездящего по линиям:
1) использовать двунаправленную ассоциативную память (ДАП) (возможно с дополнительными входами для предыдущих состояний как входных так и выходных) с котроллером который будет обучать эту самую память. По сути это будет реализация системы сознания и подсознания, где подсознанием будет ДАП а сознанием обучающий (корректирующий) контролер.
2) реализация модели верхних отделов мозга, т.е. мото- и сенсорные нейроны будут взаимодействовать на разном уровне aбстракции.

Преимущество первого подхода в простоте реализации и в быстрой преспосабливаимости, т.е. новую трасу он может осилить не всегда с первого раза. Но после нескольких кругов он будет знать все особенности и будет проходить ее на приделе своих возможностей.

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

Вывод.
для первого варианта:
+ простора НС
+ малые вычислительные затраты
- сложность реализации обучающего модуля
- малую универсальность

для второго варианта:
+ простота обучающего модуля
+ высокая универсальность
- большие вычислительные затраты на НС
- сложность реализации НС.

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

D1mcon » 11 янв 2010, 20:52

Не скромный вопрос: оно того стоит? :) Нейронные сети хорошо применимы при решении плохоформализованных задач. Езда по линии с использованием НС хороша только в академических целях :)

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

Lockdog » 11 янв 2010, 21:21

Я думаю, что тут академические цели и преследуются)))

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

Dimitri » 11 янв 2010, 21:31

Я не буду спорить что в данном случае почти любую НС с легкостью могут заменить два транзистора и пара регулируемых сопротивлений, просто хочется сделать нечто большее чем обычней Line Tracer, даже при не сопостовимых затратах.

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

repository » 12 янв 2010, 13:59

А что такое два транзистора и пара регулируемых сопротивлений как не пара нейронов?

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

Dimitri » 13 янв 2010, 13:11

repository писал(а):А что такое два транзистора и пара регулируемых сопротивлений как не пара нейронов?

Хорошее замечание :) .
По сути два транзистора и пара регулируемых сопротивлений действительно являются примитивной HC с линейной функцией активации. Просто два транзистора гораздо проще чем эмуляция многослойной НС с помощью МК.

Re: Мой первый Line Tracer c нейронной сетью «Неуловимый Джо»

D1mcon » 13 янв 2010, 19:36

если не ошибаюсь у philips есть микросхемы с нс. :) Ну, по крайней мере, у меня на лекциях по нс что-то такое мелькало.


cron
Rambler\'s Top100 Mail.ru counter