roboforum.ru

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

Система локального позиционирования робота-пылесоса

Система локального позиционирования робота-пылесоса

Сообщение EdGull » 16 сен 2008, 12:41

И так реинкорнация системы позиционирования на маяках...
Нужно-не нужно и прочие политические вопросы, здесь не обсуждаем, исключительно техническая часть!!!

Необходимо разработать систему локального позиционирования робота в одном помещении.
Точность позиционирования не менее +-250мм

Есть две гипотезы маяки на УЗ и на Зигби

На ультра звуковых маяках я пока вижу это так:
бот шлет ИК-посылку "маяк №1 - ответь" и включает счетчик
если маяк принял ИК-посылку для себя, то он делает генерацию УЗ-излучателем.
при получении на свой УЗ-приемник посылки от маяка, бот останавливает счетчик, и переводит его показания в метры.
Таким образм, получив дистанции от 3-4 маяков мы получим местонахождение бота.

Начинаем проверку гипотезы ультразвукогово варианта.
первая и самая большая затыка, постоянно ли время получения ИК-посылки ТСОПом?

Для этого ставим эксперемент.
Берем мегаплату в конфигурации FT232+Mega88+TSOP+ оттянутый на 3 метра ИК-светодиод
пишем следующий код:
-включаем счетчик
-шлем через ИК-светодиод RC5 команду 1
-при получении от ТСОПа команды 1 останавливаем счетчик
-выводим показания счетчика в уарт

Если
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Система локального позиционирования робота-пылесоса

Сообщение hudbrog » 16 сен 2008, 12:57

Могу чуть-чуть рассказать про эту тему на zigbee. Ну или на каком-либо generic rf solution.
Базовая идея простая. Минимум 3 сигнала должно ловиться одновременно, каждая метка должна знать свои координаты, который постоянно слать, например на своей частоте, или со своими адресами, тут уже пофигу. Подвижный модуль эти сигналы ловит, на основе RSSI рассчитывает расстояние до каждой из меток и так рассчитывает свое положение.
Технически, несколько сложностей. Основная - то, что мы работает в закрытых помещениях, где много переотраженок и всякой такой гадости. А еще все наши метки, а, главное, подвижная станция, должны иметь omnidirectional антенны с очень хорошей стабильности усиления сигнала по всей диаграмме направленности.
Вторая - нестабильность RSSI. Даже с одного места он всегда будет ловица по-разному.. с этим есть возможность работать несколькими методами. О них можно потом...

А можно не заморачиваться и купить пачку CC243x, которые имеют на борту location engine и умеют как раз с точностью до 0.25м считать положение )
Вот такая вот фигня )
У меня в голове опилки и длинные слова меня только огорчают.
Аватара пользователя
hudbrog
 
Сообщения: 1585
Зарегистрирован: 14 май 2008, 15:49
Откуда: Москва
ФИО: Алексей

Re: Система локального позиционирования робота-пылесоса

Сообщение EdGull » 16 сен 2008, 13:31

Выложу тут, чтоб потом не искать
Вложения
CC2431 Location Engine.pdf
(289.18 КиБ) Скачиваний: 75
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Система локального позиционирования робота-пылесоса

Сообщение EdGull » 27 сен 2008, 09:33

никак не могу найти, как у него происходит наведение на маяк...
http://botmag.com/articles/scribbler.shtml

Изображение






http://robots.net/article/1729.html
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Система локального позиционирования робота-пылесоса

Сообщение =DeaD= » 27 сен 2008, 10:44

По моему очень тупо они это делают, если по RC-5 выставленному спереди робота видят MUTE, тогда едут прямо, иначе крутятся на месте. Вроде вот и вся программа... если я всё правильно понял... :oops:
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Система локального позиционирования робота-пылесоса

Сообщение EdGull » 27 сен 2008, 10:55

1. так понял там ДВА маяка
2. вот код сижу разбираю... :crazy:

Код: Выделить всёРазвернуть
' Scribbler Robot PHASE 1
' Eric Ostendorff 3/10/2008
' modified Parallax readir routine
' drive robot with IR remote/Sony TV codes
' MUTE button starts track mode, STOP ends track mode

' {$STAMP BS2}
' {$PBASIC 2.5}

' define variables
irPulse        VAR     Word                  ' Stores pulse widths
remoteCode     VAR     Byte                  ' Stores remote code
trackflag      VAR     Bit                   ' 1 for track mode

