Challenge

Project 2 Adaptive Cruise Control

ANSWER : model 

 

Requirement 1– Lead Vehicle:

  • Lead Vehicle is a vehicle which is driving in the road ahead of our drive vehicle. Two input signals (Signal Name: CameraInput_LeadVehicle & RadarInput_LeadVehicle).
  • Ideally sensor fusion techniques will be deployed to process & analyze data from camera & radar. For complexity reasons, let’s not adapt to any such algorithms.
  • We can simply add both the radar & camera inputs & the corresponding output is read as Speed profile output (Signal Name: LeadVehicle_Speed).
  • Speed data of the lead vehicle is critical in implementing the Adaptive Cruise Control algorithm.

 

Requirement 2 – Drive Vehicle:

  • Drive Vehicle is the vehicle driven by the user & this is the vehicle which has ACC algorithm in it.
  • Like the Lead Vehicle, Drive Vehicle algorithm also has 2 input signals (Signal Name: CameraInput_DriveVehicle, RadarInput_DriveVehicle) & one signal coming as an Input to this subsystem (Signal Name: Acceleration_Mode) – three inputs into this requirement in total.
  • Like the above requirement, sensor fusion techniques will also be deployed here, for complexity reasons we are ignoring them.
  • Two output signals come from this subsystem (Signal Name: DriveVehicle_Speed & LeadVehicle_Detected).
  • Signal DriveVehicle_Speed is summation of three input signals mentioned above & LeadVehicle_Detected is renamed from Input Signal RadarInput_DriveVehicle by mere use of Signal Conversion block.

Requirement 3 – Adaptive Cruise Control Algorithm:

  • Adaptive Cruise Control feature has 3 major modes of operation: OFF Mode, STANDBY Mode & ON Mode. This particular requirement has to be implemented as state machine logic in Simulink.
  • The input signals to this state machine system are (Signal Name: Time_Gap, Set_Speed, Set_Gap, CruiseSwitch, SetSwitch).
  • Also, the output signals (Signal Name: DriveVehicle_Speed & LeadVehicle_Detected) from requirement-2 is fed back as an input signal into this state machine block.
  • Additionally, output signal (Signal Name: LeadVehicle_Speed) from requirement-1 is given as an input signal to this state machine block as well.
  • Output from this subsystem is a signal (Signal Name: Acceleration_Mode) which governs the vehicular speed of the drive vehicle which automatically adjusts its speed & velocity to match the lead vehicle.              

  

All the Requirement 3a,b,c in this  block :

  

SLDD : 

 

model advisor :

 

  Generated code:

/*
 * File: MBDMAINPROJECT.c
 *
 * Code generated for Simulink model 'MBDMAINPROJECT'.
 *
 * Model version                  : 1.18
 * Simulink Coder version         : 9.5 (R2021a) 14-Nov-2020
 * C/C++ source code generated on : Sat Apr  8 10:38:36 2023
 *
 * Target selection: ert.tlc
 * Embedded hardware selection: Intel->x86-64 (Windows64)
 * Code generation objectives: Unspecified
 * Validation result: Not run
 */

#include "MBDMAINPROJECT.h"
#include "MBDMAINPROJECT_private.h"

/* Named constants for Chart: '/Chart' */
#define IN_LeadVehicle_Detected_Follow1 ((uint8_T)1U)
#define IN_LeadVehicle_Detected_Resume ((uint8_T)2U)
#define IN_LeadVehicle_Not_Detected_Res ((uint8_T)4U)
#define IN_LeadVehicle_Speed_equal_Set_ ((uint8_T)5U)
#define IN_LeadVehicle_Speed_lessthan_S ((uint8_T)6U)
#define MBDMAINPROJECT_IN_OFF_Mode     ((uint8_T)1U)
#define MBDMAINPROJECT_IN_ON_Mode      ((uint8_T)2U)
#define MBDMAINPROJECT_IN_STANDBY_Mode ((uint8_T)3U)
#define MBDMAINPROJE_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define MB_IN_LeadVehicle_Not_Detected1 ((uint8_T)3U)

/* Block signals (default storage) */
B_MBDMAINPROJECT_T MBDMAINPROJECT_B;

/* Block states (default storage) */
DW_MBDMAINPROJECT_T MBDMAINPROJECT_DW;

/* External inputs (root inport signals with default storage) */
ExtU_MBDMAINPROJECT_T MBDMAINPROJECT_U;

/* Real-time model */
static RT_MODEL_MBDMAINPROJECT_T MBDMAINPROJECT_M_;
RT_MODEL_MBDMAINPROJECT_T *const MBDMAINPROJECT_M = &MBDMAINPROJECT_M_;

