Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
16.62 Mб
Скачать

Анимация

Данная анимация, была выполнена с помощью программы 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