chrono Core - 驱动 原文链接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一维轴驱动强制位移/位置ChLinkMotorRotationAngleChLinkMotorLinearPositionChShaftsMotorPosition强制速度ChLinkMotorRotationSpeedChLinkMotorLinearSpeedChShaftsMotorSpeed施加载荷扭矩/力ChLinkMotorRotationTorqueChLinkMotorLinearForceChShaftsMotorLoad对接1D传动系统ChLinkMotorRotationDrivelineChLinkMotorLinearDriveline-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传动链耦合驱动DrivelineChLinkMotorRotationDriveline旋转/ChLinkMotorLinearDriveline直线3D刚体运动 ↔ 一维ChShaft轴系双向力能耦合。一维轴变速箱、飞轮、齿轮组的运动直接带动3D构件同时3D负载反作用力/力矩反向反馈至一维轴区别于普通ChFunction驱动驱动普通驱动由时序信号强制运动Driveline驱动遵循功率守恒、动力学双向耦合⚠️ 注意一维轴ChShaft务必设置合理转动惯量小惯量高速易引发求解震荡、仿真发散。4. 一维1D轴系驱动ChShaftsMotor系列仅作用在两个一维轴ChShaft之间用于传动系统变速箱、发动机、齿轮传动动力学建模控制逻辑同3D驱动位置/转速/扭矩三类驱动。5. Python代码示例importpychronoaschronoimportpychrono.irrlichtasirr#1. 创建仿真系统syschrono.ChSystemNSC()sys.SetGravitationalAcceleration(chrono.ChVector3d(0,-9.81,0))#2. 创建地面曲柄rodchrono.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)crankchrono.ChBodyEasyBox(1.5,0.4,0.4,7800,True,True)crank.SetPos(chrono.ChVector3d(0,20.2,0))#曲柄位置比杆长多0.2crank.GetVisualShape(0).SetColor(chrono.ChColor(0.8,0.2,0.2))sys.Add(crank)#3. 创建恒转速旋转电机rot_motorchrono.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_speedchrono.ChFunctionConst(2*chrono.CH_PI)rot_motor.SetSpeedFunction(func_speed)sys.Add(rot_motor)#4. 可视化appirr.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 syschrono.ChSystemNSC()sys.SetGravitationalAcceleration(chrono.ChVector3d(0,-9.81,0))materialchrono.ChContactMaterialNSC()poschrono.ChVector3d(0,0,2)# 固定基座guidechrono.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)sliderchrono.ChBodyEasyBox(0.4,0.2,0.5,1000,True,True,material)slider.SetPos(poschrono.ChVector3d(0,0.3,0))slider.GetVisualShape(0).SetColor(chrono.ChColor(0.6,0.6,0.0))sys.Add(slider)motor6chrono.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)motor6setpointchrono.ChFunctionSine(1,2,0.0,0.0)# Let the motor use this motion function:motor6.SetMotionFunction(motor6setpoint)#vischrono.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 示例2importpychronoaschronoimportpychrono.irrlichtasirr#1. 创建仿真系统syschrono.ChSystemNSC()sys.SetGravitationalAcceleration(chrono.ChVector3d(0,-9.81,0))#2. 创建圆柱体 - 地面 和 圆柱体 - 旋转groundchrono.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)crankchrono.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_motorchrono.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_speedchrono.ChFunctionConst(2*chrono.CH_PI)rot_motor.SetSpeedFunction(func_speed)sys.Add(rot_motor)#4. 可视化appirr.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. 术语对照表英文中文释义ChLinkMotorRotation3D旋转驱动驱动基类ChLinkMotorLinear3D直线驱动驱动基类Driveline Motor传动链耦合驱动3D↔1D轴双向耦合ChShaft一维动力学轴传动系统ChFunction时序函数位置/速度/扭矩随时间变化SpindleConstraint旋转驱动导向约束类型GuideConstraint直线驱动导向约束类型Wrapped Angle单圈限幅转角Unwrapped Angle累计无缠绕总转角拓展补充ChFunction常用子类ChFunctionConst常数恒速/恒力/恒扭矩ChFunctionSine正弦周期运动往复、摆动ChFunctionRamp斜坡线性变化匀加速ChFunctionRecorder自定义离散时序曲线实测数据导入需要我补充Driveline轴系耦合驱动一维齿轮传动的PyChrono示例吗