roboforum.ru

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

linvinus

Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.

Re: linvinus

linvinus » 23 апр 2015, 11:46

Пришли модули ESP-07
esp-07.jpg

схема подключения http://mysku.ru/blog/ebay/30626.html (обязательно нужно соединить GPIO15,CH_PD как на схеме, gpio0 сажаем на землю только для заливки новой прошивки)

залил nodemcu поигрался, работает, порадовал размер и дальность (c керамической антенной) (по сравнению с HC-06)
Встал вопрос как быть дальше.

Постановка задачи
1. Требуется надёжный канал для управляющих команд, на данный момент есть простенький шелл (терминал) через который можно манипулировать файлами на карте, запускать/останавливать lua скрипты и т.п.

2. требуется быстрый канал для телеметрии, надёжность не очень важна, но важна скорость.
Например передавать сырые данные с акселерометра/гироскопа/магнетометра с привязкой ко времени
Причём телеметрия по большей части однонаправленная, от робота к рабочей станции.

3.желательно чтобы потоки приходили в разные программы.

Сейчас, для передачи телеметрии приходится жертвовать управляющим каналом связи.

В связи с тем что появилась возможность сделать переходник из uart/spi/i2c в tcp/udp
встал вопрос что и как скрестить.

С одной стороны у esp8266 довольно быстрый uart,а на стороне STM32 FIFO + DMA так что можно передавать и принимать большие объёмы данных, но для 3го пункта нужно как то уметь разделять данные uart для передачи по разным каналам (tcp|udp)либо всё гнать до рабочей станции одним потоком, и уже там разделять, но это не очень удобно.

Кроме того всё равно есть риск переполнения буфера (и как следствие потеря данных), особенно если телеметрия будет вперемешку с управляющими командами.

О том что такое переполнение, и как с ним борются в последовательных соединениях
509820091121333.pdf
(42.83 КиБ) Скачиваний: 0

и о проблеме переполнения буфера говорит разработчик переходника uart<->tcp http://esp8266.ru/forum/threads/proshiv ... o-web.146/
Если коротко, то для надёжного канала нужны сигналы RTS/CTS, есть ещё программная эмуляция XON/XOFF но с ней есть проблемы.
Эта проблема актуальна для любых модулей где используется только две ножки RX,TX (HC-06 в том числе).

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

Ещё есть spi и i2c
первый интересен тем что поддерживает высокие скорости до 10Мбит и поддержку DMA (на стороне stm32), второй имеет встроенный механизм адресации (но есть заморочки с DMA
CD00209826.pdf
AN2824 I2C slave programming examples (DMA, interrupt)
(121.62 КиБ) Скачиваний: 0
).

В общем практически полный аналог вопроса "соединение 2х ардуин" =)

