вторник, 7 июня 2011 г.

линуксопроблемы

В линуксах уже давно есть такая проблема - невозможность использования одновременно двух вебкамер под v4l. При попытке заюзать еще одну камеру вылезает ошибка "Error 28 - No space left on device".
Связано это с тем, что драйвером выделяется один буфер на ВСЕ камеры, расположенные на одной шине, в результате весь буфер заполнен только для одной камеры, даже если она занимает только часть буфера.
Выхода тут два:
1) подключить камеру к другой шине USB (если есть). Тогда для камер будут разные буферы.
У меня шина всего одна (NM10 все 8 портов на одной шине держит), поэтому пойдем по второму пути.
2) сделать так, чтобы обе камеры помещались в выделенный буфер
а это можно сделать, только если пропатчить драйвер камеры
так как у меня UVC камера, то и будем патчить драйвер uvcvideo

долгий гуглинг привел к такому патчу:
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
index a1e9dfb..53e0847 100644
--- a/drivers/media/video/uvc/uvc_driver.c
+++ b/drivers/media/video/uvc/uvc_driver.c
@@ -348,7 +348,7 @@ static int uvc_parse_format(struct uvc_device *dev,
   strlcpy(format->name, "MJPEG", sizeof format->name);
   format->fcc = V4L2_PIX_FMT_MJPEG;
   format->flags = UVC_FMT_FLAG_COMPRESSED;
-  format->bpp = 0;
+  format->bpp = 4;
   ftype = UVC_VS_FRAME_MJPEG;
   break;
 
@@ -461,10 +461,16 @@ static int uvc_parse_format(struct uvc_device *dev,
    * uncompressed formats this can be fixed by computing the
    * value from the frame size.
    */
-  if (!(format->flags & UVC_FMT_FLAG_COMPRESSED))
+  if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) ||
+    (format->type == UVC_VS_FORMAT_MJPEG))
    frame->dwMaxVideoFrameBufferSize = format->bpp
     * frame->wWidth * frame->wHeight / 8;
 
+  printk("---> framesize %ix%i, buffsize %i, bpp %i\n",
+   frame->wWidth, frame->wHeight,
+   frame->dwMaxVideoFrameBufferSize,
+   format->bpp);
+
   /* Some bogus devices report dwMinFrameInterval equal to
    * dwMaxFrameInterval and have dwFrameIntervalStep set to
    * zero. Setting all null intervals to 1 fixes the problem an 
 
после чего выгрузить драйвер и загрузить с параметром:
rmmod uvcvideo && modprobe uvcvideo quirks=128

при 320х240 обе камеры уже заводились, но, блин, я же жпег снимаю с них, не может шина забиваться настолько всего парой небольших жпегов, особенно учитывая, что в буфер спокойно лезет несжатый кадр 1280х800... значит где-то еще надо уточнить проверку на размер буфера

дальнейшее гугление дало еще кое-что:
в файле uvc_video.c найти следующее:
if ((!(format->flags & UVC_FMT_FLAG_COMPRESSED)  &&
        stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH &&
        stream->intf->num_altsetting > 1) {


и изменить так:
if ((!(format->flags & UVC_FMT_FLAG_COMPRESSED) ||
        (format->type == UVC_VS_FORMAT_MJPEG)) &&
        stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH &&
        stream->intf->num_altsetting > 1) {


после такой процедуры обе камеры спокойно показывают 1280х800 (правда, при таких разрешениях уже возникают проблемы другого рода: трафик вылезает за все разумные пределы - порядка 150-200мбит в зависимости от картинки перед камерой, но это уже особенности моей системы)

зы: все это прокатило на кернел 2.6.38, хотя патч писался под 2.6.32, видимо с тех пор драйвер не претерпел изменений, и работать будет почти на любом ядре

понедельник, 6 июня 2011 г.

зрение

забрал камеры
по первым тестам очень неплохо себя повели
автофокус тоже хорош

суббота, 4 июня 2011 г.

звук

выпросил китайские колонки на запчасти
разобрал, доработал напильником, паяльником, переделал под бортовое питание
получил примерно такое:


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

почта россии...

10 дней от Питера до Москвы...
Вот так у нас доставляет 1й класс...
Но не суть, в сторону нашей доблестной почты и так дофига гневных комментариев прозвучало
Приехали модули OpenRobotics
Правда, ожидал небольшой подвох - по шине Robo-MD2 стоят коннекторы IDC-12, которых днем с огнем не сыщешь... придется ехать видимо на митинский за ними...

четверг, 2 июня 2011 г.

делаем мозги

После долгой возни с материнкой, паяльником, старой флэшкой, гентой и матами получилось примерно следующее:


Имеется: материнка D510MO, флэшка на 8гб, которая уже много чего пережила, Gentoo 2011 2.6.38
Система установлена на флэшку, /usr/src, /var/tmp, /var/portage и еще несколько папок вынесены на внешний хард, подключаемый в случае необходимости что-то скомпилить
без харда получилась достаточно устойчивая к внешним воздействиям системка
стартует все целиком примерно за 15 секунд - с момента нажатия Power до завершения запуска последнего пользовательского приложения из автозагрузки
энергопотребление в итоге получилось что-то около 25ватт, при условии бортового питания от аккума это очень неплохо

среда, 1 июня 2011 г.

Введение в робототехнику

Начну сразу, без долгих вступлений
Есть идея - собрать "робота" - управляемое шасси, но в последствии, обладающее неким своим интеллектом, достаточным для самостоятельной навигации и передвижении на местности.
Платформа гусеничная, примерные габариты составляют 40х50х30см, вес до 20кг
В качестве "мозга" используется PC-совместимое решение, для связи wi-fi

Пока идеи такие, все остальное даже не дошло до концепта.

Некоторые подробности об используемых компонентах:
1) "мозг" - Mini-ITX плата Intel D510MO - оч подходящая штука для подобных применений

2) контроллер ввода-вывода - контроллер из серии OpenRobotics
3) драйвер двигателей - контроллер из той же серии
4) двигатели - стеклоподъемники ВАЗ2110
5) "глаза" - 2 вебкамеры Chicony ICam 7144

пока это все