由IMU控制的小鼠

时间:2018-04-05 15:09:34

标签: vb.net mouse sensor

我正在使用IMU的俯仰角和偏航角在vb.net中移动PC的鼠标指针。 不幸的是,它并不稳定。

首先我设置应该执行的最大角度 LOAD-Event

 'set max angles in degree
  maxAngle_YawRight = 30
  maxAngle_YawLeft = -30
  maxAngle_PitchUp = 20
  maxAngle_PitchDown = -20
  calculateCurParameter(maxAngle_YawRight, Panel_Right.Location.X, maxAngle_YawLeft, Panel_Left.Location.X + Panel_Left.Width, maxAngle_PitchUp, Panel_Top.Location.Y+Panel_Top.Height, maxAngle_NickDown, Panel_Bottom.Location.Y)

我使用这四个最大角度(pitch_up,pitch_down,yaw_right,yaw_left)将它们分配给我的表格的一部分,以获得4个点,例如(pitch_up,panel_2.location.Y) pitch_up和pitch_down用于鼠标指针的y坐标,yaw_right和yaw_left用于x坐标。这是通过函数calculateCurParameter完成的。

然后我使用这四个点来计算线性方程的参数:

CursorPos = m * angle + b

因此,您可以为每个新角度获得一个新的光标位置。

Private mX As Double
Private bX As Double
Private mY As Double
Private bY As Double

...

Private Sub calculateCurParameter(ByVal maxYawRight As Double, ByVal rightBorder As Double, ByVal maxYawLeft As Double, ByVal leftBorder As Double, ByVal maxPitchUp As Double, ByVal topBorder As Double, ByVal maxPitchDown As Double, ByVal bottomBorder As Double)

'this function calculates the parameter for Ycur=m*Xangle+b for each Pitch and Yaw

'calculate the parameter for the CursorPosition X
dim deltaX= maxYawLeft-maxYawRight
dim deltaY=leftBorder-rightBorder
mX=deltaY/deltaX
bX=rightBorder-mX*maxYawRight

'calculate the parameter for the CursorPosition Y
deltaX=bottomBorder-topBorder
deltaY=maxPitchDown-maxPitchUp
mY=deltaY/deltaX
bY=topBorder-mY*maxPitchUp
end Sub

在计算之后,我使用二次加权移动平均值(QWMA)作为由函数y = m * x + b计算的低通滤波器光标输出。

对于该移动平均线,我使用每个角度的最后50个样本。 之后,我将两个角度放在每个线性方程中(cursorPos = m * angle + b),如上所述。

            'Timer-Event which is triggered each 8ms
        ' yaw and pitch are in degrees and are updated in this timer event before
                    Dim xCoordCur = Math.Round(mX * yaw + bX)
                    Dim yCoordCur = Math.Round(mY * pitch + bY)
                    arrayCurY(cursorCounter) = yCoordCur
                    arrayCurX(cursorCounter) = xCoordCur
                    If cursorCounter =50 Then 'need 50 samples to do the QWMA
                        Dim aqwmY = qwma_calculating(arrayCurY)'function to calculate the QWMA, seems to be working
                        Dim aqwmX = qwma_calculating(arrayCurX)
            'the mouse pointer should not leave the form    
                        If aqwmX > Panel_Right.Location.X Then
                            aqwmX = Panel_Right.Location.X
                        ElseIf aqwmX < (Panel_Left.Location.X + Panel_Left.Width) Then
                            aqwmX = Panel_Left.Location.X + Panel_Left.Width
                        End If
                        If aqwmY > Panel_Bottom.Location.Y Then
                            aqwmY = Panel_Bottom.Location.Y
                        ElseIf aqwmY < (Panel_Top.Location.Y + Panel_Top.Height) Then
                            aqwmY = Panel_Top.Location.Y + Panel_Top.Height
                        End If

            'Set the new Cursor Position
                        Cursor.Position = New Point(aqwmX, aqwmY)
                        arrayValuesMoving(arrayCurX)'function to move the values one index forward
                        arrayValuesMoving(arrayCurY)
                    Else
                        cursorCounter += 1
                    End If

在我的最后一步中,我设置了新的Cursor-Position

Cursor.Position=New Point(xCoor,yCoor)

现在我可以通过移动IMU来控制鼠标指针,但它非常不稳定。 例如,尽管IMU不移动,鼠标指针仍会移动。

甚至不可能将鼠标悬停在某些表单元素上。 我做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我添加了以下代码:

                            If xCoor > Cursor.Position.X + 3 Or xCoor < Cursor.Position.X - 3 Then
                            istxCoor = True
                        Else
                            istxCoor = False
                        End If
                        If yCoor > Cursor.Position.Y + 3 Or yCoor < Cursor.Position.Y - 3 Then
                            istyCoor = True
                        Else
                            istyCoor = False
                        End If
                        If istxCoor And istyCoor Then
                            SetCursorPos(xCoor, yCoor)
                        ElseIf istxCoor Then
                            SetCursorPos(xCoor, Cursor.Position.Y)
                        ElseIf istyCoor Then
                            SetCursorPos(Cursor.Position.X, yCoor)
                        End If

它现在更加稳定但现在已经有时滞了。