update:
пара слов про ESP.
по своей сути это тоже самое что arduino (есть даже http://esp8266.ru/arduino-ide-esp8266/), только с драйверами для wifi.

Можно использовать как обычный самостоятельный контроллер например вот экран подключили http://esp8266.ru/forum/threads/esp8266 ... .84/page-3

Можно в качестве мини web сервера использовать http://esp8266.ru/forum/threads/razrabo ... sp8266.56/

Но в основном позиционируется как модуль для IoT (https://ru.wikipedia.org/wiki/%D0%98%D0 ... 0%B5%D0%B9)
А в качестве основного протокола для IoT позиционируется MQTT http://esp8266.ru/esp8266-nodemcu-low-cost-switch/

С одной стороны прочитав об MQTT можно решить что это практически то что нужно (для роботов), но, если разобраться то этот протокол перегружен заголовками, в каждом пакете названия топиков в текстовой форме, это не важно если посылать пакеты раз в секунду, но если раз в миллисекунду, при том что данные могут быть меньше чем заголовки, то как то сложно получается.
MQTT работает только с TCP.

есть протокол MQTT-NS
http://stackoverflow.com/questions/2756 ... -from-mqtt
https://stackoverflow.com/questions/285 ... 4#28730254
Тут всё упрощено, в плоть до статических ID топиков (бинарные и не нужно предварительно регистрироваться на брокере)
Протокол любой, в том числе и UDP

Но MQTT-NS протокол пока не поддерживается в nodemcu, и многим другим по, т.е. в основном используется такая связка
MQTT-NS клиет ->MQTT-NS proxy->MQTT брокер (mosquitto)

Что касается энергопотребления то оно относительно невелико
post326517.html#p326517

На данный момент, самой стабильной качественной и универсальной прошивкой можно назвать nodemcu
Но они сильно урезали elua так что шелла там нет, т.е. чтобы что то выполнить нужно загрузить туда скрипт init.lua
который будет делать всё остальное.
И вторая особенность, nodemcu событийно-ориентированный, например нельзя узнать есть ли данные в uart (uart.getchar(0,uart.NO_TIMEOUT),
Но можно подписаться на событие "данные в uart", причём можно заранее определить какой именно байт нас интересует , или сколько их должно быть.

Но в случае если будет ошибка в init.lua То не будет возможности загрузить исправленный файл (т.е. нужно заново заливать всю прошивку), в качестве обходного решения предлагается использовать задержку в несколько секунд чтобы иметь возможность прервать исполнение .
Я для этого использую такой скрипт

Код: Выделить всёРазвернуть
uart.setup(0,115200,8,0,1)

wifi.setmode(wifi.STATION)
wifi.sta.config("mywifi_ssid","mypassword")
realtype = wifi.sleeptype(wifi.NON_ESLEEP)

run_files={ "telnet2" }
------------------------------------------------------------------------

print("Starting...")
print("type '#', to interrupt starting")

uart.on("data",'#',
  function(data)
    tmr.stop(0)
    uart.on("data",'#',nil) --remove uart callback
    print("start was interrupted by user...")
    for key,name in pairs(file.list()) do print(key,name) end
    run_file("os")
  end, 1) --1: input from uart will go into lua interpreter, and run.



function run_file(name)
    if file.open(name..".lc") then
        file.close()
        s,err = pcall(function() dofile(name..".lc") end)
    else
        s,err = pcall(function() dofile(name..".lua") end)
    end
      if not s then print(err) end
end

function autorun()
    print('IP address: ',wifi.sta.getip())
    uart.on("data",'#',nil)
    --~ dofile('main.lua')
    local s,err
    for key,name in pairs(run_files) do
      run_file(name)
    end
end --run_file

function init_restart()
  if wifi.sta.status() ~= 5 then
    node.restart() --перегружаем модуль если не подключились за 3сек.
  else
    autorun()
  end
end

function init_main()
  if wifi.sta.status() ~= 5 then
    tmr.alarm(0, 3000, 0, init_restart )   -- Zero as third parameter. Call once
  else
    autorun()
  end
end

init_main()

Скрипт устанавливает скорость последовательного порта в 115200 бод, подключается к wifi Точке и только после этого запускает файл telnet2.

чтобы запустить что то ещё нужно поправить строчку run_files={ "telnet2", "another_script" }
в случае если произойдёт ошибка в telnet2 то либо модуль перезагрузится по watchdog либо будет ошибка в консоли.
Если модуль будет перегружаться то можно прервать загрузку символом '#' + enter


Пример http сервера целиком на lua https://github.com/marcoskirsch/nodemcu-httpserver

Re: linvinus

linvinus » 23 апр 2015, 20:01

Вот нашёл что искал, протокол COBS
Инкапсуляция пакетов в последовательный порт http://www.stuartcheshire.org/papers/COBSforSIGCOMM/
Для ардуино =) https://github.com/bakercp/PacketSerial

Реализация mqtt-ns на си https://github.com/njh/mqtt-sn-tools/

Ещё по теме, для ардуино есть готовый протокол firmata
https://github.com/firmata/protocol/blo ... rotocol.md

Основан на midi, в основном все что сложнее 3х байт упаковывается в Sysex-based commands
Сообщение Sysex произвольной длины но внутри данные 7битные а не 8, т.е. чтобы передать 1 байт данных нужно два байта,
а потом ещё и собрать их. Для 8битных контроллеров наверное приемлемно, для 32х совсем не оптимально.
Протокол компактный, но довольно сложно добавлять новый функционал, на всё провсё есть 127 кастомных команд.

подумал а почему бы сразу не послать сообщение ROS
есть rosserial, но есть три минуса
1) c++
2) нужно использовать нестандартные ROS сообщения, а специальные под свои нужны,и на стороне рос делать конвертер одних сообщений в другие, стандартные сообщения "универсальны" - имеют много "лишних" полей которые будут передаваться от контроллера к рос.
3)тоже довольно громоздко.

есть ещё такой протокол
http://qgroundcontrol.org/dev/mavlink_o ... n_tutorial

Про arduino слышал,
про processing слышал,
про openframeworks не слышал - http://openframeworks.cc/tutorials/intr ... ction.html


Залил прошивку
http://esp8266.ru/forum/threads/razrabo ... sp8266.56/

Мои исследования http://esp8266.ru/forum/threads/razrabo ... #post-5454

Для того чтобы по telnet получить тот же функционал что и minicom
нужно перевести telnet в режим mode character
чтобы это было постоянным можно создать файл

Код: Выделить всёРазвернуть
~/.telnetrc
192.168.1.251
mode character


Вставка большого текста не работает.
Всё работает, главное увеличить буфер, поставил
Код: Выделить всёРазвернуть
#define SERIAL_BUFFERS_SIZE         1024

было 16байт :)

