原文链接:https://api.projectchrono.org/motors.htm
目录
- 3D旋转驱动驱动
- 3D直线驱动驱动
- 3D传动链耦合驱动
- 一维1D轴系驱动
- 原生示例
- PyChrono实战代码
- 术语对照表
总述
驱动(Motor)用于约束两刚体/构件间相对运动,分为3D旋转驱动ChLinkMotorRotation、3D直线驱动ChLinkMotorLinear、一维轴系ChShaft驱动三大类,可驱动3D刚体ChBody或一维轴ChShaft。
ChLinkMotorRotation、ChLinkMotorLinear均继承自ChLinkMate,继承ChLinkMate全部特性:求解高效、无行程限位;- 绝大多数驱动通过
ChFunction时序函数(位置/速度/扭矩随时间变化)实现运动控制。
驱动分类总表
| 控制方式 | 3D旋转驱动 | 3D直线驱动 | 1D一维轴驱动 |
|---|---|---|---|
| 强制位移/位置 | ChLinkMotorRotationAngle | ChLinkMotorLinearPosition | ChShaftsMotorPosition |
| 强制速度 | ChLinkMotorRotationSpeed | ChLinkMotorLinearSpeed | ChShaftsMotorSpeed |
| 施加载荷(扭矩/力) | ChLinkMotorRotationTorque | ChLinkMotorLinearForce | ChShaftsMotorLoad |
| 对接1D传动系统 | ChLinkMotorRotationDriveline | ChLinkMotorLinearDriveline | - |
1. 3D旋转驱动驱动
ChLinkMotorRotation基类派生,约束基准为驱动局部Z轴,角度单位:弧度rad,用于两空间刚体间旋转驱动(如回转伺服驱动)。
关键特性
- 支持多圈连续旋转,两种角度读取:
GetMotorAngle():无缠绕总转角(累计多圈)GetMotorAngleWrapped():缠绕转角(-π~π单圈)
- 运动参数读取:转角
GetMotorAngle()、角速度GetMotorAngleDt()、角加速度GetMotorAngleDt2(); - 默认内置回转副约束(绕Z轴转动,锁死X/Y平移、RX/RY旋转),可通过
SetSpindleConstraint()修改约束类型:枚举参数 约束说明 FREE 不对驱动轴线做任何约束,仅施加驱动 REVOLUTE 默认配置,全约束X/Y平移、RX/RY旋转,仅Z轴回转 CYLINDRICAL 约束X/Y平移、RX/RY旋转,Z轴可转+可沿Z滑移(圆柱副) OLDHAM 仅约束RX/RY旋转,X/Y/Z全自由(十字滑块联轴器)
驱动通用创建四步流程
- 实例化对应驱动类;
Initialize(刚体A,刚体B,驱动局部坐标系ChFramed)绑定两构件;- 将驱动加入仿真系统
sys.Add(驱动); - 绑定
ChFunction时序函数(位置/速度/扭矩曲线)。
2. 3D直线驱动驱动
ChLinkMotorLinear基类派生,驱动方向固定为驱动局部Z轴,实现两构件沿Z轴直线位移驱动(直线推杆、电动缸)。
关键特性
- 位移参数读取:行程
GetMotorPos()、速度GetMotorPosDt()、加速度GetMotorPosDt2(); - 默认内置移动副约束,锁死X/Y平移、RX/RY/RZ旋转,仅Z轴可控位移;通过
SetGuideConstraint()修改约束:枚举参数 约束说明 FREE 无导向约束,仅施加轴向驱动力 PRISMATIC 默认,全约束除Z向平移外所有自由度(标准移动副) SPHERICAL 约束X/Y平移,三轴旋转全部自由(球铰+单轴驱动)
3. 3D传动链耦合驱动(Driveline)
ChLinkMotorRotationDriveline(旋转)/ChLinkMotorLinearDriveline(直线):3D刚体运动 ↔ 一维ChShaft轴系双向力能耦合。
- 一维轴(变速箱、飞轮、齿轮组)的运动直接带动3D构件;同时3D负载反作用力/力矩反向反馈至一维轴;
- 区别于普通
ChFunction驱动驱动:普通驱动由时序信号强制运动,Driveline驱动遵循功率守恒、动力学双向耦合; - ⚠️ 注意:一维轴
ChShaft务必设置合理转动惯量,小惯量+高速易引发求解震荡、仿真发散。
4. 一维1D轴系驱动
ChShaftsMotor系列,仅作用在两个一维轴ChShaft之间,用于传动系统(变速箱、发动机、齿轮传动)动力学建模,控制逻辑同3D驱动:位置/转速/扭矩三类驱动。
5. Python代码示例
importpychronoaschronoimportpychrono.irrlichtasirr#1. 创建仿真系统sys=chrono.ChSystemNSC()sys.SetGravitationalAcceleration(chrono.ChVector3d(0,-9.81,0))#2. 创建地面+曲柄rod=chrono.ChBodyEasyCylinder(chrono.ChAxis_Y,0.2,2,2500,True,True)rod.GetVisualShape(0).SetColor(chrono.ChColor(0.2,0.2,0.8))rod.SetFixed(True)rod.SetPos(chrono.ChVector3d(0,1,0))sys.Add(rod)crank=chrono.ChBodyEasyBox(1.5,0.4,0.4,7800,True,True)crank.SetPos(chrono.ChVector3d(0,2+0.2,0))#曲柄位置比杆长多0.2crank.GetVisualShape(0).SetColor(chrono.ChColor(0.8,0.2,0.2))sys.Add(crank)#3. 创建恒转速旋转电机rot_motor=chrono.ChLinkMotorRotationSpeed()#初始化:曲柄、大地,铰接点(0,2,0) ,旋转轴为X轴rot_motor.Initialize(crank,rod,chrono.ChFramed(chrono.ChVector3d(0,2,0),chrono.QuatFromAngleX(chrono.CH_PI_2)))#设置恒定角速度:2π rad/s(每秒一圈)func_speed=chrono.ChFunctionConst(2*chrono.CH_PI)rot_motor.SetSpeedFunction(func_speed)sys.Add(rot_motor)#4. 可视化app=irr.ChVisualSystemIrrlicht()app.SetWindowSize(1024,768)app.SetWindowTitle('Motor')app.Initialize()app.AddSkyBox()app.AddCamera(chrono.ChVector3d(6,4,-8))app.AddTypicalLights()app.AttachSystem(sys)app.BindAll()#仿真循环whileapp.Run():app.BeginScene()app.Render()app.EndScene()sys.DoStepDynamics(0.01)6. 其他示例
6.1 示例1:正弦位移直线驱动(往复滑块)
importpychronoaschronoimportpychrono.irrlichtasirrimportnumpyasnp sys=chrono.ChSystemNSC()sys.SetGravitationalAcceleration(chrono.ChVector3d(0,-9.81,0))material=chrono.ChContactMaterialNSC()pos=chrono.ChVector3d(0,0,2)# 固定基座guide=chrono.ChBodyEasyBox(4,0.3,0.6,1000,True,True,material)guide.SetPos(pos)guide.SetFixed(True)guide.GetVisualShape(0).SetTexture(chrono.GetChronoDataFile("textures/blue.png"))sys.Add(guide)slider=chrono.ChBodyEasyBox(0.4,0.2,0.5,1000,True,True,material)slider.SetPos(pos+chrono.ChVector3d(0,0.3,0))slider.GetVisualShape(0).SetColor(chrono.ChColor(0.6,0.6,0.0))sys.Add(slider)motor6=chrono.ChLinkMotorLinearPosition()# Connect the guide and the slider and add the motor to the sys:motor6.Initialize(slider,# body A (slave)guide,# body B (master)chrono.ChFramed(pos,chrono.Q_ROTATE_Z_TO_X))# motor frame, in abs. coordssys.Add(motor6)motor6setpoint=chrono.ChFunctionSine(1,2,0.0,0.0)# Let the motor use this motion function:motor6.SetMotionFunction(motor6setpoint)#vis=chrono.irrlicht.ChVisualSystemIrrlicht()vis.AttachSystem(sys)vis.SetWindowSize(1024,768)vis.SetWindowTitle('Motors demo')vis.Initialize()vis.AddLogo(chrono.GetChronoDataFile('logo_chrono_alpha.png'))vis.AddSkyBox()vis.AddCamera(chrono.ChVector3d(1,3,-7))vis.AddTypicalLights()vis.AddLightWithShadow(chrono.ChVector3d(20.0,35.0,-25.0),chrono.ChVector3d(0,0,0),55,20,55,35,512)whilevis.Run():vis.BeginScene()vis.Render()vis.EndScene()sys.DoStepDynamics(5e-3)6.2 示例2:
importpychronoaschronoimportpychrono.irrlichtasirr#1. 创建仿真系统sys=chrono.ChSystemNSC()sys.SetGravitationalAcceleration(chrono.ChVector3d(0,-9.81,0))#2. 创建圆柱体 - 地面 和 圆柱体 - 旋转ground=chrono.ChBodyEasyCylinder(chrono.ChAxis_X,0.3,3,2500,True,True)ground.SetFixed(True)ground.SetPos(chrono.ChVector3d(0,0,0))ground.GetVisualShape(0).SetTexture(chrono.GetChronoDataFile("textures/blue.png"))sys.Add(ground)crank=chrono.ChBodyEasyCylinder(chrono.ChAxis_X,0.3,2,2500,True,True)crank.SetPos(chrono.ChVector3d(0,0.6,0))crank.GetVisualShape(0).SetColor(chrono.ChColor(0.6,0.6,0.0))crank.SetFixed(False)sys.Add(crank)#3. 创建恒转速旋转驱动rot_motor=chrono.ChLinkMotorRotationSpeed()#初始化: 圆柱体 - 旋转、圆柱体 - 地面,铰接点(0,0,0),旋转轴(0,0,0)rot_motor.Initialize(crank,ground,chrono.ChFramed(chrono.ChVector3d(0,0,0),chrono.Q_ROTATE_Z_TO_X))#设置恒定角速度:2π rad/s(每秒一圈)func_speed=chrono.ChFunctionConst(2*chrono.CH_PI)rot_motor.SetSpeedFunction(func_speed)sys.Add(rot_motor)#4. 可视化app=irr.ChVisualSystemIrrlicht()app.AddSkyBox()app.SetWindowSize(1024,768)app.Initialize()app.AddCamera(chrono.ChVector3d(6,4,-8))app.AddTypicalLights()app.AttachSystem(sys)#仿真循环whileapp.Run():app.BeginScene()app.Render()app.EndScene()sys.DoStepDynamics(0.01)7. 术语对照表
| 英文 | 中文释义 |
|---|---|
| ChLinkMotorRotation | 3D旋转驱动驱动基类 |
| ChLinkMotorLinear | 3D直线驱动驱动基类 |
| Driveline Motor | 传动链耦合驱动(3D↔1D轴双向耦合) |
| ChShaft | 一维动力学轴(传动系统) |
| ChFunction | 时序函数(位置/速度/扭矩随时间变化) |
| SpindleConstraint | 旋转驱动导向约束类型 |
| GuideConstraint | 直线驱动导向约束类型 |
| Wrapped Angle | 单圈限幅转角 |
| Unwrapped Angle | 累计无缠绕总转角 |
拓展补充
ChFunction常用子类:ChFunctionConst:常数(恒速/恒力/恒扭矩)ChFunctionSine:正弦周期运动(往复、摆动)ChFunctionRamp:斜坡线性变化(匀加速)ChFunctionRecorder:自定义离散时序曲线(实测数据导入)
需要我补充Driveline轴系耦合驱动+一维齿轮传动的PyChrono示例吗?