В споре рождается истина

- А я так не думаю!

Posts Tagged ‘Проект

Структурный анализ

оставьте комментарий »

Продолжаем конкретизировать задачи, цели и методы их достижения.

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

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

Один из возможных вариантов – делать это с помощью графа.
На самом деле это единственный нормальный вариант, до которого я смог додуматься :) .
Радует то, что в какой-то статье (ссылку дам позже) работники какой-то кафедры СПбГУ ИТМО описывали свою программу, созданную только для структурного анализа, причем тоже использовали графы.

Итак, в чем суть. Построим граф, вершинами которого будут звенья механизма, а ребрамикинематические пары.

Сначала надо указать, что приводит механизм в движение. Выбранные пользователем стартовая КП и стартовое звено образуют группу Ассура первого класса.

Далее начинается собственно анализ.

Пока что будем реализовывать поиск групп Ассура 2-го класса (используемый алгоритм легко модифицировать для более сложных задач, мы оставляем это на будущее). Группа Ассура 2-го класса – это набор из 2 КП и 3 звеньев, которые соединяются этими КП. Искать эти группы надо по правилу: 2 вершины должны быть уже просчитаны на данный момент, тогда мы можем просчитать третью.

Для примера, пусть есть следующий механизм:

Механизм

Качество рисунков в этой статье не ахти, но это потом поправлю.

Этому механизму соответствует следующий граф:

Числа в вершинах графа – это номера соответствующих звеньев механизма. Введена фиктивная вершина “0″, которая обозначает “землю”. Это сделано для упрощения дальнейшего анализа. “Землей” будем называть любую просчитанную вершину. Буквы рядом с ребрами – это имена соответствующих кинематических пар механизма.

“Земляные” вершины будем красить в зеленый темный. Значит, граф превращается в такой:

С учетом того, что пользователь указал 1-ую группу Ассура, имеем следующее:

Звенья 0, 1 и точка O принадлежат теперь 1-ой группе Ассура, 1-го класса.

Далее алгоритм похож на обход графа в ширину. На каждой итерации вершины, соседние с темными зелеными, окрашиваются в светлый зеленый. Теперь задача  состоит в том, чтобы найти путь из темной зеленой вершины в другую темную зеленую. По построению, этот путь будет содержать две светлых зеленых. Три ребра и две светлых зеленых вершины выделяем в отдельную группу Ассура. По-моему можно обойтись и без перекрашивания вершин в светлые зеленые, но я подумаю и вспомню, зачем же это все-таки понадобилось…

Алгоритм в действии:

  • Вершины 2, 3 и 5 – соседние с темными зелеными. Красим их в светлый зеленый. 
  • Нашли путь 1 A 2 B 3 C 0. Выделяем в отдельную группу Ассура второго класса ребра A, B, C и вершины 2, 3.  
  • Вершины 4 и 7 теперь соседние с темными зелеными. Красим их в светлый зеленый. 
  • Нашли путь 0 D3 5 D2 6 D1 3 (или в другую сторону, не важно). Выделяем  вершины 5, 6 и ребра D1, D2, D3 в отдельную группу Ассура.
  • Вершина 6 теперь стала соседней с темной зеленой. Перекрашиваем ее в светлый зеленый:   
  • И последнее: вершины 6, 7 и ребра E, F1, F2 выделяем в группу Ассура. 

Надо еще раз обратить внимание на то, что ребра графа – это кинематические пары механизма, а вершины графа – это его  ребра.

Каждый раз, когда какая-то часть механизма обосабливается в отдельную группу Ассура, создаем объект класса AssurGroup, ставим ему соответствующие значения свойств и добавляем в указатель на этот объект в список.

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

Если просчитаны все группы Ассура с 1-й по i-ую в этом списке, то есть все данные для вычисления (i+1)-ой. Таким образом, провести кинематический анализ можно за 1 проход списка.

Написано jtimv

16.01.2010 в 23:10

Опубликовано в Проекты

Отмечено как , ,

Проект

с 4 комментариями

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

Это печально, но занимаясь программированием больше 2 лет, я не успел написать ни одного серьезного проекта. Участвовал в олимпиадах, решал задачки на acm.timus.ru, даже использовал OpenGL. Но ничего большого и красивого не написал.

Итак, мы с другом решили написать программу, связанную с ТММ (теория механизмов и машин).
Основные функции программы:

  • Дать пользователю возможность собрать механизм путем создания списка кинематических пар и звеньев, а также задания связей между ними.
  • Структурный анализ механизма
  • Кинематический анализ механизма
  • Динамический анализ механизма

Теперь по порядку.

Что такое механизм? Будем считать, что это набор твердых тел, которые совершают некоторые движения и взаимодействуют друг с другом. Механизмы широко используются в технике для многих целей. Например, передача движения, точное позиционирование и так далее. Звено – это часть механизма. Звенья соединяются кинематическими парами. Кинематические пары могут быть вращательными или поступательными, вообще говоря – кинематическая пара это нечто, что устанавливает ограничение на движения звеньев друг относительно друга. В физических движках это называется joints.

Структурный анализ механизма – это логическое разделение механизма на отдельные части, которые называются группами Ассура. Это делается для упрощения кинематического анализа.

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

Кинематический анализ – это, по сути, решение прямой задачи кинематики. Зная угол поворота начального звена и структуру механизма, нужно определить положение всех кинематических пар и параметры звеньев. Также сюда входит определение скоростей и ускорений для каждой кинематической пары в заданные моменты времени.

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

Все вышесказанное касается ядра программы. Кроме этого, хотелось бы иметь красивенький интерфейс с редакторами объекта, красивую прорисовку и так далее. Я так же не отрицаю возможность добавления в будущем возможности работы с 3d-механизмами.

Надеюсь, проект будет завершен и результаты обрадуют меня и всех, кто сможет их наблюдать.

Какую пользу должен принести проект? Что интересно мне:

  1. Командная разработка. Хотя, учитывая, что нас двое, можно попробовать что-то вроде eXtreme Programming :)
  2. Проектирование и ООП. На данный момент имеются некоторые наброски классов и связей между ними
  3. Возможно, применение юнит-тестов, чего я раньше никогда не делал.
  4. Практика использования C++

Кроме этого, программу кто-то сможет использовать (судя по тому, что есть аналогичные).
Подобные проекты:

Написано jtimv

07.01.2010 в 20:31

Опубликовано в Проекты

Отмечено как ,

Follow

Get every new post delivered to your Inbox.