Тесты:
notebook -> wifi 5Ghz -> router -> wifi 2.4Ghz -> esp-07
Пинг большими пакетами
Код: Выделить всёРазвернуть
#ping -i 0.01 -s 1472 192.168.1.251
1480 bytes from 192.168.1.251: icmp_seq=1272 ttl=255 time=2.64 ms
1480 bytes from 192.168.1.251: icmp_seq=1273 ttl=255 time=4.19 ms
1480 bytes from 192.168.1.251: icmp_seq=1274 ttl=255 time=4.57 ms
1480 bytes from 192.168.1.251: icmp_seq=1275 ttl=255 time=3.08 ms
1480 bytes from 192.168.1.251: icmp_seq=1276 ttl=255 time=4.43 ms
1480 bytes from 192.168.1.251: icmp_seq=1277 ttl=255 time=2.66 ms
1480 bytes from 192.168.1.251: icmp_seq=1278 ttl=255 time=2.58 ms
^C
--- 192.168.1.251 ping statistics ---
1278 packets transmitted, 1278 received, 0% packet loss, time 12867ms
rtt min/avg/max/mdev = 2.027/3.600/23.339/1.995 ms, pipe 2


пинг с роутера
Код: Выделить всёРазвернуть
1480 bytes from 192.168.1.251: icmp_req=179 ttl=255 time=1.40 ms
1480 bytes from 192.168.1.251: icmp_req=180 ttl=255 time=1.35 ms
1480 bytes from 192.168.1.251: icmp_req=181 ttl=255 time=1.40 ms
1480 bytes from 192.168.1.251: icmp_req=182 ttl=255 time=1.48 ms
1480 bytes from 192.168.1.251: icmp_req=183 ttl=255 time=1.44 ms
1480 bytes from 192.168.1.251: icmp_req=184 ttl=255 time=1.40 ms
1480 bytes from 192.168.1.251: icmp_req=185 ttl=255 time=1.38 ms
^C1480 bytes from 192.168.1.251: icmp_req=186 ttl=255 time=5.02 ms

--- 192.168.1.251 ping statistics ---
186 packets transmitted, 186 received, 0% packet loss, time 1868ms
rtt min/avg/max/mdev = 1.245/2.327/17.979/2.053 ms, pipe 2
Последний раз редактировалось linvinus 12 авг 2016, 23:48, всего редактировалось 1 раз.

Re: linvinus

linvinus » 27 апр 2015, 22:22

Забавный ролик

http://www.youtube.com/watch?v=D_1TmVVlT4U


http://www.youtube.com/watch?v=w-1GWoCI3GU

Добавлено спустя 34 минуты 12 секунд:
Игрушка для кошки с ebay

http://www.youtube.com/watch?v=5uGqF0cNm8M
Есть идеи как заапгрейдить?

Re: linvinus

holomrn » 27 апр 2015, 23:21

linvinus писал(а):Игрушка для кошки с ebay

http://www.youtube.com/watch?v=5uGqF0cNm8M
Есть идеи как заапгрейдить?

0. объяснить кошке что вообще-то это для нее игрушка и она должна охотиться на это. :D

Re: linvinus

linvinus » 28 апр 2015, 00:12

У нас две модели кошек,
одна безумная белка с IQ 1
второй ленивый кот с IQ 200
кот понял что это игрушка за 3 минуты и поигрался ещё 10 мин, потом понял что она никуда не убежит можно просто лечь рядом и добыча сама в лапы прибежит, стало скучно и больше с ней не играет.

Апгрейд лазером,

http://www.youtube.com/watch?v=4l67Lbdt-8o
не помогло.

Интересные лекции, pdf+video
http://vision.in.tum.de/teaching/ss2013/visnav2013

Re: linvinus

holomrn » 28 апр 2015, 02:16

Зря лазер так низко. А вдруг в глаз прилетит? Коту, понятно.
Мой вообще не поддается на попытки автоматизировать выигрывание и скачет только когда я в руках держу и дергаю.

Re: linvinus

linvinus » 28 апр 2015, 19:47

Видно же что по полу бегает зайчик.

Вот ещё интересный проект, что то вроде pixy но круче железо.
https://www.kickstarter.com/projects/bo ... ine-vision

деньги уже собрали, обкатывают производство, сборка в сша...
хотя на hackaday.io заявлено что себестоимость материалов $15
Самое главное проц STM32F4 =)

Нашёл ещё один интересный проект на базе платформы zumo http://biorobots.case.edu/rambler/ramblerrobot/

Re: linvinus

dccharacter » 29 апр 2015, 11:41

Кошку недо прогрейдить. Выкинуть старую и взять нового котенка. Все будет бегать.

Re: linvinus

linvinus » 29 апр 2015, 14:22

да я тоже пришёл к выводу что на коробке должны писать для кошек от 1мес до 1,5 лет.