main:                                        ' start main program
trackflag=0                                  ' 0 = driving mode
LOW 8:LOW 9:LOW 10                           ' LEDs off = driving mode
GOSUB readir                                 ' read IR remote code
IF remoteCode=101 THEN GOSUB stopp           'center button=stop
IF remoteCode=116 THEN GOSUB fwd             'up arrow=forward
IF remoteCode=117 THEN GOSUB bwd             'down arrow=backward
IF remoteCode=52  THEN GOSUB left            'left arrow=left
IF remoteCode=51  THEN GOSUB right           'right arrow=right
IF remoteCode=20  THEN GOSUB track           'MUTE = track routine
GOTO main                                  'loop back, ignore other keys

fwd:PULSOUT 12,3000     'right motor forward calibration 3000=max fwd
PULSOUT 13,3000         'left motor forward calibration
RETURN

bwd:PULSOUT 12,1050    'right motor backward calibration 1000=max reverse
PULSOUT 13,1000        'left motor backward calibration
RETURN

stopp:PULSOUT 12,2000  '2000 = stop right motor
PULSOUT 13,2000        '2000 = stop left motor
RETURN

left:PULSOUT 12,3000   'left motor full forward
PULSOUT 13,2000'       'stop left motor
RETURN

right:PULSOUT 12,2000  'stop right motor
PULSOUT 13,3000        'right motor full forward
RETURN

leftslow:PULSOUT 12,2900   'left motor slow
PULSOUT 13,2000'           'stop left motor
RETURN


track:
trackflag=1                           ' set track mode
HIGH 8:HIGH 9:HIGH 10                 ' turn on 3 LEDs for track mode
GOSUB readir                          ' read ir remote
IF remoteCode=20 THEN GOSUB fwd       ' forward if MUTE received
IF remotecode=0 THEN GOSUB leftslow   ' circle left if MUTE not received
IF remotecode=101 THEN GOTO main      ' exit on STOP command
GOTO track


readir:                              'Parallax read ir remote subroutine
  remoteCode = 0

  RCTIME 6, 1, irPulse
  IF IN7=1 THEN GOSUB stopp:GOTO main   '  if stalled, stop!
  IF irPulse < 1000 THEN endir                 'no start signal, skip ahead
  getdata:PULSIN 6, 0, irPulse                 ' Get data pulses.
  IF irPulse > 500 THEN remoteCode.BIT0 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT1 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT2 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT3 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT4 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT5 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT6 = 1
  IF (remoteCode < 10) THEN remoteCode = remoteCode + 1
  IF (remoteCode = 10) THEN remoteCode = 0
  endir:IF trackflag=1 THEN endread   'tracking, skip ahead
  IF remotecode=0 THEN endread        'zero or no signal, skip ahead
  DEBUG ? remoteCode
  FREQOUT 11,60,730    'beep speaker
  endread:
RETURN


Добавлено спустя 2 минуты 25 секунд:
как они считают irPulse???

Добавлено спустя 5 минут 57 секунд:
вот кстати код фазы 2

Код: Выделить всёРазвернуть
' Scribbler Robot PHASE 2
' Eric Ostendorff 3/10/2008
' modified Parallax readir routine
' drive robot with IR remote/Sony TV codes
' POWER button triggers find charger/leave charger routines


' {$STAMP BS2}
' {$PBASIC 2.5}

' define variables

irPulse        VAR     Word                  ' Stores pulse widths
remoteCode     VAR     Byte                  ' Stores remote code
beacon         VAR     Byte                  ' beacon count ID
counter        VAR     Byte                  ' local loop counter
nosee          VAR     Byte                  ' beacon lost counter


main:
GOSUB readir
IF remoteCode=101 THEN GOSUB stopp
IF remoteCode=116 THEN GOSUB fwd
IF remoteCode=117 THEN GOSUB bwd
IF remoteCode=52  THEN GOSUB left
IF remoteCode=51  THEN GOSUB right
IF remoteCode=21  THEN trackcharger        ' power key
GOTO main                                  'loop back, ignore other keys

trackcharger:HIGH 9'  LED on!
nosee=0'                                   'reset lost beacon counter
GOSUB beep
seek:IF IN7=1 THEN GOTO stall              'if stalled, abort
COUNT 6,15,beacon'  id beacon to drive toward it

IF beacon<17 THEN checkbase'   limit pulse count reading low
IF beacon>20 THEN checkbase'   limit pulse count reading high

