Написал на эту тему предложение разработчикам Телеграм:
I propose to use Telegram services to control telepresence robots. Develop a SDK for integrating streaming video, telemetry and control commands into user applications.
Добавлено спустя 52 минуты 14 секунд:В редкие свободные моменты продолжаю заниматься шваброидом.
Оттачиваю езду по карте с определением точного положения робота по сканам с лидара. Топикастер обозначил основные принципы, и я делаю примерно также. Считается, что текущее положение и направление робота всегда примерно известны. Пройденный путь считается по энкодеру, а направление по магнитометру. Понятно, что ни тот ни другой не идеальны, и в конце каждого отрезка я пытаюсь уточнить абсолютные положение и направление робота с точностью до 1см и 1°. Мой лидар делает замеры через каждые 0.5…08°. Получается около 400 замеров, причем процентов 10 из них плохого качества. Каждый из замеров я сравниваю с идеальным виртуальным сканом, рассчитаным геометрически для этой же точки, отрезая расстояния, превышающие 4 метра, и считая разницу до 3х см совпадением. Т.о. получаю весовой коэффициент для определенной точки позиционирования с координатами в мм. Затем считаю еще 8 окружающих точек , со сдвигом на 10мм. Если, в какой-то точке результаты лучше, чем в центральной, то делаем ее центральной и продолжаем обсчитывать окружающие точки, пока центральная точка не окажется с лучшим результатом. Ее будем считать реальными координатами и от них строить дальнейшую траекторию передвижения робота.
Но, даже, если поставить робота в точные координаты по линейке и сравнить реальный и виртуальный сканы, то видно, что совпадают они далеко не всегда:
Красные точки – это реальный скан, а синие сгенерированный круговой скан для этих координат и этого курса. Scan1 – все замечательно. 86% совпадений. Что объясняется не большими расстояниями и практическим отсутствием подвижной мебели, не вошедшей в виртуальную карту.
Scan2 уже все значительно хуже – меньше 50%. Напомню, что совпадения проверяются только в местах где есть красные точки, в радиусе 4м.
Если же посмотреть на Scan3, реальный скан робота, стоящего посреди комнаты, то видно, что у него не так много опорных точек. Много зависит от положения мебели и открытых-закрытых дверей.
В общем и целом, анализ совпадений скана с расчетным занимает приличные ресурсы.
Интересная статистика времени сравнения скана с эталоном в 9ти точках, при повороте угла -10°…+10° от предполагаемого, с шагом 0.5°:
1.Последовательный перебор всех точек в цикле в одном потоке
- Код: Выделить всё • Развернуть
foreach (Point locpoint in locpoints)….. // Execution time: 1195 ms
2.Расчет каждой точки в отдельной задаче, с последующим сравнением результатов
- Код: Выделить всё • Развернуть
taskList.Add(Task.Run(() =>……await Task.WhenAll(taskList); //Execution time: 712 ms
3.Использование библиотеки параллельных задач, с последующим сравнением результатов
- Код: Выделить всё • Развернуть
Parallel.ForEach(locpoints, locpoint =>…..// Execution time: 645 ms
Видно, что в случаях распараллеливания задач, экономия времени получается не существенной. Я ожидал раз в 5 быстрее, раз 9 точек обсчитываем параллельно, а не последовательно. Умные люди говорят, что планировщик распределяет работу между несколькими потоками и ядрами на основе системных ресурсов и рабочей нагрузки по возможности. И ожидать прямо пропорционального ускорения количеству запущенных задач не стоит.