WPF-приложение для интерактивной визуализации и решения задачи обратной кинематики (IK) плоского многозвенного манипулятора. Суставы можно перетаскивать мышью; заякоренные суставы удерживаются сегментным решателем IK.
- Перетаскивание сустава левой кнопкой мыши
- Включение/выключение якоря по правой кнопке мыши
- Сегментная обратная кинематика с учётом якорей (проксимальные суставы остаются подвижными)
- Отрисовка в реальном времени через OpenGL (OpenTK
GLControl) - Таблица координат суставов (A, B, C, …)
- Локализация UI через Mugen-ресурсы
$i18n.*
| Действие | Результат |
|---|---|
| Наведение на сустав | Подсветка синим |
| ЛКМ + перемещение | Перетаскивание сустава (оранжево-красный) |
| ПКМ по суставу | Якорь вкл/выкл (тёмно-серая заливка) |
| Якорь на суставе | Этот сустав нельзя тащить; при движении других его позиция удерживается IK |
- .NET Framework 4.7.2
- WPF + WindowsFormsHost / OpenTK.GLControl
- MugenMvvmToolkit 6.5.0 (MVVM, binding, IoC-модули)
- Autofac 4.4.0
- OpenTK 3.1.0 / OpenTK.GLControl 3.1.0
- MSTest — проект
TestInterviewProject.Tests
TestInterviewProject.sln
├── TestInterviewProject/ # WPF-приложение
│ ├── Models/ # Chain, Joint, Point2D, TargetJointPose
│ ├── Infrastructure/ # IK, якоря, константы, DI-модуль
│ │ └── Impl/ # KinematicsService, DefaultChainBuilder
│ ├── Localization/ # ILocalizationManager, MugenLocalizationManager
│ ├── Controls/ # WorkPlane (OpenGL)
│ ├── ViewModels/ # Main, WorkPlane, Report
│ ├── Views/ # XAML
│ ├── Messages/ # ChainPositionsChanged
│ └── Properties/ # Resources.resx (строки UI)
└── TestInterviewProject.Tests/ # Юнит-тесты якорей и кинематики
Позиции суставов считаются по звеньям Chain (Length, Coordinate):
- звено 0 — вертикальный подъём от базы и смещение по X;
- остальные звенья — поворот на угол
Coordinate.
- Фиксируются мировые позиции всех якорей.
- Строится список контрольных точек: якоря ∪ целевой сустав (по возрастанию индекса).
- Для каждого сегмента «корень → контрольная точка» выполняется градиентный IK (те же веса, что в
KinematicsConstants). - Для цели drag учитывается досягаемость и запас длины до ближайшего дистального якоря.
- До двух внешних проходов по сегментам для стабилизации якорей.
Константы: KinematicsConstants (ConvergenceEpsilon, MaxIkIterations, IkOuterPasses, веса градиента и т.д.).
Шесть звеньев (InitialConfiguration.Chains):
| № | Coordinate | Length |
|---|---|---|
| 1 | 0.1 | 0.05 |
| 2 | 0.5 | 0.3 |
| 3 | 0.0 | 0.3 |
| 4 | 0.0 | 0.1 |
| 5 | 0.0 | 0.1 |
| 6 | 0.0 | 0.1 |
- Чёрные точки — обычные суставы
- Синяя — сустав под курсором
- Оранжево-красная — перетаскиваемый сустав
- Тёмно-серая — заякоренный сустав
- Чёрные линии — звенья; каретка у базы
- Windows 7 или новее
- .NET Framework 4.7.2 или новее
- Видеокарта с поддержкой OpenGL
- Откройте
TestInterviewProject.slnв Visual Studio. - Восстановите NuGet-пакеты (для тестов —
dotnet restoreпоTestInterviewProject.Tests). - Соберите решение (Build Solution).
- Запустите проект
TestInterviewProject.
Запуск тестов:
dotnet test TestInterviewProject.Tests\TestInterviewProject.Tests.csproj- Autofac 4.4.0
- MugenMvvmToolkit 6.5.0 (+ AutofacContainer, Binding, WPF, WPF.Binding)
- OpenTK 3.1.0, OpenTK.GLControl 3.1.0
- Для тестов: Microsoft.NET.Test.Sdk, MSTest.TestAdapter/TestFramework
Паттерн MVVM (MugenMvvmToolkit) + DI (Autofac через TestAppModule):
- Models — данные кинематики и отрисовки
- Infrastructure — FK/IK, правила якорей, стартовая конфигурация
- ViewModels — состояние UI и команды
- Views / Controls — XAML и OpenGL-плоскость
- Localization — строки через
$i18nиProperties.Resources
См. файл LICENSE в корне репозитория.