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 проход списка.
Проект
Сейчас я хочу рассказать об одном проекте, который для меня станет чем-то вроде темного коридора с большим количеством граблей, через который мне все равно когда-либо придется пройти.
Это печально, но занимаясь программированием больше 2 лет, я не успел написать ни одного серьезного проекта. Участвовал в олимпиадах, решал задачки на acm.timus.ru, даже использовал OpenGL. Но ничего большого и красивого не написал.
Итак, мы с другом решили написать программу, связанную с ТММ (теория механизмов и машин).
Основные функции программы:
- Дать пользователю возможность собрать механизм путем создания списка кинематических пар и звеньев, а также задания связей между ними.
- Структурный анализ механизма
- Кинематический анализ механизма
- Динамический анализ механизма
Теперь по порядку.
Что такое механизм? Будем считать, что это набор твердых тел, которые совершают некоторые движения и взаимодействуют друг с другом. Механизмы широко используются в технике для многих целей. Например, передача движения, точное позиционирование и так далее. Звено – это часть механизма. Звенья соединяются кинематическими парами. Кинематические пары могут быть вращательными или поступательными, вообще говоря – кинематическая пара это нечто, что устанавливает ограничение на движения звеньев друг относительно друга. В физических движках это называется joints.
Структурный анализ механизма – это логическое разделение механизма на отдельные части, которые называются группами Ассура. Это делается для упрощения кинематического анализа.

На картинке: слева – механизм, который будет собирать пользователь, все остальное – это части, на которые будет разбиваться этот механизм для анализа.
Кинематический анализ – это, по сути, решение прямой задачи кинематики. Зная угол поворота начального звена и структуру механизма, нужно определить положение всех кинематических пар и параметры звеньев. Также сюда входит определение скоростей и ускорений для каждой кинематической пары в заданные моменты времени.
Динамический анализ – определение сил, дейсвтующих на звенья в данные моменты времени. Здесь должны учитываться масса звена, возможно – сила сопротивления воздуха.
Все вышесказанное касается ядра программы. Кроме этого, хотелось бы иметь красивенький интерфейс с редакторами объекта, красивую прорисовку и так далее. Я так же не отрицаю возможность добавления в будущем возможности работы с 3d-механизмами.
Надеюсь, проект будет завершен и результаты обрадуют меня и всех, кто сможет их наблюдать.
Какую пользу должен принести проект? Что интересно мне:
- Командная разработка. Хотя, учитывая, что нас двое, можно попробовать что-то вроде eXtreme Programming
- Проектирование и ООП. На данный момент имеются некоторые наброски классов и связей между ними
- Возможно, применение юнит-тестов, чего я раньше никогда не делал.
- Практика использования C++
Кроме этого, программу кто-то сможет использовать (судя по тому, что есть аналогичные).
Подобные проекты:
- Список программ на сайте ДонНТУ, там есть “ТММ (курсовой проект)” (windows-программа)
- Mechanics Studio .NETНевероятно красивый проект, но, судя по всему, мертвый. Скриншоты впечатляют.



