Робототехническая игра для людей - LaserBall :)

Обсуждаем рождающиеся мысли и результаты экспериментов.

Re: Робототехническая игра для людей - LaserBall :)

Сообщение executer » 04 фев 2009, 00:37

А что он так виляет?
Там не пропорциональное управление, просто вкл-выкл? А с инерцией - это круто, играл както на кампе в какуюто аркаду - прикольно так... только там по двум координатам (типа космос), тут так не получтся заносить. Хотя можно повороты сделать более пологими, не знаю то ли это будет.
:good: Класная игруха! Можно не вдвоем а в 10ром! Тогда такая драка начнется! :Yahoo!:
Аватара пользователя
executer
 
Сообщения: 784
Зарегистрирован: 30 янв 2009, 01:24
Откуда: Запорожье
прог. языки: Си, AvrASM, STL, САС, учу Си++
ФИО: Павел

Re: Робототехническая игра для людей - LaserBall :)

Сообщение =DeaD= » 04 фев 2009, 00:42

Виляет - ну это я сделал тупые IF-ы вместо настройки пропорционального управления :) а в целом, если честно - просто не заморачивался пока серьёзно на эту тему.

Думаю, как будут новые модули Open Robotics - на них переделаю и попробую там приличное управление сделать и скорость повысить.

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

Re: Робототехническая игра для людей - LaserBall :)

Сообщение =DeaD= » 07 фев 2009, 11:34

На всякий случай выложу сюда пару приёмов применённые в программе (bolt, это не тебе, можешь сразу успокоиться и не кричать тут что это какие-то куски и где полный исходник, это скорее мне, чтобы не потерялось, и народу, кто понимает чего-то в азах технического зрения и OpenCV):

Препроцессинг картинки с камеры, после которого всё, кроме ярких пятен, будет сброшено писал(а): cvResize(frame,image,CV_INTER_LINEAR);

mycvShowImage(Image2,image);

cvSetImageCOI(image,1);
cvCopy(image,image2);

cvSmooth(image2, image1,CV_GAUSSIAN,5);

cvThreshold( image1, image2, 210, 255, CV_THRESH_TOZERO );

cvSetImageCOI(image,1);
cvCopy(image2,image);
cvSetImageCOI(image,2);
cvCopy(image2,image);
cvSetImageCOI(image,3);
cvCopy(image2,image);

cvSetImageCOI(image,0);

mycvShowImage(Image1,image);


и

Поиск нужного нам пятна писал(а): long int lx=-1;
long int ly=-1;
long int datastep=img->widthStep;
long int channels=img->nChannels;
mycvGetImage(Image1,img);
for(long int y=0; y<240; y++){
for(long int x=0; x<320; x++){
if(lx==-1){
unsigned char pix=img->imageDataOrigin[(239-y)*datastep+x*channels];
if(pix>100){ lx=x; ly=y; };
};
};
};

if(lx>=0){
Shape1->Left=Image1->Left+lx-Shape1->Width/2;
Shape1->Top=Image1->Top+ly-Shape1->Height/2;
}else{
Shape1->Left=0;
Shape1->Top=0;
};


Добавлено спустя 2 минуты 36 секунд:
А еще у меня есть:
Тупые IF-ы, которые я написал, потому что лень было делать полноценный ПИД \":)\" писал(а):AnsiString cmd="xf00x\n";
if(lx>=0){
long int dx=lx-160;
long int dy=ly;

double k=dx/(340.0-dy); // -160..160

double r=sqrt(dx*dx+(340-dy)*(340-dy)); //0..289

double v1=5,v2=3,v3=1,v4=0.5,v5=0.25,v6=0.1,v7=0.05;

if(k<-v3){ cmd="xl22x\n"; };
if(k>+v3){ cmd="xr22x\n"; };

if(k<-v2){ cmd="xl33x\n"; };
if(k>+v2){ cmd="xr33x\n"; };

if(k<-v1){ cmd="xl44x\n"; };
if(k>+v1){ cmd="xr44x\n"; };


if(k>=-v3 && k<-v4){ cmd="xl26x\n"; };
if(k<=v3 && k>v4){ cmd="xr62x\n"; };

if(k>=-v4 && k<-v6){ cmd="xl24x\n"; };
if(k<=v4 && k>v6){ cmd="xr42x\n"; };

if(k>=-v6 && k<=v6 && r<160){ cmd="xf22x\n"; };
if(k>=-v6 && k<=v6 && r>=160){ cmd="xf44x\n"; };
if(k>=-v6 && k<=v6 && r>=220){ cmd="xf55x\n"; };
if(k>=-v6 && k<=v6 && r>=280){ cmd="xf66x\n"; };

Form1->Caption="Cmd="+cmd+ " r="+FloatToStr(r)+" k="+FloatToStr(k);
};

if(com->Open){
char *cmd0=cmd.c_str();
com->PutString(cmd0);
};
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Робототехническая игра для людей - LaserBall :)

Сообщение bolt » 07 фев 2009, 17:38

