轮胎系统详解
一、轮胎的本质:车辆与地面的"接口"
1.1 轮胎的双重角色
车辆动力学 ────┬──── 地面相互作用 │ ▼ 轮胎 │ ┌─────────┼─────────┐ │ │ │ 承载重量 传递力 吸收冲击 │ │ │ ▼ ▼ ▼ 垂直力 驱动/制动 侧向力 (Fz) (Fx) (Fy)轮胎是力产生器:
- 输入:车轮位置、速度、地面状态
- 输出:作用在车轮上的力和力矩
1.2 Chrono 轮胎建模层次
Chrono 提供三种层次的轮胎模型:
精度 vs 效率 │ ┌─────────────┼─────────────┐ │ │ │ 刚性轮胎 半经验轮胎 柔性轮胎(FEA) (最快) (平衡) (最精确) │ │ │ ChRigidTire ChFialaTire ChANCFTire 无变形 经验公式 有限元计算 纯碰撞力 TMeasy等 壳单元网格二、轮胎基类 ChTire 解析
2.1 类定义
classCH_VEHICLE_APIChTire:publicChPart{public:// ======== 碰撞检测类型 ========enumclassCollisionType{SINGLE_POINT,// 单点碰撞(最快)FOUR_POINTS,// 四点碰撞(更精确)ENVELOPE// 包络面方法(考虑曲率)};// ======== 参数设置 ========voidSetStepsize(doubleval){m_stepsize=val;}doubleGetStepsize()const{returnm_stepsize;}voidSetCollisionType(CollisionType collision_type){m_collision_type=collision_type;}voidSetPressure(doublepressure){m_pressure=pressure;}doubleGetPressure()const{returnm_pressure;}// ======== 几何属性 ========virtualdoubleGetRadius()const=0;// 轮胎半径virtualdoubleGetWidth()const=0;// 轮胎宽度// ======== 惯性属性 ========virtualdoubleGetTireMass()const=0;virtualChVector3dGetTireInertia()const=0;// ======== 力报告 ========// 全局坐标系下的力和力矩virtualTerrainForceReportTireForce(ChTerrain*terrain)const=0;// 轮胎坐标系下的力和力矩virtualTerrainForceReportTireForceLocal(ChTerrain*terrain,ChCoordsys<>&tire_frame)const=0;// ======== 滑移参数 ========doubleGetSlipAngle()const{returnm_slip_angle;}doubleGetLongitudinalSlip()const{returnm_longitudinal_slip;}doubleGetCamberAngle()const{returnm_camber_angle;}// ======== 其他 ========virtualdoubleGetDeflection()const{return0;}conststd::string&GetMeshFilename()const{returnm_vis_mesh_file;}staticChVector3dEstimateInertia(doubletire_width,doubleaspect_ratio,doublerim_diameter,doubletire_mass,doublet_factor=2);// ======== 初始化和同步 ========virtualvoidInitialize(std::shared_ptr<ChWheel>wheel);virtualvoidSynchronize(doubletime,constChTerrain&terrain){}virtualvoidAdvance(doublestep){}protected:ChTire(conststd::string&name);// ======== 力获取(供车辆内部使用) ========virtualTerrainForceGetTireForce()const=0;// ======== 辅助方法 ========voidCalculateKinematics(constWheelState&wheel_state,constChCoordsys<>&tire_frame);doubleGetOffset()const{returnm_wheel->m_offset;}virtualdoubleGetAddedMass()const=0;virtualChVector3dGetAddedInertia()const=0;