资讯动态

chrono车辆仿真_07_转向系统详解

发布时间:2026/10/16 2:01:50 来源:尧图企业网站定制
转向系统详解一、转向系统的角色控制行驶方向1.1 转向器的作用驾驶员打方向盘 │ ▼ 转向器 (ChSteering) │ ├── 将方向盘转角转换为转向连杆位移 ├── 通过转向横拉杆推动转向节进而推转车轮 └── 产生阿克曼转向几何内外轮转角不同转向器与悬架的配合转向器方向盘→转向连杆 │ │ m_link转向连杆刚体 │ ┌────┴────┐ │ │ 左转向横拉杆 右转向横拉杆 │ │ ▼ ▼ 左悬架转向节 右悬架转向节 (tierod连接) (tierod连接) │ │ ▼ ▼ 左轮偏转角度 右轮偏转角度二、ChSteering 基类2.1 类定义classCH_VEHICLE_APIChSteering:publicChPart{public:virtual~ChSteering();/// 获取转向子系统相对于车架参考系的变换constChFrameGetRelTransform()const{returnm_rel_xform;}/// 获取转向连杆刚体悬架横拉杆的连接点std::shared_ptrChBodyGetSteeringLink()const{returnm_link;}/// 初始化安装到车架的指定位置和方向virtualvoidInitialize(std::shared_ptrChChassischassis,constChVector3dlocation,constChQuaternionrotation);/// 同步根据驾驶员转向输入 [-1, 1] 更新状态/// steering -1 → 向右打满/// steering 0 → 直行/// steering 1 → 向左打满virtualvoidSynchronize(doubletime,constDriverInputsdriver_inputs)0;/// 约束违反日志virtualvoidLogConstraintViolations(){}protected:ChSteering(conststd::stringname);ChFramem_rel_xform;/// 相对于车架的位置和方向std::shared_ptrChBodym_link;/// 转向连杆刚体};2.2 继承体系ChPart │ ChSteering (抽象基类) / | \ ChPitmanArm ChRackPinion ChRotaryArm (循环球式) (齿轮齿条式) (旋转臂式) │ ChPitmanArmShafts (带弹性转向柱)2.3 四种转向类型对比类型机械结构适用车型转向连杆类型RackPinion齿轮齿条轿车、SUVHMMWV棱柱副滑动的齿条PitmanArm循环球转向垂臂卡车、越野车垂臂连杆的刚体PitmanArmShafts带弹性转向柱的循环球高保真卡车垂臂连杆ChShaft弹性柱RotaryArm旋转臂军用/特种车辆单个旋转臂三、ChRackPinion — 齿轮齿条转向3.1 设计原理齿轮齿条是乘用车中最常见的转向机构。Chrono 的实现做了简化——不显式建模 pinion 齿轮而是直接通过 pinion 半径将方向盘转角转换为齿条位移。方向盘转角 θ │ │ displacement θ × pinion_radius ▼ 齿条棱柱副沿 Y 轴滑动 │ ├── 左端 → 左横拉杆 → 左转向节 └── 右端 → 右横拉杆 → 右转向节3.2 内部结构![[Pasted image 20260528160125.png|410]]3.3 关键源码解析InitializevoidChRackPinion::Initialize(std::shared_ptrChChassischassis,constChVector3dlocation,constChQuaternionrotation){ChSteering::Initialize(chassis,location,rotation);m_parentchassis;m_rel_xformChFrame(location,rotation);autochassisBodychassis-GetBody();autosyschassisBody-GetSystem();// 将转向参考系转换到绝对坐标系ChFramesteering_to_abs(location,rotation);steering_to_abs.ConcatenatePreTransformation(chassisBody-GetFrameRefToAbs());// 创建齿条刚体位置在 steering link COM 处ChVector3d link_possteering_to_abs.TransformPointLocalToParent(ChVector3d(0,GetSteeringLinkCOM(),0));ChQuaternionlink_rotsteering_to_abs.GetRot().GetNormalized();m_linkchrono_types::make_sharedChBody();m_link-SetName(m_name_link);m_link-SetPos(link_pos);m_link-SetRot(link_rot);m_link-SetMass(GetSteeringLinkMass());m_link-SetInertiaXX(GetSteeringLinkInertia());sys-AddBody(m_link);// 棱柱副齿条只能沿 Y 轴平移相对于车架m_prismaticchrono_types::make_sharedChLinkLockPrismatic();m_prismatic-SetName(m_name_prismatic);m_prismatic-Initialize(chassisBody,m_link,ChFrame(link_pos,link_rot*QuatFromAngleX(CH_PI_2)));sys-AddLink(m_prismatic);// 线性作动器驱动齿条沿 Y 轴移动// offset 必须大于最大齿条位移避免奇点doubleoffset2;ChVector3d pt1link_pos;ChVector3d pt2link_pos-offset*link_rot.GetAxisY();m_actuatorchrono_types::make_sharedChLinkLockLinActuator();m_actuator-SetName(m_name_actuator);m_actuator-Initialize(chassisBody,m_link,false,ChFrame(pt1,link_rot),ChFrame(pt2,link_rot));m_actuator-SetDistanceOffset(offset);sys-AddLink(m_actuator);}SynchronizevoidChRackPinion::Synchronize(doubletime,constDriverInputsdriver_inputs){// 方向盘转角 → pinion 转角 → 齿条位移doubleangledriver_inputs.m_steering*GetMaxAngle();doubledisplangle*GetPinionRadius();// s r × θ// 设置线性作动器的目标位移if(autofunstd::dynamic_pointer_castChFunctionConst(m_actuator-GetActuatorFunction()))fun-SetConstant(displ);}物理关系方向盘转角 θ (由 driver_inputs.m_steering 换算) │ θ steering × GetMaxAngle() ▼ Pinion 线位移 s θ × r_pinion │ ▼ 齿条位移 s (沿 Y 轴) │ ▼ 横拉杆 → 转向节 → 车轮偏转3.4 JSON 配置示例{Name:HMMWV Rack-Pinion Steering,Type:Steering,Template:RackPinion,Steering Link:{Mass:9.072,COM:0,Inertia:[1,1,1],Radius:0.03,Length:0.896},Pinion:{Radius:0.1,Maximum Angle (deg):50}}JSON 字段含义Steering Link.Mass齿条质量 (kg)Steering Link.COM齿条质心 Y 向偏移 (m)Steering Link.Inertia齿条转动惯量 (kg·m²)Steering Link.Radius可视化半径 (m)Steering Link.Length齿条长度 (m)Pinion.Radiuspinion 齿轮半径 (m)Pinion.Maximum Angle最大方向盘转角 (°)四、ChPitmanArm — 循环球式转向基础版4.1 设计原理Pitman Arm转向垂臂是卡车/越野车中常见的转向机构。方向盘转动通过转向器循环球带动 Pitman 臂摆动再通过转向连杆推动车轮。方向盘 → 转向器 → Pitman 臂绕 Z 轴旋转 │ 万向节 (Universal Joint) │ 转向连杆 (Steering Link) │ │ 横拉杆左 横拉杆右 │ │ 左转向节 右转向节4.2 内部结构![[Pasted image 20260528160521.png]]4.3 关键源码解析Initialize创建 3 个刚体 3 个约束// ① 转向连杆 (Steering Link)m_link → ChBody连接到横拉杆// ② Pitman 臂 (Pitman Arm)m_arm → ChBody旋转推动连杆// ③ 约束m_revolute →ChLinkMotorRotationAngle(Pitman臂↔车架由电机驱动)m_universal →ChLinkUniversal(Pitman臂↔转向连杆)m_revsph →ChLinkRevoluteSpherical(转向连杆↔车架带惰性连杆)SynchronizevoidChPitmanArm::Synchronize(doubletime,constDriverInputsdriver_inputs){// 设置旋转电机的目标角度autofunstd::static_pointer_castChFunctionSetpoint(m_revolute-GetAngleFunction());fun-SetSetpoint(getMaxAngle()*driver_inputs.m_steering,time);}方向盘转角直接作为 Pitman 臂绕 Z 轴旋转的角度输入。4.4 硬点Hardpoint设计ChPitmanArm 使用 8 个硬点定义完整的转向机构几何硬点编号 名称 说明 ───────────────────────────────────────────────── STEERINGLINK 转向连杆 COM 转向连杆质心位置 PITMANARM Pitman 臂 COM 垂臂质心位置 REV 旋转副位置 Pitman 臂与车架连接点 UNIV 万向节位置 Pitman 臂与转向连杆连接点 REVSPH_R 回转副位置 惰性连杆的车架端 REVSPH_S 球铰位置 惰性连杆的转向连杆端 TIEROD_PA 横拉杆 Pitman 侧 左侧横拉杆连接点 TIEROD_IA 横拉杆惰性臂侧 右侧横拉杆连接点4.5 JSON 配置示例{Name:HMMWV Pitman Arm Steering,Type:Steering,Template:PitmanArm,Steering Link:{Mass:3.681,COM:[0.129,0,0],Moments of Inertia:[0.252,0.00233,0.254],Products of Inertia:[0,0,0],Radius:0.03},Pitman Arm:{Mass:1.605,COM:[0.064,0.249,0],Moments of Inertia:[0.00638,0.00756,0.00150],Radius:0.02},Revolute Joint:{Location:[0,0.249,0],Direction:[0,0,1],Maximum Angle (deg):30},Universal Joint:{Location:[0.129,0.249,0],Direction Arm:[0,0,1],Direction Link:[1,0,0]},Revolute-Spherical Joint:{Location Chassis:[0,-0.325,0],Location Link:[0.129,-0.325,0],Direction:[0,0,1]},Tierod Locations:{Pitman Side:[0.195,0.448,0.035],Idler Side:[0.195,-0.448,0.035]}}五、ChPitmanArmShafts — 带弹性转向柱的循环球式转向5.1 设计原理在 ChPitmanArm 的基础上增加了弹性转向柱的建模。方向盘与 Pitman 臂之间的转向柱不再是刚性连接而是通过一组 ChShaft 弹簧/齿轮模拟真实转向柱的扭转弹性。5.2 转向柱内部结构ChShaft 传动链全部沿 REV_AXIS 方向 方向盘侧 Pitman 臂侧 │ │ ▼ ▼ m_shaft_C ──▶ m_shaft_C1 ──▶ m_shaft_A1 ──▶ m_shaft_A ──▶ Pitman 臂 (固定到车架) (电机) (弹簧或齿轮) (减速齿轮) (ChShaftBodyRotation) │ ┌───────────────┼───────────────┐ │ 刚性模式 │ 弹性模式 │ │ ChShaftsGear │ ChShafts- │ │ (传动比1) │ TorsionSpring │ └───────────────┴───────────────┘5.3 各 ChShaft 的职责元素类型作用m_shaft_CChShaft (fixed)固定端代表方向盘侧壳体m_shaft_C1ChShaft由电机驱动代表方向盘转角输入m_shaft_A1ChShaft与 m_shaft_C1 通过弹簧/刚性连接m_shaft_AChShaft通过减速齿轮连接到 m_shaft_A1m_shaft_motorChShaftsMotorPosition在 m_shaft_C 和 m_shaft_C1 之间施加转角m_shaft_gearChShaftsGear减速齿轮比getGearRatio 1m_shaft_armChShaftBodyRotation将 m_shaft_A 连接到 Pitman 臂刚体m_rigid_connectionChShaftsGear刚性连接刚性转向柱模式m_spring_connectionChShaftsTorsionSpring弹性连接弹性转向柱模式5.4 关键源码解析Initialize4 个 ChShaft 5 个 ChShaftsCouple// 创建 4 个传动轴全部绕 REV_AXIS 方向m_shaft_Cmake_sharedChShaft();// 固定端m_shaft_C-SetInertia(inertia);m_shaft_C-SetFixed(true);// 固定到车架sys-AddShaft(m_shaft_C);m_shaft_C1make_sharedChShaft();// 电机输出端m_shaft_C1-SetInertia(inertia);sys-AddShaft(m_shaft_C1);m_shaft_A1make_sharedChShaft();// 齿轮输入端m_shaft_A1-SetInertia(inertia);sys-AddShaft(m_shaft_A1);m_shaft_Amake_sharedChShaft();// 齿轮输出端→Pitman臂m_shaft_A-SetInertia(inertia);sys-AddShaft(m_shaft_A);// 电机在 m_shaft_C 和 m_shaft_C1 之间施加转角m_shaft_motormake_sharedChShaftsMotorPosition();m_shaft_motor-Initialize(m_shaft_C,m_shaft_C1);// 电机的目标转角在 Synchronize 中设置// 减速齿轮m_shaft_A → m_shaft_A1 (减速)m_shaft_gearmake_sharedChShaftsGear();m_shaft_gear-SetTransmissionRatio(getGearRatio());// 1m_shaft_gear-Initialize(m_shaft_A,m_shaft_A1);sys-Add(m_shaft_gear);// 连接 m_shaft_A 到 Pitman 臂刚体m_shaft_armmake_sharedChShaftBodyRotation();m_shaft_arm-Initialize(m_shaft_A,m_arm,dirs[REV_AXIS]);sys-Add(m_shaft_arm);// 连接 m_shaft_A1 和 m_shaft_C1刚性或弹性if(m_rigid){m_rigid_connectionmake_sharedChShaftsGear();m_rigid_connection-SetTransmissionRatio(1.0);m_rigid_connection-Initialize(m_shaft_A1,m_shaft_C1);sys-Add(m_rigid_connection);}else{m_spring_connectionmake_sharedChShaftsTorsionSpring();m_spring_connection-SetTorsionalStiffness(getSteeringCompliance());m_spring_connection-Initialize(m_shaft_C1,m_shaft_A1);sys-Add(m_spring_connection);}SynchronizevoidChPitmanArmShafts::Synchronize(doubletime,constDriverInputsdriver_inputs){autofunstd::static_pointer_castChFunctionSetpoint(m_shaft_motor-GetPositionFunction());fun-SetSetpoint(getMaxAngle()*driver_inputs.m_steering,time);}5.5 弹性转向柱的效果刚性模式 (m_rigid true) 方向盘转角 Pitman 臂转角立即传递无延迟 弹性模式 (m_rigid false) 方向盘转角 → 扭转弹簧 → Pitman 臂转角 效果方向盘先转动弹簧扭转蓄力Pitman 臂逐渐跟随 模拟真实车辆的转向柱扭转弹性和路感5.6 转向刚性/弹性对比特性刚性列 (RigidColumn)弹性列 (CompliantColumn)连接方式ChShaftsGear (ratio1)ChShaftsTorsionSpring传递转角直接传递力矩通过弹簧传递响应无延迟有延迟弹性变形适用实时仿真高保真/路感研究六、ChRotaryArm — 旋转臂转向6.1 设计原理最简单的转向形式——一个旋转臂直接推动横拉杆。常用于军用车辆和特种车辆。方向盘 → 旋转臂绕 Z 轴旋转 │ 横拉杆 │ 转向节 → 车轮偏转6.2 内部结构只有一个刚体既是旋转臂又是转向连杆通过旋转电机副连接到车架// 唯一的刚体m_link 旋转臂m_linkmake_sharedChBody();m_link-SetPos(0.5*(points[ARM_L]points[ARM_C]));// 唯一的约束旋转电机副m_revolutemake_sharedChLinkMotorRotationAngle();m_revolute-Initialize(chassisBody,m_link,...);6.3 硬点设计只有 2 个硬点硬点说明ARM_C旋转臂与车架的连接点旋转副位置ARM_L旋转臂与横拉杆的连接点6.4 SynchronizevoidChRotaryArm::Synchronize(doubletime,constDriverInputsdriver_inputs){autofunstd::static_pointer_castChFunctionSetpoint(m_revolute-GetAngleFunction());fun-SetSetpoint(getMaxAngle()*driver_inputs.m_steering,time);}与 ChPitmanArm 完全相同——设置旋转电机的目标角度。七、转向器与悬架的连接7.1 GetSteeringLink()转向器与悬架的接口是通过ChSteering::GetSteeringLink()暴露的转向连杆刚体。悬架的横拉杆tierod在初始化时获取转向连杆的句柄ChRackPinion::Initialize() └── m_link 齿条刚体 (ChBody) ChWheeledVehicle::Initialize() └── 对每个车轴 m_axles[i]-m_suspension-Initialize(..., m_steering-GetSteeringLink(), ...)悬架通过横拉杆约束通常是 ChLinkDistance 或 ChLinkRevoluteSpherical将转向连杆的运动传递到转向节spindle最终实现车轮偏转。7.2 转向角对车轮的实际影响方向盘输入 → 转向连杆位移 → 横拉杆推动 → 转向节旋转 → 车轮偏转 这个传递路径在悬架侧完成转向器侧只负责产生转向连杆的位移/旋转。八、四种转向模型对比维度RackPinionPitmanArmPitmanArmShaftsRotaryArm机构类型齿轮齿条循环球垂臂循环球弹性柱旋转臂连杆运动棱柱副平移万向节空间运动万向节空间运动旋转副旋转转向柱模型无无ChShaft 弹性柱无刚体数量1齿条2垂臂连杆2 4 ChShaft1旋转臂约束数量2棱柱副作动器3电机万向回转球铰3 5 ChShaftCouple1电机副自由度1Y 平移1垂臂旋转1垂臂旋转弹性延迟1旋转质量惯性齿条质量垂臂连杆质量垂臂连杆4轴臂质量JSON 复杂度简单7 参数复杂25 参数复杂 弹性参数简单5 参数适用场景乘用车实时仿真卡车/越野车高保真卡车特种车辆九、API 总结9.1 ChSteering 基类 APIAPI说明GetRelTransform()转向器相对车架的变换矩阵GetSteeringLink()获取转向连杆刚体悬架连接点Initialize(chassis, location, rotation)在车架指定位置安装转向器Synchronize(time, driver_inputs)根据驾驶员转向输入更新状态LogConstraintViolations()输出约束违反情况9.2 ChRackPinion 特有 APIAPI说明GetSteeringLinkMass()齿条质量GetSteeringLinkInertia()齿条转动惯量GetSteeringLinkCOM()齿条质心 Y 偏置GetPinionRadius()Pinion 齿轮半径GetMaxAngle()最大方向盘转角9.3 ChPitmanArm 特有 APIAPI说明getLocation(PointId)返回指定硬点的位置getDirection(DirectionId)返回指定方向向量getSteeringLinkMass()/getPitmanArmMass()质量getMaxAngle()最大旋转角度9.4 ChPitmanArmShafts 特有 APIAPI说明getGearRatio()转向柱减速比 (1)getSteeringCompliance()转向柱扭转刚度 (N·m/rad)getSteeringColumnInertia()转向柱转动惯量GetShaftInformation(...)调试用——输出所有 ChShaft 的状态9.5 ChRotaryArm 特有 APIAPI说明getPitmanArmMass()旋转臂质量getPitmanArmInertia*()旋转臂转动惯量getMaxAngle()最大旋转角度十、设计哲学总结Chrono 转向系统的四条核心原则 1. 硬点驱动几何 所有转向机构的几何由硬点 (Hardpoint) 定义 派生类通过纯虚函数 getLocation()/getDirection() 提供几何数据。 2. 电机驱动转向 所有转向类型都使用 ChLinkMotorRotationAngle 或 ChLinkLockLinActuator 作为驱动源将驾驶员输入 直接转换为约束运动不涉及液压助力或 EPS 建模。 3. 转向器只负责转向连杆 转向器只生成转向连杆m_link的位移/旋转 横拉杆到车轮的传递路径在悬架侧完成。 4. 弹性可选 PitmanArmShafts 提供了可选的弹性转向柱建模 通过在方向盘和 Pitman 臂之间插入扭转弹簧实现 适用于需要研究转向路感的场景。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