none
Рекурсивный перебор углов. RRS feed

  • Общие обсуждения

  • Дан манипуляционный робот из n звеньев, дана конечная точка, которую он должен захватить. 
    Задача: найти все конфигурации (наборы углов наклона звеньев), которые позволяют роботу захватить объект.
    т.е решить обратную задачу кинематики в 2D варианте. Все это действо нужно делать через перебор. Лучше всего через рекурсию, но в этом я и застрял. 
    вот такие входные данные:

    int part;//количество звеньев робота Point[] robotLine;//массив точек вершин робота int[] angle;//массив углов Point beginPoint;//точка основания робота (она же robotLine[0]) Point obj;//объект, который нужно захватить

    Еще есть метод void goRobot() //он вычисляет точки робота по текущему массиву углов.

    ну и попытка тоже есть:

     void recurs(int a = 0)
              {
                  for (int i = 0; i <= 360; i++)
                  {
                      if (a < part - 1)
                          recurs(a++);
                      angle[a]++;
                      goRobot();
                      if (robotLine[part] == obj)
                      {
                          label16.Text +="find, ";//если нашел, отписываемся
                      }
                  }
              }

    Помогите до ума довести.

    19 октября 2014 г. 11:24

Все ответы

  • Добрый день.

    Если я правильно вас понял и у вас манипулятор имеет более двух звеньев и их степени свободы не ограничены, то количество решений бесконечно, даже в 2D.

    20 октября 2014 г. 8:13
    Отвечающий
  • Добрый день.

    Если я правильно вас понял и у вас манипулятор имеет более двух звеньев и их степени свободы не ограничены, то количество решений бесконечно, даже в 2D.

    При 1-м звене - 1 решение, при 2-х звеньях - 2 решения, при 3-х звеньях - если степени свободы не ограничены, то в любом случае конечное множество положений будет ограничено длиной звеньев.

    При 4-х и более звеньях надо задаваться дискретностью угла, если этого не сделать, то да - решение имеет бесконечное множество вариантов по углу, но тем не менее диапазоны углов некоторых звеньев будут ограничены их  длинами.

    Иными словами:

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

    Если эта разность меньше всех длин звеньев манипулятора, то наше множество ограничено, т.к. мы не можем исключить ни одного звена (при его исключении мы не дотянемся до точки, угловые положения ограничены).

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

    20 октября 2014 г. 9:13
  • А вообще, конечно, это похоже на классику (Ханойские башни), только вместо больших дисков будет точка начала манипулятора (1-го звена). Вы рекурсию стройте не на основании углов, а на основании точки отсчета, иными словами каждая новая итерация рекурсивного вызова - новое звено, а не новое угловое положение.
    20 октября 2014 г. 9:40