/* Model step function */
void MBDMAINPROJECT_step(void)
{
  real_T rtb_Add;
  real_T rtb_Add_f;

  /* Sum: '/Add' incorporates:
   *  Delay: '/Delay'
   *  Inport: '/CameraInput_DriveVehicle'
   *  Inport: '/RadarInput_DriveVehicle'
   */
  rtb_Add = (MBDMAINPROJECT_U.CameraInput_DriveVehicle +
             MBDMAINPROJECT_U.RadarInput_DriveVehicle) +
    MBDMAINPROJECT_B.Acceleration_Mode;

  /* Sum: '/Add' incorporates:
   *  Inport: '/CameraInput_LeadVehicle'
   *  Inport: '/RadarInput_LeadVehicle'
   */
  rtb_Add_f = MBDMAINPROJECT_U.CameraInput_LeadVehicle +
    MBDMAINPROJECT_U.RadarInput_LeadVehicle;

  /* Chart: '/Chart' incorporates:
   *  Inport: '/CruiseSwitch'
   *  Inport: '/RadarInput_DriveVehicle'
   *  Inport: '/SetSwitch'
   *  Inport: '/Set_Gap'
   *  Inport: '/Set_Speed'
   *  Inport: '/Time_Gap'
   */
  if (MBDMAINPROJECT_DW.is_active_c3_MBDMAINPROJECT == 0U) {
    MBDMAINPROJECT_DW.is_active_c3_MBDMAINPROJECT = 1U;
    MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_OFF_Mode;
    MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
  } else {
    switch (MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT) {
     case MBDMAINPROJECT_IN_OFF_Mode:
      MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
      if (MBDMAINPROJECT_U.CruiseSwitch == 1.0) {
        MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_STANDBY_Mode;
        MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
      }
      break;

     case MBDMAINPROJECT_IN_ON_Mode:
      if (MBDMAINPROJECT_U.SetSwitch == 0.0) {
        MBDMAINPROJECT_DW.is_ON_Mode = MBDMAINPROJE_IN_NO_ACTIVE_CHILD;
        MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_STANDBY_Mode;
        MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
      } else if (MBDMAINPROJECT_U.CruiseSwitch == 0.0) {
        MBDMAINPROJECT_DW.is_ON_Mode = MBDMAINPROJE_IN_NO_ACTIVE_CHILD;
        MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_OFF_Mode;
        MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
      } else {
        switch (MBDMAINPROJECT_DW.is_ON_Mode) {
         case IN_LeadVehicle_Detected_Follow1:
          MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
          if (MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) {
            MBDMAINPROJECT_DW.is_ON_Mode = MB_IN_LeadVehicle_Not_Detected1;
          } else if (((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 1.0) &&
                      (rtb_Add_f < MBDMAINPROJECT_U.Set_Speed)) ||
                     (MBDMAINPROJECT_U.Time_Gap < MBDMAINPROJECT_U.Set_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
            MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
          }
          break;

         case IN_LeadVehicle_Detected_Resume:
          MBDMAINPROJECT_B.Acceleration_Mode = 3.0;
          if ((rtb_Add == MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >=
               MBDMAINPROJECT_U.Set_Speed) && (MBDMAINPROJECT_U.Time_Gap >=
               MBDMAINPROJECT_U.Set_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow1;
            MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
          } else if (MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Not_Detected_Res;
            MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
          } else if ((rtb_Add < MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >
                      rtb_Add) && (MBDMAINPROJECT_U.Time_Gap >=
                      MBDMAINPROJECT_U.Set_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_equal_Set_;
            MBDMAINPROJECT_B.Acceleration_Mode = 5.0;
          }
          break;

         case MB_IN_LeadVehicle_Not_Detected1:
          if ((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 1.0) && (rtb_Add ==
               MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >=
               MBDMAINPROJECT_U.Set_Speed) && (MBDMAINPROJECT_U.Time_Gap >=
               MBDMAINPROJECT_U.Set_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow1;
            MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
          } else if (((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 1.0) &&
                      (rtb_Add_f < MBDMAINPROJECT_U.Set_Speed)) ||
                     (MBDMAINPROJECT_U.Time_Gap < MBDMAINPROJECT_U.Set_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
            MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
          }
          break;

         case IN_LeadVehicle_Not_Detected_Res:
          MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
          break;

         case IN_LeadVehicle_Speed_equal_Set_:
          MBDMAINPROJECT_B.Acceleration_Mode = 5.0;
          if ((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) || (rtb_Add <=
               MBDMAINPROJECT_U.Set_Speed)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Not_Detected_Res;
            MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
          } else if (((rtb_Add < MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >
                       rtb_Add)) || (MBDMAINPROJECT_U.Time_Gap >=
                      MBDMAINPROJECT_U.Set_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Resume;
            MBDMAINPROJECT_B.Acceleration_Mode = 3.0;
          } else if (((rtb_Add_f < MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f <
                       rtb_Add)) || (0.75 * MBDMAINPROJECT_U.Set_Gap ==
                      MBDMAINPROJECT_U.Time_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
            MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
          }
          break;

         default:
          /* case IN_LeadVehicle_Speed_lessthan_Set_Speed1: */
          MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
          if ((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) && (rtb_Add ==
               MBDMAINPROJECT_U.Set_Speed)) {
            MBDMAINPROJECT_DW.is_ON_Mode = MB_IN_LeadVehicle_Not_Detected1;
          } else if ((rtb_Add_f * 1.25 >= rtb_Add) && (rtb_Add_f * 0.75 <=
                      rtb_Add) && (rtb_Add < MBDMAINPROJECT_U.Set_Speed) &&
                     (MBDMAINPROJECT_U.Time_Gap <= 1.25 *
                      MBDMAINPROJECT_U.Set_Gap) && (MBDMAINPROJECT_U.Time_Gap >=
                      0.75 * MBDMAINPROJECT_U.Set_Gap)) {
            MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_equal_Set_;
            MBDMAINPROJECT_B.Acceleration_Mode = 5.0;
          }
          break;
        }
      }
      break;

     default:
      /* case IN_STANDBY_Mode: */
      MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
      if (MBDMAINPROJECT_U.SetSwitch == 1.0) {
        MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_ON_Mode;
        MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow1;
        MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
      } else if (MBDMAINPROJECT_U.CruiseSwitch == 0.0) {
        MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_OFF_Mode;
        MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
      }
      break;
    }
  }

  /* End of Chart: '/Chart' */
}

/* Model initialize function */
void MBDMAINPROJECT_initialize(void)
{
  /* (no initialization code required) */
}

/* Model terminate function */
void MBDMAINPROJECT_terminate(void)
{
  /* (no terminate code required) */
}

/*
 * File trailer for generated code.
 *
 * [EOF]
 */
Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.