Re: linvinus

linvinus » 07 май 2015, 22:38

Хорошие новости, кот, когда иручий, играет с игрушкой.

Добавлено спустя 7 минут 37 секунд:
Так бывает что то нет гироскопов то сразу три :)
Пришёл MPU-9150 и подарили CruizCore XG1001
XG1001 выдаёт только по uart и только YAW/heading, достаточно стабильно.

MPU-9150 Это комбайн, благодяря встроенному DSP можно загрузить прошивку и получить законченное устройство,
он сам говорит когда данные готовы выдаёт прерывание на ножку, после чего можно читать данные, на выходе готовый кватернион.
ПРошивка https://github.com/jrowberg/i2cdevlib/t ... no/MPU9150
Для chibios прослойка i2cdevlib доступна тут https://github.com/jevermeister/MPU6050-ChibiOS
C MPU9150 пока есть одна неприятность иногда перестаёт отвечать по i2c , пока не перезапустишь не отвечает.

Re: linvinus

linvinus » 08 май 2015, 16:24

Мде, везде всё как всегда.
MPU-9150 9 осевой датчик, но DMP (firmware) работает только с гироскопом и акселерометром ака MPU-6050. (хотя вроде как в 2012 обещали прошивку которая будет поддерживать и компас)
вот тут народ сам смешивает кватернион от DMP с данными от компаса.
https://github.com/vmayoral/bb_mpu9150
но что то мне подсказывает что получится таже фигня, будет реагировать на внешние магнитные поля :(
поскольку просто тупо подмешивают откалиброванные показания компаса к показаниям DMP c определённым коэффициентом.

DMP сам калибрует гироскоп, но вроде как можно и вручную указывать значения offset.
в общем он потихоньку уплывает, думаю порядка 10градусов в час по yaw.

Вот хороший обзор характеристик https://github.com/kriswiner/MPU-6050/w ... sor-Fusion
и примеры https://github.com/kriswiner

Re: linvinus

Dmitry__ » 08 май 2015, 16:50

linvinus писал(а):в общем он потихоньку уплывает, думаю порядка 10градусов в час по yaw

Да ладна? :shock: Это мега-пупер-супер гироскоп тогда. Таки я думаю 10 град. в минуту или того хуже...

Re: linvinus

linvinus » 08 май 2015, 16:54

Dmitry__ это после коррекции, сырые данные уплывают быстрее.

Re: linvinus

Dmitry__ » 08 май 2015, 17:15

Гироскоп нельзя откалибровать лучше его абсолютной ошибки, а абсолютная ошибка мемс гироскопов в сотни раз хуже 10 град.в час. :wink:
10 град./час это что-то из области лазерных или механич. гироскопов, или аналогдевайсовских мемс, но которые по цене 1000$ за штуку, а удел какашек по цене 10$ - 10град./мин.

Re: linvinus

linvinus » 08 май 2015, 17:49

видимо мы о разных ошибках говорим, я про ошибку на выходе всего модуля, после всех компенсаций.

я смотрю на показания датчика сейчас и черз 10 мин, по курсу они уплыли на 2 градуса, в спокойном положении, наклоны стабильные всё время.

Ниже идут банальные вещи просто чтобы понимать что мы об одном и том же говорим.
гироскоп выдаёт скорость изменения положения, а не абсолютное положение, как, например, компас, в идеале, в спокойном положении гироскоп должен давать 0, но в реальности есть смещение.
Поскольку для того чтобы определить положение по гироскопу нужно интегрировать его показания, если он будет выдавать 0.01 каждую сек. вместо 0 ,то интегратор начнёт накапливать ошибку.
Кроме того есть ещё тенденция что со временем ошибка возрастает, 0.01, 0.02, 0.03, и т.д. таким образом происходит ускорение нарастания ошибки, почему это происходит отдельная тема.

В общем, если не компенсировать смещение bias у гироскопа, будет врать безбожно.
Но у нас есть аксель, который в спокойном положении нам даёт точные значения по наклонам X,Y но не по курсу (yaw),
курс компенсировать может только компас. но в разговоре про MPU-9150 речь не идёт о такой компенсации.
в общем показания по yaw компенсировать нечем, остаётся только уменьшать ошибку.
как мы знаем показания гироскопа должны быть 0 если гиросоп находится в спокойном положении, о том движемся мы или нет нам может подсказать акселерометр, вылавливаем моменты когда всё спокойно, т.е. когда показания гироскопа должны быть 0, в такие моменты показания гироскопа это и есть ошибка, запоминаем и вычитаем, всё теперь у нас 0, но поскольку и этот процес не идеален, то в какие то моменты ошибка всё же просачивается и курс уплывает.
радикально помогает только компас.


cron
Rambler\'s Top100 Mail.ru counter