mirror of
https://github.com/davisking/dlib.git
synced 2024-11-01 10:14:53 +08:00
Added initial version of model predictive control example program.
This commit is contained in:
parent
c9d60d98fa
commit
52f3e558a4
@ -71,6 +71,7 @@ add_example(max_cost_assignment_ex)
|
||||
add_example(member_function_pointer_ex)
|
||||
add_example(mlp_ex)
|
||||
add_example(model_selection_ex)
|
||||
add_example(mpc_ex)
|
||||
add_example(multiclass_classification_ex)
|
||||
add_example(multithreaded_object_ex)
|
||||
add_example(object_detector_advanced_ex)
|
||||
|
89
examples/mpc_ex.cpp
Normal file
89
examples/mpc_ex.cpp
Normal file
@ -0,0 +1,89 @@
|
||||
// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <dlib/gui_widgets.h>
|
||||
#include <dlib/control.h>
|
||||
#include <dlib/image_transforms.h>
|
||||
|
||||
|
||||
using namespace std;
|
||||
using namespace dlib;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
int main()
|
||||
{
|
||||
// state is x, y, x_vel, y_vel
|
||||
matrix<double,4,4> A;
|
||||
A = 1, 0, 1, 0,
|
||||
0, 1, 0, 1,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1;
|
||||
|
||||
matrix<double,4,2> B;
|
||||
B = 0, 0,
|
||||
0, 0,
|
||||
1, 0,
|
||||
0, 1;
|
||||
|
||||
matrix<double,4,1> C;
|
||||
C = 0,
|
||||
0,
|
||||
0,
|
||||
0.1;
|
||||
|
||||
matrix<double,4,1> Q;
|
||||
Q = 1, 1, 0, 0;
|
||||
|
||||
matrix<double,2,1> R, lower, upper;
|
||||
R = 1, 1;
|
||||
lower = -0.5, -0.5;
|
||||
upper = 0.5, 0.5;
|
||||
|
||||
mpc<4,2,30> controller(A,B,C,Q,R,lower,upper);
|
||||
|
||||
dlib::rand rnd;
|
||||
matrix<double,4,1> target;
|
||||
target = rnd.get_random_double()*400,rnd.get_random_double()*400,0,0;
|
||||
controller.set_target(target);
|
||||
|
||||
|
||||
matrix<double,4,1> current_state;
|
||||
current_state = 200,200,0,0;
|
||||
|
||||
matrix<rgb_pixel> world(400,400);
|
||||
image_window win;
|
||||
|
||||
int iter = 0;
|
||||
while(!win.is_closed())
|
||||
{
|
||||
matrix<double,2,1> action = controller(current_state);
|
||||
|
||||
assign_all_pixels(world, rgb_pixel(255,255,255));
|
||||
const dpoint pos = point(current_state(0),current_state(1));
|
||||
const dpoint goal = point(target(0),target(1));
|
||||
draw_solid_circle(world, goal, 9, rgb_pixel(100,255,100));
|
||||
draw_solid_circle(world, pos, 7, 0);
|
||||
draw_line(world, pos, pos-50*action, rgb_pixel(255,0,0));
|
||||
|
||||
current_state = A*current_state + B*action + C;
|
||||
win.set_image(world);
|
||||
dlib::sleep(100);
|
||||
|
||||
// Every 100 iterations change the target to some other random location.
|
||||
++iter;
|
||||
if (iter > 100)
|
||||
{
|
||||
iter = 0;
|
||||
target = rnd.get_random_double()*400,rnd.get_random_double()*400,0,0;
|
||||
controller.set_target(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user