PAUSE 125'                     fudge factor, rotate to center beacon
GOSUB fwd:GOTO trackcharger

checkbase:GOSUB basedetect'                           look for base reflection
GOSUB left'                                 no base seen, scan for beacon
nosee=nosee+1'                              increment lost beacon count
IF nosee=255 THEN stall'                    timeout
GOTO seek

basedetect:
FOR B0=1 TO 10'     check 10X if both sensors trigger
FREQOUT 14,1,38500
IF IN6=1 THEN RETURN
FREQOUT 15,1,38500
IF IN6=1 THEN RETURN

NEXT
GOSUB fwdslow
HIGH 8'                      green LED 1 on
HIGH 3'                      IR line follow LEDs on
lookwhite:FOR B0=1 TO 40
IF IN4=1 THEN lookwhite'     go back if line sensor dark
IF IN5=1 THEN lookwhite'     go back if line sensor dark
IF IN7=1 THEN GOTO stall
NEXT
HIGH 9'                      green LED 2 on
lookblack:FOR B0=1 TO 20
IF IN4=0 THEN lookblack'     go back if line sensor white
IF IN5=0 THEN lookblack'     go back if line sensor white
IF IN7=1 THEN GOTO stall
NEXT
GOSUB stopp
HIGH 10'                     green LED 3 on

dock:
PAUSE 300
GOSUB spinright
hold2:IF IN4=0 AND IN5=0 THEN hold2' wait if all white seen
linefollow:'                              follow line to charger
IF IN4=0 AND IN5=0 THEN GOSUB bwdslow
IF IN4=1 AND IN5=0 THEN GOSUB right
IF IN4=0 AND IN5=1 THEN GOSUB left
IF IN4=1 AND IN5=1 THEN GOSUB fwd
IF IN7=0 THEN linefollow'                 if no stall, loop back
GOSUB stopp'                              charging now
LOW 3'                                    ir leds off
LOW 8'                                    3 green LEDs off
LOW 9
LOW 10

FOR counter=1 TO 3'                       beep 3X  CELEBRATE!
GOSUB beep
PAUSE 50
NEXT

charge:GOSUB readir'          wait in charger for POWER command only
IF remoteCode<>21 THEN FREQOUT 11,600,400:GOTO charge' no can do beep
GOSUB bwd'                    maneuver out of charger
PAUSE 600
GOSUB spinright
PAUSE 750
GOSUB fwd
PAUSE 1500
GOSUB stopp
GOTO main

stall:GOSUB stopp
LOW 3:LOW 8:LOW 9:LOW 10'       all LEDs off
GOTO main

fwd:
PULSOUT 12,2950'   right motor was 2800
PULSOUT 13,3000'   left motor
RETURN

fwdslow:
PULSOUT 12,2600'   right motor was 2800
PULSOUT 13,2550'   left motor
RETURN

bwd:PULSOUT 12,1000'   right
PULSOUT 13,1150'   left
RETURN

bwdslow:PULSOUT 12,1400
PULSOUT 13,1400
RETURN

stopp:PULSOUT 12,2000
PULSOUT 13,2000
RETURN

left:PULSOUT 12,3000
PULSOUT 13,2000'    off
RETURN

right:PULSOUT 12,2000' OFF
PULSOUT 13,3000
RETURN

spinleft:
PULSOUT 12,3000
PULSOUT 13,1000
RETURN

spinright:
PULSOUT 12,1500
PULSOUT 13,2500
RETURN


beep:FREQOUT 11,60,730
RETURN


readir:                              'Parallax read ir remote subroutine

  remoteCode = 0

  DO                                    ' Wait for end of resting state
  RCTIME 6, 1, irPulse
  IF IN7=1 THEN stopp                        '  if stalled, stop!
  LOOP UNTIL irPulse > 1000

  PULSIN 6, 0, irPulse                       ' Get data pulses.
  IF irPulse > 500 THEN remoteCode.BIT0 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT1 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT2 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT3 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT4 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT5 = 1
  RCTIME 6, 0, irPulse
  IF irPulse > 300 THEN remoteCode.BIT6 = 1

  IF (remoteCode < 10) THEN remoteCode = remoteCode + 1
  IF (remoteCode = 10) THEN remoteCode = 0
  GOSUB beep

RETURN
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Система локального позиционирования робота-пылесоса

