@Pigmon
2017-11-02T09:13:39.000000Z
字数 2316
阅读 1296
PanoSim
[2017.11.01] 更新关于 S-Function 中 C 程序的说明
[2017.10.31]
在 PanoSim 默认实验的 Simulink 动力学模拟系统中,默认实验是最简单的模型——只有一辆车,并且除了正向行驶外没有其他控制功能。
输入信号是[车辆模型]输出的[Body, Brake, Steer, Power]这4个 Group 中的信号,即车身状态,制动状态,转向状态和动力状态;
输出信号是对车辆的控制信息,包括油门,挡位,制动,转向等。
图1 简化的车辆与驾驶员模型的关系。驾驶员模型通过输出对车辆的控制信号(油门,挡位,制动,转向)控制车辆,进而改变车辆状态;车辆计算完毕自身状态后,将其输出给驾驶员模型,驾驶员参考当前车辆状态再决定对车辆的控制内容,这样循环。
图2 默认控制模型的整体图
如图2所示,整个模型中,有2个子模型,分别是[DriverModel1]和[veh_1]。
- [veh_1]的输出为其自身的状态(Body, Brake, Steer, Power等),输出信号给 Goto 模块 [VehicleOut1];
- [DriverModel1]左侧的 From 模块接收 {Goto 模块 [VehicleOut1]} 的信号,以达成 图1 所示的循环;
- 在 2 个子模型之间,是[DriverModel1]将控制车辆的信号输出给[veh_1]
Signal | Group | 说明 |
---|---|---|
Chassi_States.q0 | Body_Out_Bus | 簧载质量重心位移X |
Chassi_States.q1 | Body_Out_Bus | 簧载质量重心位移Y |
Chassi_States.q3 | Body_Out_Bus | 簧载质量重心横摆角 |
Chassi_States.u0 | Body_Out_Bus | 车体坐标系簧载质量重心速度 |
Chassi_States.u1 | Body_Out_Bus | 车体坐标系簧载质量重心速度 |
Chassi_States.u3 | Body_Out_Bus | 车体坐标系簧载质量重心横摆角速度 |
Wheel_LF.u1 | Body_Out_Bus | 左前车轮旋转速度 |
Wheel_RF.u1 | Body_Out_Bus | 右前车轮旋转速度 |
Wheel_LR.u1 | Body_Out_Bus | 左后车轮旋转速度 |
Wheel_RR.u1 | Body_Out_Bus | 右后车轮旋转速度 |
Powertrain_Output.av_eng | Power_Out_Bus | 发动机曲轴角加速度 |
Powertrain_Output.aa_eng | Power_Out_Bus | 发动机曲轴角速度 |
Steer_Kinematics.str_sus_f | Steer_Out_Bus | 前轮转向K性 |
Steer_Kinematics.str_sus_r | Steer_Out_Bus | 后轮转向K性 |
Brake_Output.turn_off | Brake_Out_Bus | 制动压力不输出 |
Signal | Group | 说明 |
---|---|---|
throttle | Driver_Powertrian | 油门 |
modetr | Driver_Powertrian | 档位标志 |
geartr | Driver_Powertrian | 手动挡时,决定档位 |
pcon_bk | Driver_Brake | 制动主缸压力 |
drstr_drv | Driver_Steer | 方向盘转角 |
[DriverModel1]是图2中代表驾驶员的子模型。其总体结构比较简单,将输入的车辆状态信号进行筛选(BusSelector),重组(BusCreator)传递给子模型[Driver]。
子模型[Driver]负责计算控制车辆的输出信号,计算完成后,经过 BusCreator 汇总,成为整个[DriverModel1]的输出。
图3 [DriverModel1]模型,其中有子模型 [Driver]
图3 是 [DriverModel1] 的整体图,[DriverModel1] 是整个实验模型的一个子模型。在[DriverModel1] 中还有一个子模型[Driver],它们的关系如下图:
图4 [DriverModel1]相关的层次结构
[Driver] 模型是整个驾驶员控制模型 [DriverModel1] 的核心内容,也是 [DriverModel1] 中唯一的不止是数据的筛选分割重组功能的子模型,其核心控制逻辑是由 S Function 模块 [Driver Model] 实现的;[Driver Model] 的运算过程由 C 语言程序 [panoDriver_sfun.c] 实现。
图5 [Driver] 模型实际图;除了 S Function [Driver Model] 以外,其他模块都是信号的传输集散相关的。
PanoSim 开发方定义的函数以 mdl 开头,放在 S-Function 的 Callback 函数中,封装所有的控制实现。其实现方式,内容不对用户开放。
extern void mdlInitializeSizes_Driver(SimStruct *S);
extern void mdlStart_Driver(SimStruct *S);
extern void mdlOutputs_Driver(SimStruct *S, int_T tid);
extern void mdlTerminate_Driver(SimStruct *S);
在目前 PanoSim 提供的所有例子工程中,相同模块的 S-Function 的程序都是一样的。
而因为无法知道,也无法修改这些 PanoSim 自定义函数,而且 PanoSim 底层接口更是不可见(即无法自行开发功能替代这些封装了的函数),所以无法在 PanoSim 现有的控制类 S-Function 中修改核心控制逻辑。