С новым годом, всех фанатов робототехники !:)
Ну-с начнем
!
Цитата:
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 [ 58.6 КиБ | Просмотров: 2156 ]
Лучше было бы представить матрицу связей как двухмерный массив, но увы, басик только с одномерными работает кажись .
Код:
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) В сети должна быть одна функция активации.
Честно не знаю, учусь и пишу как мысля пришла,Эйнштейн тоже физику не знал
Цитата:
3) Про формулу - почему при рассчете весов не используется функция активации?
Чуть не понял вопроса - кажись используется :
.Может я путаю с функцией активности ?
Цитата:
Весовые коеффициенты не могут быть нулевыми.
Я ж сам пытаюсь обучать сеть, еще учителя не отладил.
Цитата:
3. Зачем изменять? - Ваша задача научить робота определить это линия или нет, а для таких целей хватит и одного нейрона с сигмоидальной функцией активации. В сети не может быть слоев которые отключаются.
структуру я вижу малость сложнее, я хочу чтоб оно говорило, точнее сеть на каком участке "оно" находится " прямая или поворот и т.д."
Цитата:
6. Почему связи отмирают? У вас в сети уже наступил паралич? Тогда попробуйте поменять трассу. Структура сети, обычно, задается, ее поведение определяют весовые коэффициенты, связи если "отмирают" или каким-то образом добавляют новые приводят к небходимости перерасчета всех весовых коэффициентов.
Да наступал