Сообщение Fasti » 27 сен 2008, 15:19

Дык этож байсик для PIC.
Там две функции RCTIME и PULSIN (наверняка стандарт), которые имеют в параметрах irPULSE. Так что надо качать байсик для ПИКа и читать хелп.
Аватара пользователя
Fasti
 
Сообщения: 3
Зарегистрирован: 24 апр 2006, 14:37
Откуда: Тольятти

Re: Система локального позиционирования робота-пылесоса

Сообщение Кирилл » 27 сен 2008, 16:37

а по моему это паралаксовский интерпретатор басика.
Кирилл
 
Сообщения: 432
Зарегистрирован: 20 окт 2005, 16:11
Откуда: Вильнюс,Литва
прог. языки: Basic

Re: Система локального позиционирования робота-пылесоса

Сообщение Duhas » 27 сен 2008, 17:20

Эд, лучше сформулируй задачу в форме задания на проектирование.. описав доступные варианты... мол необходимо ориентироваться в примерно таком-то пространстве имея столько-то маяков... такого то типа и тд ...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Система локального позиционирования робота-пылесоса

Сообщение =DeaD= » 27 сен 2008, 18:01

1. Там один маяк.
2. Алгоритм в точности как я сказал - не вижу - кручусь против часовой, вижу - еду прямо. Это четко видно из 1 видео. Я только не понял как у него принимающий ИК-датчик расположен, что маяк потребовалось подвешать над зоной зарядки...
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Система локального позиционирования робота-пылесоса

Сообщение Vovan » 27 сен 2008, 21:19

1. Там один маяк.
2. Алгоритм в точности как я сказал - не вижу - кручусь против часовой, вижу - еду прямо.
согласен, а дальше - движение по линии.
А то что датчик вверху (ну не так уж и высоко), рояля не играет лишь бы направление определилось. Однако расположение зарядных контактов явно не оптимально. Скорее всего на видео просто тренинг, но практически для для робовеника (ИМХО) не подходит, потому что там где контакты должен быть бампер, а это взаимоисключающие весчи.
Если угодно, предлагаю зарядные контакты располагать сверху и снизу робота. Это даёт возможность въезжать на зарядку под (почти) любым углом и точность позиционирования имееет довольно широкий диапазон.
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: Система локального позиционирования робота-пылесоса

Сообщение Myp » 28 сен 2008, 14:31

вот ИК приёмник в рамочке красной
Вложения
figure8.jpg
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Система локального позиционирования робота-пылесоса

Сообщение =DeaD= » 06 апр 2009, 12:53

Короче у меня грандиозная идея про роботов-пылесосов :)

Надо просто сделать команду из N+1 роботов - N простых работяг, которые гоняют пылесосят, а один - прораб, он стоит, смотрит где простые роботы сейчас находится, куда едут и даёт им команды. Фишка решения состоит в том, что решение замечательно масштабируется - бригадиру можно поручить как 1, так и 10 роботов и он может их перед собой всех вести, а приехав в помещение зрением ослеживать кто где и давать им команды убирать территорию. Кроме того не гоняем платформой с техническим зрением лишний раз и вообще можно эту платформу делать тяжелой и например со станцией подзарядки мелких роботов.

Предлагаю запатентовать немедля :crazy:

И самое главное - есть эконом версия - вместо робота бригадира может быть обычный ПК к которому подключены несколько USB/WiFi-камер стационарных и передатчик команд для мобильных роботов.

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

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

Такое решение достаточно эффективно для больших торговых центров для уборки территории и т.п. Если мобильные роботы потерялись - головной робот может попробовать найти их сам, как и человек. Т.е. все проблемные места могут решаться 1 дорогим роботом, а работа в основном выполняется дешевыми роботами.

PS: К тому же ломаться в основном будут мелкие роботы, а еще их можно сделать разнофункциональными - кто-то пылесосит, кто-то моет и т.п.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Система локального позиционирования робота-пылесоса

Сообщение EdGull » 06 апр 2009, 13:01

суперская идея!!! :Bravo:
я категорически ЗА!!! :friends:
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Система локального позиционирования робота-пылесоса

Сообщение =DeaD= » 06 апр 2009, 13:14

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

Добавлено спустя 5 минут 24 секунды:
Еще можно сделать, чтобы большой робот мог подниматься по ступенькам, тогда он сможет по одному перетаскивать роботов и через лестницы :oops:
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

След.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron