- •Аннотация
- •Введение
- •1Цель работы и решаемые задачи
- •2Обзор аналогов робота-боксера.
- •3. Разработка структурной схемы робота. На рисунке 1.1. Представлена структурная схема робота.
- •4.Технические характеристики wafer-ot-z670.
- •Сравнительный анализ устройств стз
- •3Функцианальная схема.
- •4Построение системы управления с помощью сетей Петри.
- •Разработка алгоритма системы управления.
- •4.1Функциональная схема.
- •3.3 Система технического зрения Kinect.
- •Видеопоток от сенсора
- •Аудиопотокотсенсора
- •Анимация
- •4.2Определение углов поворота двигателей.
- •5Программа управления роботом боксером .
- •6Технологический процесс.
Анимация
Данная анимация, была выполнена с помощью программы KinectSDK которая способна распознать фигуру человека и его движения. Точки в построенном скелете называются Joint, что можно перевести как сустав, соединение, узел. Ниже показана анимация пользователя стоящего в разных позициях, а (рис.14) показывает пользователя в защитной стойке
.
Рисунок 14: Пользователь в стойке «блок».
На (рис.15) показан пользователь наносящий удар правый «джеб».
Рисунок 15: Пользователь в стойке «правый джеб».
4.2Определение углов поворота двигателей.
Оптический Захват движения (ОМС), один из таких способов поворота в реальной жизни в цифровые данные, использует ряд камер, чтобы снять предмет с разных взглядов. Эти взгляды используются затем для восстановления движения в 3D, где он затем может быть применен к компьютерной модели. На рисунке nn (а-б)
Рисунок nn-а: Рисунок nn-б:
ОМС использует ряд специальных камер, которые рассматривают сцену из разных углов. Так же, как бинокулярное зрение позволяет людям увидеть мир в трех измерениях, использование двух или более камер наблюдения и тот же предмет позволяет восстановить это в 3D. В " Marker-based " OMC отражающие маркеры, размещенные на теле. Из-за их отражательной способности, эти маркеры могут быть легко распознаны программным обеспечением камеры. Запись позиции этих маркеров во всем диапазоне движения, позволяет определять положение тела в любой момент времени. Кроме того, "Маркер-менее" ОМК пытается выполнить ту же задачу без использования специальных приборов слежения. Вместо этого, силуэт рассматривается с разных углов, и используется для восстановления все 3D тело. Процесс ОМС показан на рисунке
Рисунок 16-а: Захват движения "аперкот". Рисунок 16-б: Захват движения "джеб".
Определение углов при нанесении ударов по сопернику с помощью системы захватов движения.
После анализа полученных данных были отслежены углы вращения суставов, которые меняются во время нанесения, того или иного удара рукой. На рисунках с низу представлены, результаты полученные при нанесения правого прямого удара (плечо) и правого прямого удара (локоть). Рисунок 16(а-б)
Рисунок 16-а: Правый прямой удар (плечо).
Рисунок 16-а: Правый прямой удар (локоть).
При помощи Optical Motion Capture, были созданы графики изменения углов вращение суставов руки во время ударов, что позволит избежать нахождение углов опытным путем. Эти результаты вставлены в программу управления роботом-боксером.
5Программа управления роботом боксером .
Arduino start
Imports System
Imports System.IO.Ports
'Arduino end
Imports System.Text
Imports Microsoft.Research.Kinect.Nui
Imports Coding4Fun.Kinect.Wpf
Namespace SkeletalTracking
''' <summary>
''' Interaction logic for MainWindow.xaml
''' </summary>
Partial Public Class MainWindow
Inherits Window
' Arduino start
Public Shared _continue As Boolean
Public Shared _serialPort As SerialPort
Public Shared ScreenMaxX As Integer = 180
Public Shared ScreenMaxY As Integer = 180
' Arduino end
Public Sub New()
InitializeComponent()
End Sub
'Kinect Runtime
Private nui As New Runtime
Private Sub Window_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
'Initialize to do skeletal tracking
nui.Initialize(RuntimeOptions.UseSkeletalTracking)
' #Region "TransformSmooth"
'Must set to true and set after call to Initialize
nui.SkeletonEngine.TransformSmooth = True
'Use to transform and reduce jitter
Dim parameters = New TransformSmoothParameters With {.Smoothing = 0.8F, .Correction = 0.3F, .Prediction = 0.4F, .JitterRadius = 1.0F, .MaxDeviationRadius = 0.5F}
nui.SkeletonEngine.SmoothParameters = parameters
' #End Region
'add event to receive skeleton data
AddHandler nui.SkeletonFrameReady, AddressOf nui_SkeletonFrameReady
'' Arduino start
ArduinoSetSerial()
ArduinoOpenSerial()
' Arduino end
End Sub
Private Sub nui_SkeletonFrameReady(ByVal sender As Object, ByVal e As SkeletonFrameReadyEventArgs)
Dim allSkeletons As SkeletonFrame = e.SkeletonFrame
'get the first tracked skeleton
Dim skeleton As SkeletonData = ( _
From s In allSkeletons.Skeletons _
Where s.TrackingState = SkeletonTrackingState.Tracked _
Select s).FirstOrDefault()
'TechBitar: The original Microsoft code was missing the "Not" which resulted in crashes.
If Not skeleton Is Nothing Then
'set position
SetEllipsePosition(headEllipse, skeleton.Joints(JointID.Head), JointID.Head)
SetEllipsePosition(leftEllipse, skeleton.Joints(JointID.HandLeft), JointID.HandLeft)
SetEllipsePosition(rightEllipse, skeleton.Joints(JointID.HandRight), JointID.HandRight)
SendToArduino(skeleton.Joints(JointID.HandLeft), JointID.HandLeft)
SendToArduino(skeleton.Joints(JointID.HandRight), JointID.HandRight)
End If
End Sub
Private Sub SetEllipsePosition(ByVal ellipse As FrameworkElement, ByVal joint As Joint, ByVal JID As JointID)
Dim scaledJoint = joint.ScaleTo(ScreenMaxX, ScreenMaxY, 0.5F, 0.2F)
Canvas.SetLeft(ellipse, scaledJoint.Position.X)
Canvas.SetTop(ellipse, scaledJoint.Position.Y)
End Sub
Private Sub SendToArduino(ByVal joint As Joint, ByVal JID As JointID)
Dim scaledJoint = joint.ScaleTo(ScreenMaxX, ScreenMaxY, 0.5F, 0.2F)
If JID = JointID.HandRight Then
HRKinectX.Text = scaledJoint.Position.X
HRKinectY.Text = scaledJoint.Position.Y
End If
If JID = JointID.HandLeft Then
HLKinectX.Text = scaledJoint.Position.X
HLKinectY.Text = scaledJoint.Position.Y
End If
' Arduino start
ArduinoSendByte(scaledJoint.Position.X, scaledJoint.Position.Y, 1, JID)
' Arduino end
End Sub
Private Sub Window_Closed(ByVal sender As Object, ByVal e As EventArgs)
'Cleanup
nui.Uninitialize()
End Sub
Private Sub ArduinoSetSerial()
Dim ArduinoCom As String = ComPort.text
_serialPort = New SerialPort()
_serialPort.PortName = "COM" + Trim(ComPort.text)
_serialPort.BaudRate = 9600
' _serialPort.Parity = 0
_serialPort.DataBits = 8
' _serialPort.StopBits = 1
_serialPort.Handshake = 0
_serialPort.ReadTimeout = 500
_serialPort.WriteTimeout = 500
End Sub
Private Sub ArduinoOpenSerial()
If Not _serialPort.IsOpen Then
_serialPort.Open()
Else
MsgBox("ARDUINO: SERIAL PORT CANNOT BE OPENED")
End If
_continue = True
End Sub
Private Sub ArduinoCloseSerial()
If _serialPort.IsOpen Then
_serialPort.Close()
End If
End Sub
Private Sub ArduinoSendByte(ByVal kinect_x As Single, ByVal kinect_y As Single, ByVal kinect_z As Single, ByVal kinect_j As Integer)
Dim x, y, z, j As Byte
Dim sx, sy As Single
Dim HowOften As Integer
ComStatus.Text = "NA"
x = Math.Abs(CByte(kinect_x))
y = Math.Abs(CByte(kinect_y))
z = CByte(kinect_z)
j = CByte(kinect_j)
x = x
Dim ArduinoBuffer() As Byte = {x, y, z, j}
If _serialPort.IsOpen Then
ComStatus.Text = "OK"
_serialPort.Write(ArduinoBuffer, 0, ArduinoBuffer.Length)
End If
End Sub
End Class
End Namespace
