-
Content Count
829 -
Joined
-
Last visited
-
Days Won
7
Everything posted by kharlashkin
-
Прям как я несколько лет назад ;)
-
Долго возился с привязкой получаемого кватерниона с "костью" головы в Blender - как-то все запутанно там. Кость имеет свои координаты, получаемые командой: bpy.data.armatures['Armature'].bones['head'].matrix.to_quaternion() # Blender Render Но новые координаты задаются не от глобального кватерниона, а от нулевого видом (1.0, 0.0 , 0.0, 0.0). Ничего лучше не придумал (пока), при обновлении положения кости, сначала кватернион, обратный реальной позиции умножить на нужный поворот, затем умножить на реальный, к тому же направление осей датчика должно совпадать с направлением осей кости. В принципе, эту математику можно "зашить" напрямую в ардуинку (ресурсов то предостаточно пока), но тогда получиться прямая привязка расположения датчиков и существующего скелета, или переложить расчеты на Blender. Но можно столкнуться с нехваткой ресурсов при записи положений от множества датчиков. В общем, идет работа помаленьку.
-
Когда то давно на форуме обсуждался этот бот, и встал вопрос откуда у бота положительный рейтинг и кто ему его накручивает. ИМХО, я не хочу чтобы роботы захватили планету и возложил на себя миссию по уменьшению важности бота на форуме ;)
-
Да, сейчас пойду @C.M. дальше вгонять в "глубокий минус".
-
Блин, я тут подумал - значит @C.M.вернут репутацию в 0? Значит я зря минусил его в течении очень долгого времени.
-
В таких делах лучше не спешить - делайте основательно. Мне очень понравился движок форума на тесте, ну и "с почином"!
-
Приятная неожиданность, а плюсик поставить низзя @Mr 13 - так и задумано?
-
Пока ничего лучше не смог придумать, кроме как корректировать получаемый кватернион в момент прохождения датчика горизонта...
-
Так получилось, что в скетче я перепутал переменные - таким образом мой кватернион коррекции по компасу с помощью низкочастотного фильтра просто тупо стремился к нулевому вида (1, 0, 0, 0) и умножая полученный из DMP датчика на него у меня и получался вот тот супер стабильный ;) Смутило что когда я коробок двигал - кубик вращался, но это только за счет того что фильтр не отрабатывает моментально. В общем не спал пол ночи, результатом является вот это: Особенно интересным выглядит вращение беспорядочное в конце - это я за шнурок кручу-верчу коробку с датчиком и возвращая коробок в первоначальное положение - получаю практически те же значения, что и в положении покоя. Так же видно, что есть некоторая задержка корректировки - пока не придумал что с ней делать, ну и немного трясет кубик по оси Z.
-
Можно сказать на финишной прямой ;) Учитывая, что датчик в коробке находиться на столе рядом с клавой, мышей, usb-хабом и 2-мя мониторами (менее 20 см) и под столом ПК (менее 30 см) в помещении результаты думаю неплохие. И самое главное, если взять коробок и неистово начать его вертеть, а затем положить его на место - данные о положении меняются очень незначительно (в пределах пары градусов). Пока нужно ставить эксперименты и проверять - всё ли так как мне кажется сейчас ;) Прошу прощения огромная фатальная ошибка.
-
Sublime Text - редактор конфигураций
kharlashkin replied to kr0ne's topic in XVM Configuration Questions
Поздравляю с выходом Sublime Text 3.0, только вот сегодня заново его попробовал как альтернативу Arduino IDE - нравится всё. -
Вопрос скорее всего в том, что игр с прямым управлением персонажа даже для VR нет и вряд ли в ближайшее время появятся. Разве что в какие-то игры для Kinect попробовать подключить. Тут выявилось несколько других проблем. После подключение магнитометра непосредственно в вычисления DMP - точность кватерниона повысилась, но дрифт по оси Z никуда не делся. После активных вращений и возвращение датчика в первоначальное положение, кватернионы уже не будут как первоначальные. Хотя примерно после 10 секунд после активации, данные стабилизируются и в неподвижном положении очень точны. Этот же датчик с таким же кодом но без подключенного в DMP магнитометра имеет постоянный дрифт. Конфигурация DMP сразу имеет в своем арсенале матрицу корректировки данных от магнитометра, никак не могу пока понять каким образом этот "некий функционал" работает - документации маловато. 0x02, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, // CPASS_MTX_00 inv_set_compass_calibration 0x02, 0x44, 0x04, 0x40, 0x00, 0x00, 0x00, // CPASS_MTX_01 0x02, 0x48, 0x04, 0x00, 0x00, 0x00, 0x00, // CPASS_MTX_02 0x02, 0x4C, 0x04, 0x40, 0x00, 0x00, 0x00, // CPASS_MTX_10 0x02, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, // CPASS_MTX_11 0x02, 0x54, 0x04, 0x00, 0x00, 0x00, 0x00, // CPASS_MTX_12 0x02, 0x58, 0x04, 0x00, 0x00, 0x00, 0x00, // CPASS_MTX_20 0x02, 0x5C, 0x04, 0x00, 0x00, 0x00, 0x00, // CPASS_MTX_21 0x02, 0xBC, 0x04, 0xC0, 0x00, 0x00, 0x00, // CPASS_MTX_22 Моя реализация корректировки по компасу пока не до конца продуманна - я пробую получать из кватерниона вычисленного в DMP вектор гравитации, затем получаю вектор нормали к плоскости образованной векторами компаса и гравитации, потом вычисляю из того- же кватерниона вектор, который должен быть коллинеарным вектору нормали, вычисляю угол между ними и доворачиваю объект.
-
Гы. Создал в MakeHuman персонажа со скелетом, набросал скриптик для забора данных из Arduino и отправки кватернионов для положения кости головы персонажа. Весело получилось - крутить на usb-шнуре коробок с датчиком и ардуинкой и смотреть как голова сходит с ума.
-
Думаю что настоящему программисту, а не поделке в моем лице, работы было бы на пару дней. Мне больше для души нравится копошиться в этом всём, математику пришлось подтянуть для понимания общего процесса. Ну уже с Вами обсуждалось какую диковинку :) Сейчас у меня лежит 3 датчика 9250, 3 платки Arduino Pro Mini + едет батарейка с платкой именно для продолжение проекта. Думаю попробовать сделать подобие отслеживания руки (плечо, предплечье и кисть). Ломал на дня голову с корпусами - решил использовать обычные двойные телефонные розетки, сразу вопрос с соединениями отпадёт - все таки разъемные с нормальным проводом это плюс ;) Тестировал дома код для MPU-9250 чет не такой стабильный оказался на столе, но выявилась проблема с домашней экспериментальной Uno - рандомно ложится передача данных. Пробовал на ноуте/ПК под разными ОС - идет передача данных 2-5-10-20 сек и потом всё замирает. Хотя после повторной инициализации соединения - все работает нормально. На работе где экспериментирую с Nano - все более-менее стабильно.
-
Спасибо Вам, Павел, за поддержку. Очень часто, именно вот таких простых слов от окружающих в отношении того, что ты делаешь - не хватает ;)
-
После отпуска по доставал свои игрушки, взялся с новыми силами за положения в пространстве датчика MPU-9250. Получилось заставить DMP обрабатывать данные от магнитометра, дополнительно включил математику в обработку кватерниона от DMP по этой статье. В принципе получилось очень даже ничего, особенно учитывая что данные от магнитометра без калибровки. Есть лишь небольшое подергивание кубика в блендер, но зато практически полностью пропал дрифт. Видео чуть позже добавлю. Залил проект на github. Имхо, будет неплохо наложить фильтр Калмана на данные от магнетометра, повысить точность позиционирования например на 4 знака после запятой (сейчас, как видно 2). test.7z
-
Альтернативные прошивки маршрутизаторов.
kharlashkin replied to kharlashkin's topic in Computers, devices and hardware
Должен сообщить, что OpenWrt лучше родной прошивки. Приведу пример. Выше отписывал, что гроза потянула за собой стационарный ПК, который у меня как HTPC работает. Выгорел сетевой порт, и отвалились часть usb-портов. Во временное пользование был выпрошен у знакомого Wi-Fi usb-свисток. Так вот с родной прошивкой от Xiaomi наблюдалось периодическое отваливание беспроводной сети, помогало только физическое передергивание модуля. Изначально грешил именно на беспроводной модуль - так как мне сразу говорили что он очень глючный и пришлось повозиться с драйверами (в комплекте не было, в интернете тоже не сразу нашлись). После перепрошивки маршрутизатора, отваливаний не наблюдаю пока от слова "вообще". -
Альтернативные прошивки маршрутизаторов.
kharlashkin replied to kharlashkin's topic in Computers, devices and hardware
Ну хоть один человек (кроме меня) одобрил мой выбор - плюсик поставил. Заказал я себе Xiaomi MiWiFi Mini, при чем оаказалось что дешевле и быстрее заказать себе этот маршрутизатор по месту, в Украине. На AliExpress цена около 718 грн с бесплатной доставкой, в интернет-магазине ROZETKA я покупал во вторник за 609 грн +35 грн доставка (сейчас ещё подешевел до 599 грн.). Вчера днем его забрал, вечером настроил на китайской стоковой прошивке и больше суток все нормально работало до сегодняшнего вечера. Сегодня же руки зачесались, и решил попробовать установить на него ту прошивку для которого эта железка и покупалась - OpenWrt. Всё встало/заработало без проблем и считаю своим долгом поделиться опытом. Первым делом сходил на страничку с описанием маршрутизатора на OpenWrt и увидел способ прошивки без плясок с бубном, регистрации и смс. Вчера я обновлял прошивку на последнюю от производителя, и при попытке получить telnet доступ я не получил правильное сообщение об ошибки из описания: {"msg":"未能連線到指定Wi-Fi(Probe timeout)","code":1616} Был ответ на китайском с кодом 1617 ;) Первым делом я откатился в ручном режиме на стоковую прошивку с версией 2.1.6, хотя маршрутизатор после перезагрузки ругался что последняя версия доступная 2.15.78: Далее в соседней вкладке вводим в адресную строку: http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/xqnetwork/set_wifi_ap? ssid=whatever&encryption=NONE&enctype=NONE&channel=1%3B%2Fusr%2Fsbin%2Ftelnetd Где <STOK> это цифробуквенный код с обычного web-интерфеса, мой видно на скриншоте. Получаю правильную ошибку, и ввожу следующий запрос: http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/xqsystem/set_name_password?oldPwd=<CURRENTPASS>&newPwd=<NEWPASS> Где <CURRENTPASS> это установленный на этапе настройки пароль доступа к вебморде (кстати в родной прошивке он ключ к Wi-Fi) и <NEWPASS>, соответственно новый пароль. Открываем консольку и телнетом перешиваем, последовательно вводя несколько команд - загрузка прошивки OpenWrt, проверка расположения MTD и собственно прошивка. Ниже привожу просто копипаст из терминала. kharlashkin@asus-K56CB:~$ telnet 192.168.31.1 Trying 192.168.31.1... Connected to 192.168.31.1. Escape character is '^]'. XiaoQiang login: root Password: BusyBox v1.19.4 (2015-03-20 10:08:59 CST) built-in shell (ash) Enter 'help' for a list of built-in commands. ----------------------------------------------------- Welcome to XiaoQiang! ----------------------------------------------------- root@XiaoQiang:~# cd /tmp; wget http://downloads.openwrt.org/chaos_calmer/15.05.1/ramips/mt7620/openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin --2017-07-16 03:36:31-- http://downloads.openwrt.org/chaos_calmer/15.05.1/ramips/mt7620/openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin Resolving downloads.openwrt.org... 78.24.191.177 Connecting to downloads.openwrt.org|78.24.191.177|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 3670020 (3.5M) [application/octet-stream] Saving to: 'openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin' 100%[======================================>] 3,670,020 2.61M/s in 1.3s 2017-07-16 03:36:33 (2.61 MB/s) - 'openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin' saved [3670020/3670020] root@XiaoQiang:/tmp# cat /proc/mtd dev: size erasesize name mtd0: 01000000 00010000 "ALL" mtd1: 00030000 00010000 "Bootloader" mtd2: 00010000 00010000 "Config" mtd3: 00010000 00010000 "Factory" mtd4: 00c80000 00010000 "OS1" mtd5: 00b21c3e 00010000 "rootfs" mtd6: 00200000 00010000 "OS2" mtd7: 00100000 00010000 "overlay" mtd8: 00010000 00010000 "crash" mtd9: 00010000 00010000 "reserved" mtd10: 00010000 00010000 "Bdata" root@XiaoQiang:/tmp# mtd -r write openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mi ni-squashfs-sysupgrade.bin OS1 Unlocking OS1 ... Writing from openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin to OS1 ... Rebooting ... После перезагрузки увидя активное сетевое подключения и посмотрев адрес полученный от dhcp - 192.168.1.115 я возликовал, а зайдя в веб-интерфейс и увидев OpenWrt - вдвойне ;) -
Альтернативные прошивки маршрутизаторов.
kharlashkin replied to kharlashkin's topic in Computers, devices and hardware
Прошла гроза, сгорел мой добрый Asus RT-N16. Вот взял во временное пользование у знакомого железку попользоваться, теперь есть некоторое время ломать голову покупкой нового маршрутизатора. Денег много как то вообще не готов отдавать, потому как гроза за собой потянула и стационарный комп (пока масштаб бедствий не известен). Что нужно - usb, пара внутренних портов и наверное AC. Разумеется чтобы работало это все под OpenWRT. Вот смотрю в сторону Xiaomi Mini, кто что думает? -
Альтернативные прошивки маршрутизаторов.
kharlashkin replied to kharlashkin's topic in Computers, devices and hardware
Как-то позабылась тема. В основном из-за того, что много пересекающихся связей между маршрутизатором и ардуинкой ;) Как-то статья мимо меня прошла - "Умный обход блокировок в Украине". Ну и ссылка на репозиторий. -
Приехала новая "тинька". Как не странно, всё завелось "с пол пинка". 'Код Digispark' 'Код Arduino' Есть багофича - значения менее 17 тинька отрабатывает но вентилятор не крутится. Думаю переделать на более вменяемые значения мощности :) P.S. Думаю что первоначальная платка имела брак - потому как новая завелась под Ubuntu на рабочем ноуте без "бубна";)
-
Сегодня получилось уделить немного времени подключению ардуинки по Bluetooth. Платка где-то месяц уже у меня не все никак руки не доходили. Итак, платка вот такая HC-06 (фото не мое): Перво-наперво нужно настроить модуль для работы, думаю понятно что скорость 9600 б/с будет маловата. Инструкций в интернетах несколько, попробовав некоторые - привожу что и как получилось у меня. В качестве транслятора команд для настройки модуля я использовал саму ардуинку. Собственно код, который позволяет обмен данными между ПК и модулем: #include <SoftwareSerial.h> #include <Time.h> int gLedPin = 13; int gRxPin = 10; // Pin-ы подключения модуля int gTxPin = 11; SoftwareSerial BTSerial(gRxPin, gTxPin); void setup() { // Настраиваем скорости обмена от ПК в ардуину и в модуль BTSerial.begin(9600); Serial.begin(38400); delay(500); } void loop() { if (BTSerial.available()) { Serial.write(BTSerial.read()); } if (Serial.available()) { BTSerial.write(Serial.read()); } } Для работы с модулем корректно завелась программка терминала HMComAssistant (архив приложил). Остальные могли только одну команду "AT", т.е. не поменять ни скорость, ни пин-код, ни посмотреть версию прошивки не смогли. Так же прилагаю документ с AT-командами. P.S. Собственно я уже попробовал крутить кубик в Blender через беспроводной интерфейс ;) Жду в течении 7/10 дней портативный аккумулятор и буду делать более корректное видео кручения автономного кубика (привет Portal/Portal2) + причесывать код. HMComAssistant.7z AT_HC05.pdf
-
Чет, не могу считать данные магнитометра. Код для получения кватерниона с помощью DMP брал отсюда (улыбнуло размещение сайта - kr). Относительно управления платформой кватернионами, нашел интересную статью - "Применение кватернионов в задачах наведения антенной системы ретранслятора связи на беспилотном летательном аппарате". Решается задача подобная моей для антенны с 3-мя степенями свободы, а чтобы получить 6 степеней нужно наверное будет использовать бикватернионы. Кому интересно статья во вложении. primenenie-kvaternionov-v-zadachah-navedeniya-antennoy-sistemy-retranslyatora-svyazi-na-bespilotnom-letatelnom-apparate.pdf
-
Прочел книгу про кватернионы и трехмерную геометрию, начал заново копать ориентацию в пространстве с помощью MPU-9250. Набаловавшись до "не могу" со всякими фильтрами Маджвика, Махони и Калмана и так и не получив внятную картинку в Blender - пошел по пути наименьшего сопротивления. А если быть точным решил попробовать DMP (digital motion process), который по-умолчанию есть в датчике. Результат на видео. Если я правильно понимаю, то для более точного позиционирования (а кубик гуляет по оси Z где то секунд 10, в самом начале), нужно дополнительно забирать данные магнитометра и корректировать полученный из DMP кватернион.