VTK与Python实现机械臂三维模型可视化详解

本文介绍如何使用Python和VTK创建机械臂的三维可视化系统,包括模型设计、坐标系设置、STL文件导出以及通过Python代码实现2自由度机械臂的动态仿真。此外,还展示了MFC上位机监控平台的实现。
摘要由CSDN通过智能技术生成

三维可视化系统的建立依赖于三维图形平台, 如 OpenGL、VTK、OGRE、OSG等,
传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成了开发难度大、 周期长等问题。VTK、
ORGE、OSG等平台使用封装更好的函数简化了开发过程。下面将使用Python与VTK进行机器人上位机监控界面的快速原型开发。

完整的上位机程序需要有三维显示模块、机器人信息监测模块(位置/角度/速度/电量/温度/错误信息…)、通信模块(串口/USB/WIFI/蓝牙…)、控制模块等功能模块。三维显示模块主要用于实时显示机器人的姿态(或位置)信息。比如机器人上肢手臂抬起,程序界面中的虚拟机器人也会同时进行同样的动作。三维显示模块也可以用于对机器人进行控制,实现良好的人机交互。比如在三维图像界面中可以点击拾取机器人某一关节,拖拽部件(肢体)控制真实的机器人完成同样的运动。Aldebaran
Robotics的图形化编程软件Choregraphe可以完成上述的一些功能对NAO机器人进行控制。

对于简单的模型可以自己编写函数进行创建,但这种方法做出来的模型过于简单不够逼真。因此可以先在SolidWorks、Blender、3DMax、Maya、Rhino等三维设计软件中建立好模型,然后导出为通用的三维文件格式,再使用VTK将其读入并进行渲染。

在SolidWorks等三维设计软件中设计好机器人的大臂(upperarm)和小臂(forearm),然后创建装配体如下图所示。在将装配体导出为STL文件前需要注意几点:

  1. 当从外界读入STL类型的模型时,其会按照它内部的坐标位置进行显示,因此它的位置和大小是确定的。为了以后的定位以及移动、旋转等操作的方便,需要先在SolidWorks中创建一个坐标系。如下图所示,坐标系建立在大臂关节中心点。
  2. 如果将装配体整体输出为一个STL文件,则导入VTK后无法控制零部件进行相对运动。因此,需要将装配体各可动部件分别导出。

在SolidWorks的另存为STL对话框中,点开输出选项卡,如下图所示。注意之前提到的几点:如果勾选“在单一文件中保存装配体的所有零部件”则会将整个装配体导出为一个STL文件,否则就是分别命名的两个STL文件;输出坐标系下拉列表中选择之前创建的坐标系1,并勾选“不要转换STL输出数据到正的坐标空间”。

下面的Python代码简单实现了一个2自由度机械臂的三维仿真,可以拖动滑块或按键盘上的方向键控制肩关节或肘关节运动。当然程序还存在一些问题有待完善…

    #!/usr/bin/env python
     import vtk
    import math
    from vtk.util.colors import *
    filenames = ["upperarm.stl","forearm.stl"]
    dt = 1.0    # degree step in rotation
    angle = [0, 0] # shoulder and elbow joint angle
    renWin = vtk.vtkRenderWindow()
    assembly = vtk.vtkAssembly()
    slider_shoulder = vtk.vtkSliderRepresentation2D()
    slider_elbow = vtk.vtkSliderRepresentation2D()
    actor = list() # the list of links
    # Customize vtkInteractorStyleTrackballCamera 
    class MyInteractor(vtk.vtkInteractorStyleTrackballCamera):
      def __init__(self,parent=None):
        self.AddObserver("CharEvent",self.OnCharEvent)
        self.AddObserver("KeyPressEvent",self.OnKeyPressEvent)
      # Override the default key operations which currently handle trackball or joystick styles is provided
      # OnChar is triggered when an ASCII key is pressed. Some basic key presses are handled here 
      def OnCharEvent(self,obj,event):
        pass
      def OnKeyPressEvent(self,obj,event):
        global angle
        # Get the compound key strokes for the event
        key = self.GetInteractor().GetKeySym()
        # Output the key that was pressed
        #print "Pressed: " , key
        # Handle an arrow key
        if(key == "Left"):
          actor[1].RotateY(-dt)      
        if(key == "Right"):
          actor[1].RotateY(dt)      
        if(key == "Up"):
          assembly.RotateY(-dt)
          angle[0] += dt
          if angle[0
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中使用VTK可视化三维数组的步骤与C++类似。以下是一些简单的步骤: 1. 导入必要的VTK库和模块。 ``` import vtk import numpy as np ``` 2. 创建一个numpy数组并将其转换为vtkImageData对象。 ``` dataArray = np.random.rand(xDim, yDim, zDim) # 创建一个随机数据的三维数组 imageData = vtk.vtkImageData() imageData.SetDimensions(xDim, yDim, zDim) # 设置vtkImageData对象的维度 imageData.SetOrigin(0, 0, 0) # 设置vtkImageData对象的原点 imageData.SetSpacing(1, 1, 1) # 设置vtkImageData对象的间距 vtkData = vtk.vtkFloatArray() # 创建vtkFloatArray对象 vtkData.SetNumberOfComponents(1) vtkData.SetNumberOfTuples(xDim * yDim * zDim) for i in range(xDim): for j in range(yDim): for k in range(zDim): value = dataArray[i][j][k] # 从数组中获取数据 vtkData.SetValue(i * yDim * zDim + j * zDim + k, value) # 将数据添加到vtkFloatArray对象中 imageData.GetPointData().SetScalars(vtkData) # 将vtkFloatArray对象添加到vtkImageData对象中 ``` 3. 创建一个vtkImageActor对象并将vtkImageData对象添加到其中。 ``` imageActor = vtk.vtkImageActor() imageActor.SetInputData(imageData) # 设置vtkImageData对象 ``` 4. 创建一个vtkRenderer对象并将vtkImageActor对象添加到其中。 ``` renderer = vtk.vtkRenderer() renderer.AddActor(imageActor) # 添加vtkImageActor对象 ``` 5. 创建一个vtkRenderWindow对象并将vtkRenderer对象添加到其中。 ``` renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) # 添加vtkRenderer对象 ``` 6. 创建一个vtkRenderWindowInteractor对象并将其与vtkRenderWindow对象关联。 ``` interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) # 设置vtkRenderWindow对象 ``` 7. 最后,初始化vtkRenderWindowInteractor对象并进入事件循环。 ``` interactor.Initialize() # 初始化vtkRenderWindowInteractor对象 renderWindow.Render() # 渲染vtkRenderWindow对象 interactor.Start() # 进入事件循环 ``` 以上就是使用VTK可视化三维数组的基本步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值