ロボットアームの制御

1.キネマティクスとは..


 人間の動きなど関節を持った物体の動き等を,階層構造により制御する方法である.
 物体それぞれの座標系を関連づける(親子関係を持たせる)ことにより,人体等の動きを再現できる.
 (インバースキネマティクス(逆運動学)は手先の位置から階層を逆にたどる手法である.)
 

2.ロボットアームを作る.


  


 







        コード1 robotarm.frm
 

'Form1上にPicture1及びCommand1を配置する.
Dim m_hGLRC&
Dim rz As Single

Private Sub Form_Initialize()
    Initialize
    ViewSet 50, Picture1.ScaleWidth / Picture1.ScaleHeight, 1, 100
End Sub

Private Sub Picture1_Paint()
    Draw
End Sub

Private Sub Command1_Click()
    rz = rz + 2
    Debug.Print rz
    Draw
End Sub

Private Function Initialize() As Boolean
    Dim pfd As PIXELFORMATDESCRIPTOR
    Dim R&
    Picture1.ScaleMode = vbPixels
    glutInitDisplayMode GLUT_SINGLE Or GLUT_RGBA
    R = ChoosePixelFormat(Picture1.hDC, pfd)
    If R = 0 Then
        MsgBox "ChoosePixelFormat failed"
        Exit Function
    End If
    R = SetPixelFormat(Picture1.hDC, R, pfd)
    m_hGLRC = wglCreateContext(Picture1.hDC)
    wglMakeCurrent Picture1.hDC, m_hGLRC
    Initialize = True
End Function

Private Sub Form_Unload(Cancel As Integer)
    If m_hGLRC <> 0 Then
        wglMakeCurrent 0, 0
        wglDeleteContext m_hGLRC
    End If
End Sub

Private Sub ViewSet(fov As Single, aspect As Single, near As Single, far As Single)
    glMatrixMode GL_PROJECTION
    glLoadIdentity
    gluPerspective fov, aspect, near, far
    glViewport 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
    glMatrixMode GL_MODELVIEW
End Sub

Public Sub Draw()
    Dim n As Integer
    glClearColor 0, 0, 0, 0
    glClear GL_COLOR_BUFFER_BIT
    glColor3f 1#, 1#, 1#
    glLoadIdentity
    glTranslatef 0#, 0#, -5#
    drawAxisGlobal
    glRotatef rz, 0, 0, 1
    glPushMatrix
        glTranslatef 0, 0.5, 0
        glScalef 0.2, 1, 0.2
        glutWireCube 1
    glPopMatrix
    drawAxis
    glTranslatef 0, 1, 0
    glRotatef rz, 0, 0, 1
    drawAxis
    glPushMatrix
        glTranslatef 0, 0.5, 0
        glScalef 0.2, 1, 0.2
        glutWireCube 1
    glPopMatrix
    glFlush
End Sub

Public Sub drawAxis()
    glColor3f 1, 0, 0
    glBegin GL_LINES
        glVertex3f -1, 0, 0
        glVertex3f 1, 0, 0
    glEnd
    glBegin GL_LINES
        glVertex3f 0, -1, 0
        glVertex3f 0, 1, 0
    glEnd
    glBegin GL_LINES
        glVertex3f 0, 0, -1
        glVertex3f 0, 0, 1
    glEnd
    glColor3f 1, 1, 1
End Sub

Public Sub drawAxisGlobal()
    glBegin GL_LINES
        glVertex3f -10, 0, 0
        glVertex3f 10, 0, 0
    glEnd
    glBegin GL_LINES
        glVertex3f 0, -10, 0
        glVertex3f 0, 10, 0
    glEnd
End Sub


 
(問題)
1.robotarm.frmを基に,ロボットアームに対し,次の制御ができるようプログラムを改良しなさい
 1)逆方向にも動く(動きを戻す)ようにする.
 2)Y軸まわりの回転ができるようにする.

2.4つの関節をもつロボットアームを作成しなさい.

3.ロボットアームを応用し,自分で制御できるロボットを作成しなさい.

 

(補足)タイマーコントロールを用いたアニメーション
 タイマーコントロールを用いて,ボタンを押しているときだけ動くようにするには,
 以下のような方法があります.
 1)タイマーコントロールを貼り付ける.(Timer1)
 2)Command1_Clickサブルーチンは削除
 3)以下を追加する.

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Timer1.Enabled = True
End Sub

Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Timer1.Enabled = False
End Sub

Private Sub Form_Load()
    Timer1.Enabled = False
    Timer1.Interval = 10  'タイマーの間隔をミリ秒単位で設定(実際にはミリ秒単位での精度はない)
End Sub
Private Sub Timer1_Timer()
    rz = rz + 5
    Draw
End Sub