iterative closest points
CEV ICP algorithm library
Loading...
Searching...
No Matches
lidar_view.cpp
Go to the documentation of this file.
1
7#include <cassert>
8#include <cstdlib>
9#include <sdlwrapper/util/logger.h>
10#include <sdlwrapper/util/keyboard.h>
11#include <sdlwrapper/geo/midpoint.h>
12#include "lidar_view.h"
13#include "view_config.h"
14
15#define CIRCLE_RADIUS 3
16
17LidarView::LidarView(std::vector<icp::Vector> source, std::vector<icp::Vector> destination,
18 std::unique_ptr<icp::ICP> icp)
19 : source(source),
20 destination(destination),
21 icp(std::move(icp)),
22 keyboard(false),
23 is_iterating(false),
24 iterations(0) {
25 this->icp->begin(source, destination, icp::RBTransform());
26}
27
28void LidarView::step() {
29 icp->iterate();
30 iterations++;
31}
32
33void LidarView::on_event(const SDL_Event& event) {
34 bool space_before = keyboard.query(SDLK_SPACE);
35 bool d_before = keyboard.query(SDLK_d);
36 bool i_before = keyboard.query(SDLK_i);
37 keyboard.update(event);
38 bool space_after = keyboard.query(SDLK_SPACE);
39 bool d_after = keyboard.query(SDLK_d);
40 bool i_after = keyboard.query(SDLK_i);
41
42 if (!space_before && space_after) {
43 is_iterating = !is_iterating;
44 }
45 if (!i_before && i_after) {
46 step();
47 }
48 if (!d_before && d_after) {
49 std::cerr << "DEBUG PRINT:\n";
50 std::cerr << "icp->current_transform() = " << icp->current_transform().to_string() << '\n';
51 std::cerr << "icp->calculate_cost() = " << icp->calculate_cost() << '\n';
52 std::cerr << "iterations = " << iterations << '\n';
53 }
54}
55
56void LidarView::draw(SDL_Renderer* renderer, [[maybe_unused]] const SDL_Rect* frame,
57 [[maybe_unused]] double dtime) {
59 SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
60 } else {
61 SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
62 }
63 SDL_RenderClear(renderer);
64
65 SDL_SetRenderDrawColor(renderer, 0, 0, 255, SDL_ALPHA_OPAQUE);
66 for (const icp::Vector& point: destination) {
67 SDL_DrawCircle(renderer, view_config::view_scale * point[0] + view_config::x_displace,
69 }
70
71 SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE);
72 for (const icp::Vector& point: source) {
73 icp::Vector result = icp->current_transform().apply_to(point);
74 SDL_DrawCircle(renderer, view_config::view_scale * result[0] + view_config::x_displace,
76 }
77
78 icp::Vector a_cm = icp->current_transform().apply_to(icp::get_centroid(source));
79 SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE);
80 SDL_DrawCircle(renderer, view_config::view_scale * a_cm.x() + view_config::x_displace,
82
83 icp::Vector b_cm = icp::get_centroid(destination);
84 SDL_SetRenderDrawColor(renderer, 0, 0, 255, SDL_ALPHA_OPAQUE);
85 SDL_DrawCircle(renderer, view_config::view_scale * b_cm.x() + view_config::x_displace,
87
88 if (is_iterating) {
89 step();
90 }
91}
void on_event(const SDL_Event &event) override
LidarView(std::vector< icp::Vector > source, std::vector< icp::Vector > destination, std::unique_ptr< icp::ICP > icp)
Constructs a new lidar view visualizing ICP (by method method) on the given instance (source and dest...
void draw(SDL_Renderer *renderer, const SDL_Rect *frame, double dtime) override
#define CIRCLE_RADIUS
Definition driver.h:12
Eigen::Vector2d Vector
Definition geo.h:15
Vector get_centroid(const std::vector< Vector > &points)
Definition geo.cpp:11
double y_displace
double view_scale
bool use_light_mode
double x_displace
Rigid-body transformation.
Definition geo.h:19