Determine driving styles of a driver

ZERO = 0
ECONOMIC = 1
NORMAL = 2
AGGRESSIVE = 3
ds_mapping= [ZERO,ECONOMIC,NORMAL,AGGRESSIVE]
for r=0:length(Acceleration)
if(abs(Acceleration(r))<=0.7),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: ZERO\tCLASS: %d',Acceleration(r),ds_mapping(0))
end
for r=1:length(Acceleration)
if(abs(Acceleration(r))>=0.7),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: ECONOMIC\tCLASS: %d',Acceleration(r),ds_mapping(1))
end
if(abs(Acceleration(r))>2.79 && Acceleration (r) <= 3.30),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: NORMAL:\t\tCLASS: %d',Acceleration(r),ds_mapping(2))
end
if(abs(Acceleration (r))>3.63),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: AGGRESSIVE:\tCLASS: %d', Acceleration(r),ds_mapping(3))
end
end
fprintf('\n\n')

8 Comments

Hi @Ben Morgan, What are the driving styles available? Can you list them out?
Okay, we have the problem statement and the code you've written to solve the problem. Please tell us what questions you'd like answered about this code or what difficulties you're experiencing.
At first glance, you do have a problem in your code.
for r=0:length(Acceleration)
if(abs(Acceleration(r))<=0.7),
There's no such thing as element 0, row 0, column 0, etc. of an array in MATLAB. The first element / row / column / page / etc. of an array in MATLAB is 1. So your code will throw an error when it asks for Acceleration(0).
Hi Thanks for the response. I have updated r=1 now.
i now have the code:
ZERO = 0
ECONOMIC = 1
NORMAL = 2
AGGRESSIVE = 3
ds_mapping= [ZERO,ECONOMIC,NORMAL,AGGRESSIVE]
for r=1:length(n)
if(abs(Acceleration(r))<=0.7),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: ZERO\tCLASS: %d',n(r),ds_mapping(0))
end
if(abs(Acceleration(r))>=0.7),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: ECONOMIC\tCLASS: %d',n(r),ds_mapping(1))
end
if(abs(Acceleration(r))>2.79 && Acceleration (r) <= 3.30),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: NORMAL:\t\tCLASS: %d',n(r),ds_mapping(2))
end
if(abs(Acceleration (r))>3.63),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: AGGRESSIVE:\tCLASS: %d', n(r),ds_mapping(3))
end
end
fprintf('\n\n')
end
end
And after executing the code i get.
ZERO =
0
ECONOMIC =
1
NORMAL =
2
AGGRESSIVE =
3
ds_mapping =
0 1 2 3
Array indices must be positive integers or logical values.
With the data we have been provided we need to make a graph that looks exactly like this. I am confident with the labeling, lengend and colours so i do not need help with that. I already have the acceleration data, and the driving style is the absolute value of acceleration then sorted into 4 groups, or "gears" which is where you can see the driving style on the graph. Thank you.
What does driving style ZERO corresponds to? In the problem statement there are three defined driving style.
In MATLAb indices should start from 1 instead of 0.
change ds_mapping(0) to ds_mapping(1) in your code
ZERO = 0
ECONOMIC = 1
NORMAL = 2
AGGRESSIVE = 3
ds_mapping= [ZERO,ECONOMIC,NORMAL,AGGRESSIVE]
for r=1:length(n)
if(abs(Acceleration(r))<=0.7),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: ZERO\tCLASS: %d',n(r),ds_mapping(1))
end
if(abs(Acceleration(r))>=0.7),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: ECONOMIC\tCLASS: %d',n(r),ds_mapping(2))
end
if(abs(Acceleration(r))>2.79 && Acceleration (r) <= 3.30),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: NORMAL:\t\tCLASS: %d',n(r),ds_mapping(3))
end
if(abs(Acceleration (r))>3.63),
fprintf('\n\tAcceleration = %5.2f m/sec^2:\t Driving Style: AGGRESSIVE:\tCLASS: %d', n(r),ds_mapping(4))
end
end
fprintf('\n\n')
end
end
Hi, so driving style 0 would be anything below 0.7. The question only states 3 driving styles, yet the graph we need to plot has 4 different values the driving style can be. 0, 1, 2 and 3.
-I currently have :
for r=1:length(Acceleration)
if (abs(Acceleration(r)) < 0.7)
disp ('0')
end
if (abs(Acceleration(r)) >= 0.7 && abs(Acceleration(r) < 2.79))
disp ('1')
end
if (abs(Acceleration(r)) >= 2.79 && abs(Acceleration(r) < 3.64))
disp ('2')
end
if (abs(Acceleration(r)) >= 3.64)
disp ('3')
end
end
-And this seems to work. All I need to do now is turn this into a variable so I am able to plot it against time on a graph.

Sign in to comment.

Answers (1)

Hi Ben,
As per my understanding, you want to classify the driving system based on the acceleration and the mapping table shared and are facing issues while doing so.
You can achieve the same using the code below, where I'm populating the "ds_mapping" based on the mapping table and then creating a line plot with two different variables on both y-axes of the plot. Please not, as the actual acceleration array was not present, so I have created a random acceleration array.
a = -6.5;
b = 6.5;
timeInterval = 1800;
acceleration = a + (b-a) * rand(1,timeInterval);
ds_mapping = [];
for i=1:timeInterval
if(abs(acceleration(i))<0.7)
ds_mapping = [ds_mapping,0];
elseif(abs(acceleration(i))>=0.7 && abs(acceleration(i))<2.79)
ds_mapping = [ds_mapping,1];
elseif(abs(acceleration(i))>=2.79 && abs(acceleration(i))<3.64)
ds_mapping = [ds_mapping,2];
elseif(abs(acceleration(i))>=3.64)
ds_mapping = [ds_mapping,3];
end
end
figure;
hold on;
title("Acceleration and Driving Style classification");
xlabel("Time(s)");
yyaxis left;
plot(1:timeInterval,acceleration,"Color","blue");
ylabel("Acceleration(ms^2)");
ylim([-6.5 6.5]);
yyaxis right;
plot(1:timeInterval,ds_mapping,"Color","cyan");
ylabel("Driving Style");
ylim([0 3]);
hold off;
I hope it helps!

Categories

Find more on 2-D and 3-D Plots in Help Center and File Exchange

Asked:

on 26 Apr 2022

Answered:

on 6 Feb 2024

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!