Сама идея конструктора не нова. Все РС именно так и собраны – материнка с ЦП и модули со своими МК.
На Форуме мысль о создании своего конструктора для ботов впервые видимо всплыла здесь http://forum.roboclub.ru/IPBoard/index. ... #entry7007, хотя к этому моменту за бугром эту идею давно уже реализовали в нескольких вариантах и всю КД выложили. Подход обсудили и на этом дело закончилось :(
Реально роботами занимался лишь Lex сделавший своего минибота http://forum.roboclub.ru/IPBoard/index. ... wtopic=803
На мой вкус очень интересного. Он же /Клебан Виталий /, если не ошибаюсь, и видеозахват на КПК организовал, с распознаванием цели.
Вот скин программы http://bp0.blogger.com/_fdCHWsVk87k/RnU ... 00-h/2.JPG (обратите внимание, что на русском)
Т.е. чек проделал огромную работу, что вызывает не меньшее уважение. :good:

Те фрагменты кода, что представил в свое оправдание Dead ничего, кроме уже не раз озвученных вопросов не вызывают.
Где сама программа?
Где качественное фото робота?
О каком ПИД идет речь, если РС находится вне бота и не получает данных от энкодеров, моторов etc?

Предлагаю Dead снести тему LaserBall и не позорится :x
bolt
 
Сообщения: 281
Зарегистрирован: 01 дек 2008, 19:21

Re: Робототехническая игра для людей - LaserBall :)

Сообщение MiBBiM » 26 янв 2010, 23:14

а где полные исходники, чтоб собрал и поехало?
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Робототехническая игра для людей - LaserBall :)

Сообщение =DeaD= » 26 янв 2010, 23:27

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

Re: Робототехническая игра для людей - LaserBall :)

Сообщение MiBBiM » 28 янв 2010, 16:23

наверное... ну или алгоритм словами описать :wink:
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Робототехническая игра для людей - LaserBall :)

Сообщение =DeaD= » 28 янв 2010, 16:26

А какой алгоритм то? Как включить движки, чтобы приехать к точке на экране, которая ща с координатами (x,y)? у меня тупые IF'ы были.

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

Re: Робототехническая игра для людей - LaserBall :)

Сообщение MiBBiM » 31 янв 2010, 17:45

алго распознавания точки.
1) зачем чехарда с выделением канала и копированием?
2) почему ищется последнее превышение порога, а не максимум?
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Робототехническая игра для людей - LaserBall :)

Сообщение =DeaD= » 31 янв 2010, 18:07

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

Re: Робототехническая игра для людей - LaserBall :)

Сообщение MiBBiM » 31 янв 2010, 20:59

2. я, кажется, понял, это же условие игры, кто ближе поместит точку к роботу, нет?
вот такой же полный код для нахождения точки:
Код: Выделить всё
#include <highgui.h>
#include <cv.h>
#include <stdio.h>

CvPoint find_point(IplImage *frame)
{
   const char border = 50;

   int width = frame->width;
   int height = frame->height;

   int p_x = -1, p_y = -1;
   for (int y = 0; y < height; y++) {
      unsigned char * ptr = (unsigned char *) frame->imageData + y * frame->widthStep;
      for (int x = 0; x < width; x++) {
         if (*ptr > border) {
            p_x = x;
            p_y = y;
         }
         ptr++;
      }
   }
   return cvPoint(p_x, p_y);
}

int main()
{
   const char *win_before = "Видео с камеры";
   const char *win_after = "Обработанное видео";
   cvNamedWindow(win_before);
   cvNamedWindow(win_after);

   CvCapture *camera = cvCreateCameraCapture(CV_CAP_ANY);

   IplImage *frame = cvQueryFrame(camera);
   IplImage *buffer = cvCreateImage(
      cvSize(frame->width, frame->height),
      IPL_DEPTH_8U,
      1
   );
   buffer->origin = frame->origin;

   do {
      frame = cvQueryFrame(camera);      
      cvCvtColor(frame, buffer, CV_RGB2GRAY);

      cvShowImage(win_before, frame);

      cvShowImage(win_after, buffer);
      cvSmooth(buffer, buffer, CV_GAUSSIAN, 5);
      cvThreshold(buffer, buffer, 210, 255, CV_THRESH_TOZERO);

      CvPoint point = find_point(buffer);
      printf("point: %d, %d\n", point.x, point.y);
      if (point.x != -1)
         cvCircle(buffer, point, 10, cvScalar(255));

      cvShowImage(win_after, buffer);
   } while (cvWaitKey(1) != 'e');

   cvDestroyAllWindows();
}

минусы: если точка перемещается, то её яркость убывает => после обрезания её уже не видно. если окружение светлое, то будут косяки. примеры:
sample.png
незасвеченное изображение

sample2.png
засвеченное изображение


Добавлено спустя 23 минуты 7 секунд:
в какую сторону копать для нахождения пятна? (т.е. описывающей окружности)
Последний раз редактировалось MiBBiM 01 фев 2010, 01:30, всего редактировалось 1 раз.
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Робототехническая игра для людей - LaserBall :)

Сообщение =DeaD= » 31 янв 2010, 22:01

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

Пред.

Вернуться в Идеи

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

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