Project 1 (Mini Project on Vehicle Direction Detection
Live Batch 2
Project-01 - Vehicle Direction Determination
General Overview:
- Identifying the vehicle's direction is one of the important & diverse features in Autonomous driving & Advanced Driver Assistance Features.
- This particular sub-feature of identifying the direction of the vehicle is basically determining the direction the vehicle is taking based on the camera input.
- The camera reads the road signs & stores them in its memory with unique values for the left turn, right turn & straight drive. Depending on the direction it is taking, the driver is given a final indication of whether he is driving in the recommended direction or not.
- Vehicle Direction Determination can also be coupled alongside features like GPS systems to identify whether the vehicle is reaching its destination in an optimized manner. This sub-feature can also be used along with Lane Detection, Highway Warning, Ramp Entry / Exit in Wrong Way Detection etc.
The objective of the Mini Project:
- Development of MATLAB Simulink model as per requirement.
- Tag the requirements to the Simulink model; tagging requirements 1 & requirement 2 to their corresponding subsystems is fine.
- MBD-compliant changes, Data Dictionary creation & code generation is added advantage, and that is not the scope of this project.
- If choosing code generation, the Storage class for Input signals: ImportedExtern; the Storage class for Output signal: Export to File; the Storage class for local signals: localizable; the Storage class for calibration signals: Const.
- Choose sample time for all signals as 0.01s
Requirement - 1:
- Steering wheel input as yaw rate (Signal name: SteeringWheel_YawDegreeInput) is the input for this system.
- This is compared against 3 angular values, one each for the left turn, right turn & straight drive (Calibration Values: Right_Turn_AngularLimit, Left_Turn_AngularLimit, Straight_Drive_Steering_Angle) to say which specific direction the steering wheel is turning towards.
- Use switch blocks to compare & develop this requirement. Keep this requirement in a subsystem & the output of this requirement is a local signal (Signal Name: Vehicle_Turn_Status).
Requirement – 2:
- Keep this requirement as a separate subsystem. Inputs to this requirement are a local signal from requirement 1 (Signal Name: Vehicle_Turn_Status) & an input signal from the camera (Signal Name: CameraInput_RoadSign), which confirms the occurrence of a road sign.
- Signal Vehicle_Turn_Status is compared against calibration values (Calibration Values: RightTurn_RoadSign, LeftTurn_RoadSign, Straight_RoadSign), if each of them is found equal, then each of the three corresponding outputs is compared against the camera input signal,
- Using a logical operator block, only one among them is finally given as the output signal (Signal Name: Vehicle_Direction_Indicator).
Signals & Calibration Data List:
|
Signal / Calibration Name |
Signal Type |
Data Type |
Dimension |
Min |
Max |
Initial Value |
Units |
|
SteeringWheel_YawDegreeInput |
Input |
Int16 |
1 |
-180 |
180 |
- |
Deg |
|
CameraInput_RoadSign |
Input |
Boolean |
1 |
0 |
1 |
- |
- |
|
Vehicle_Turn_Status |
Local |
Int16 |
1 |
-180 |
180 |
- |
Deg |
|
Right_Turn_AngularLimit |
Calibration |
Int16 |
[1 1] |
-180 |
180 |
30 |
Deg |
|
Left_Turn_AngularLimit |
Calibration |
Int16 |
[1 1] |
-180 |
180 |
-120 |
Deg |
|
Straight_Drive_Steering_Angle |
Calibration |
Int16 |
[1 1] |
-180 |
180 |
0 |
Deg |
|
RightTurn_RoadSign |
Calibration |
Int16 |
[1 1] |
-180 |
180 |
30 |
|
|
LeftTurn_RoadSign |
Calibration |
Int16 |
[1 1] |
-180 |
180 |
-120 |
|
|
Straight_RoadSign |
Calibration |
Int16 |
[1 1] |
-180 |
180 |
0 |
|
|
Vehicle_Direction_Indicator |
Output |
Boolean |
1 |
0 |
1 |
- |
- |
Step1: Matlab model creation as per the requirement


Requirement 1:

Requirement 2:

Step2: MBD-compliant changes
Solver type Fixed step discreet (no continuous) with a sample time of 0.01 s.
Step 3: SLDD Creation

Step 4: Model Advisor Check

Step 5: Code Generation Using the S function
/*
* File: Vehicle_Direction_Indicator.c
*
* Code generated for Simulink model 'Vehicle_Direction_Indicator'.
*
* Model version : 1.12
* Simulink Coder version : 9.7 (R2022a) 13-Nov-2021
* C/C++ source code generated on : Mon Oct 24 07:53:52 2022
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "Vehicle_Direction_Indicator.h"
#include "rtwtypes.h"
/* External inputs (root inport signals with default storage) */
ExtU_Vehicle_Direction_Indica_T Vehicle_Direction_Indicator_U;
/* External outputs (root outports fed by signals with default storage) */
ExtY_Vehicle_Direction_Indica_T Vehicle_Direction_Indicator_Y;
/* Real-time model */
static RT_MODEL_Vehicle_Direction_In_T Vehicle_Direction_Indicator_M_;
RT_MODEL_Vehicle_Direction_In_T *const Vehicle_Direction_Indicator_M =
&Vehicle_Direction_Indicator_M_;
/* Model step function */
void Vehicle_Direction_Indicator_step(void)
{
int16_T rtb_Switch;
/* Outputs for Atomic SubSystem: '<Root>/Vehicle_Direction_Detection' */
/* Switch: '<S2>/Switch' incorporates:
* Constant: '<S2>/Left_Turn_AngularLimit'
* Constant: '<S2>/Right_Turn_AngularLimit'
* Constant: '<S4>/Constant'
* Constant: '<S5>/Constant'
* Inport: '<Root>/SteeringWheel_YawDegreeInput'
* RelationalOperator: '<S4>/Compare'
* RelationalOperator: '<S5>/Compare'
* Switch: '<S2>/Switch1'
*/
if (Vehicle_Direction_Indicator_U.SteeringWheel_YawDegreeInput > 0.0) {
rtb_Switch = 30;
} else if (Vehicle_Direction_Indicator_U.SteeringWheel_YawDegreeInput == 0.0)
{
/* Switch: '<S2>/Switch1' incorporates:
* Constant: '<S2>/Straight_Drive_Steering_Angle'
*/
rtb_Switch = 0;
} else {
rtb_Switch = -120;
}
/* End of Switch: '<S2>/Switch' */
/* Outport: '<Root>/Vehicle_Direction_Indicator' incorporates:
* Constant: '<S3>/LeftTurn_RoadSign1'
* Constant: '<S3>/RightTurn_RoadSign'
* Constant: '<S3>/Straight_RoadSign'
* Inport: '<Root>/CameraInput_RoadSign'
* Logic: '<S3>/Logical Operator'
* Logic: '<S3>/Logical Operator1'
* Logic: '<S3>/Logical Operator2'
* RelationalOperator: '<S3>/Relational Operator'
* RelationalOperator: '<S3>/Relational Operator1'
* RelationalOperator: '<S3>/Relational Operator2'
*/
Vehicle_Direction_Indicator_Y.Vehicle_Direction_Indicator_o[0] = ((rtb_Switch ==
30) && Vehicle_Direction_Indicator_U.CameraInput_RoadSign);
Vehicle_Direction_Indicator_Y.Vehicle_Direction_Indicator_o[1] = ((rtb_Switch ==
-120) && Vehicle_Direction_Indicator_U.CameraInput_RoadSign);
Vehicle_Direction_Indicator_Y.Vehicle_Direction_Indicator_o[2] = ((rtb_Switch ==
0) && Vehicle_Direction_Indicator_U.CameraInput_RoadSign);
/* End of Outputs for SubSystem: '<Root>/Vehicle_Direction_Detection' */
}
/* Model initialize function */
void Vehicle_Direction_Indicator_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void Vehicle_Direction_Indicator_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/
Step 6: Requirement Tagging
Taggings are provided with the attached word file.
Conclusion:
The Vehicle direction detection model is implemented as per the requirements and the results are shown. All the files are attached for further verification.