基于PyQt5和pyqtgraph的软体机械臂实时3D仿真系统,支持GPU加速、实时可视化、状态保存和图片导出功能。
本项目实现了一个完整的软体机械臂仿真系统,包含:
- 实时3D可视化(基于PyQt5和pyqtgraph)
- 正运动学计算(支持PCC模型)
- GPU/CPU双模式计算
- 弯曲角度控制(0-180度)
- 弯曲方向控制(0°, 120°, 240°)
- 状态固定和恢复功能
- 自动视角优化(避免重叠)
- 图片导出功能
- 基于pyqtgraph的OpenGL渲染
- 实时显示机械臂的3D结构
- 白色背景,便于观察
- 平滑的动画效果(60 FPS)
- 弯曲角度控制:0-180度(滑块精度0.1度)
- 弯曲方向控制:0°, 120°, 240°(对应三个电机方向)
- 任意段选择:可以选择1-14号气囊中的任意一个作为柔性段
- 固定状态:可以固定任意段的弯曲状态
- 状态恢复:切换柔性段时自动恢复之前的状态
- 清除功能:可以清除所有固定状态
- 一键保存当前状态为图片
- 自动优化视角,避免重叠
- 使用气囊中心位置作为坐标点
- XYZ轴统一分度,便于观察
- GPU加速:支持CUDA加速计算(需要PyTorch和CUDA)
- 平滑动画:插值实现平滑过渡效果
- 高效渲染:优化的网格生成和渲染
pip install PyQt5
pip install pyqtgraph
pip install numpy
pip install matplotlibpip install torch
# 需要CUDA支持(如果使用GPU)pip install PyQt5 pyqtgraph numpy matplotlib torchpython pyqt5_simulator.py-
选择柔性段:
- 在"柔性段选择"下拉框中选择要控制的段(1-14号气囊)
-
调整弯曲角度:
- 使用"弯曲角度 θ"滑块调整角度(0-180度)
- 实时显示当前角度值
-
调整弯曲方向:
- 在"弯曲方向 φ"下拉框中选择方向(0°, 120°, 240°)
-
固定状态:
- 点击"固定当前状态"按钮,固定当前段的弯曲状态
- 固定后,该段会保持当前弯曲角度和方向
-
保存图片:
- 点击"保存图片"按钮
- 选择保存路径
- 系统会自动优化视角并生成图片
-
其他功能:
- 重置:重置所有状态
- 随机配置:随机生成一个配置
- 清除所有固定:清除所有固定状态
右侧控制面板显示:
- 当前柔性段编号
- 弯曲角度(度)
- 曲率(1/m)
- 弯曲方向(度)
- 末端执行器位置(X, Y, Z,单位:cm)
pythonProject/
├── pyqt5_simulator.py # 主仿真器(PyQt5界面)
├── unified_model.py # 统一模型(正运动学、GPU支持)
├── arm_parameters.py # 机械臂物理参数
├── arm_visualizer.py # 3D可视化工具(网格生成)
├── space_definition.py # 空间定义(关节空间、任务空间、驱动空间)
├── visualization.py # 2D可视化工具(matplotlib)
├── simple_image_generator.py # 简化图片生成器(保存图片)
├── test_model.py # 模型测试脚本
└── README.md # 本文件
主仿真器,包含:
- PyQt5用户界面
- 实时3D显示(pyqtgraph OpenGL)
- 控制面板(滑块、按钮等)
- 状态管理
统一模型,包含:
- 正运动学计算(PCC模型)
- GPU/CPU支持
- 关节空间到任务空间转换
物理参数配置:
- 气囊尺寸(1-6号:10cm高,7-14号:5cm高)
- 材料参数(刚度等,PVC材质)
- 驱动参数(电机方向、绳半径等)
3D可视化工具:
- 圆柱体网格生成
- 弯曲圆柱体网格生成(带压缩效果)
- 平滑连接处理
图片生成器:
- 简化的3D可视化
- 自动视角优化
- 统一坐标轴分度
- Z轴:向下为正(机械臂从顶部向下延伸)
- X轴:指向0°方向
- Y轴:指向90°方向
- 顶部固定:机械臂顶部位置固定
- 底部初始位置:底部初始在(0, 0, 0)
使用Piecewise Constant Curvature(分段恒定曲率)模型:
- 每个柔性段视为恒定曲率的圆弧
- 曲率:
kappa = theta / L(theta为弯曲角度,L为段长度) - 弯曲方向:相对于电机方向的局部坐标系
弯曲时的压缩效果:
- 压缩方式:高度压缩(不是半径压缩)
- 压缩范围:0.6-0.85(内侧压缩更多)
- 内外层:内外层都压缩,内侧压缩更多
保存图片时自动优化视角:
- 测试多个视角组合(仰角10-60度,方位角0-360度)
- 计算投影后的点对距离
- 检测重叠(距离小于阈值)
- 选择重叠最少、分布最均匀的视角
from pyqt5_simulator import SoftArmSimulator
from PyQt5.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
simulator = SoftArmSimulator()
simulator.show()
sys.exit(app.exec_())from unified_model import UnifiedSoftArmModel
import numpy as np
# 创建模型(使用GPU)
model = UnifiedSoftArmModel(use_gpu=True)
# 设置柔性段(4号气囊)
model.set_flexible_segment(4)
# 设置弯曲角度和方向
# 弯曲角度:60度 -> 曲率 = 60度 / 段长度
segment_length = model.arm_params.segment_heights[3] # 4号气囊长度
bending_angle_rad = np.radians(60)
kappa = bending_angle_rad / segment_length
phi = np.radians(0) # 0度方向
model.set_joint_state(kappa, phi)
# 计算正运动学
T_EE, T_list = model.forward_kinematics()
print(f"末端位置: {T_EE[:3, 3]}")from simple_image_generator import generate_simple_arm_image_from_simulator
# 从仿真器生成图片
output_path = generate_simple_arm_image_from_simulator(simulator, 'output.png')
print(f"图片已保存到: {output_path}")- 气囊数量:14个圆环形气囊
- 1-6号气囊:高度10cm,外径5cm,内径3cm
- 7-14号气囊:高度5cm,外径5cm,内径3cm
- 总长度:1.0m
- 电机方向:0°, 120°, 240°(三个方向)
- 绳半径:5cm
- 弯曲角度范围:0-180度
- 弯曲方向:0°, 120°, 240°(离散)
- 曲率范围:0-50.0 1/m(根据段长度自动计算)
-
GPU加速:
- 需要安装PyTorch和CUDA
- 如果没有GPU或CUDA不可用,会自动切换到CPU模式
-
坐标系:
- 内部计算使用Z轴向下为正
- 显示时已翻转,便于观察
-
固定状态:
- 固定状态会保存在内存中
- 切换柔性段时会自动恢复固定状态
-
图片保存:
- 图片使用matplotlib生成
- 自动优化视角,避免重叠
- 使用气囊中心位置作为坐标点
A: 确保安装了PyTorch和CUDA,程序会自动检测并使用GPU。
A: 图片使用气囊中心位置,而显示使用段端点。两者略有差异是正常的。
A: 修改simple_image_generator.py中的find_best_view_angle函数参数。
A: 修改arm_parameters.py中的ArmParameters类。
- 开发环境:Python 3.11
- 主要框架:PyQt5, pyqtgraph
- 计算引擎:NumPy, PyTorch (可选)
- 可视化:pyqtgraph (OpenGL), matplotlib
本项目仅供学习和研究使用。
- 支持弯曲角度控制(0-180度)
- 自动视角优化
- 统一坐标轴分度
- 使用气囊中心位置生成图片
- 顶部固定,底部初始位置在(0,0,0)
如有问题或建议,请通过项目仓库提交Issue。