Skip to content

Commit 71d9011

Browse files
committed
added line allingment using color sensors, informed compiler of error if statments, bulk compiling option with better flags,
binarry size went from 250kB to 130kB, updated readme about presence of new color sensor
1 parent a0b04dd commit 71d9011

14 files changed

Lines changed: 604 additions & 35 deletions

compile.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sudo docker run --rm -v $(pwd):/src ev3dev-cpp-compiler -mcpu=arm926ej-s -march=armv5te -marm -O3 -funroll-loops -fdata-sections -ffunction-sections -Wall src/main.cpp src/motor.cpp src/position.cpp src/sensor.cpp src/diferential_drive.cpp src/robot.cpp -o main -std=c++14 -lm -pthread -lstdc++fs && scp main robot@10.42.0.3:/home/robot/libc++/
1+
sudo docker run --rm -v $(pwd):/src ev3dev-cpp-compiler -mcpu=arm926ej-s -march=armv5te -marm -O3 -Wl,--gc-sections -fdata-sections -ffunction-sections -Wall -Wextra -Wshadow -Werror=return-type -flto src/mains/main1.cpp src/motor.cpp src/position.cpp src/sensor.cpp src/diferential_drive.cpp src/robot.cpp -o main -std=c++14 -lm -pthread -lstdc++fs && scp main robot@10.42.0.3:/home/robot/libc++/

compile_all.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
sudo docker run --rm -v $(pwd):/src ev3dev-cpp-compiler -mcpu=arm926ej-s -march=armv5te -marm -O3 -Wl,--gc-sections -fdata-sections -ffunction-sections -Wall -Wextra -Wshadow -Werror=return-type -flto src/mains/main1.cpp src/motor.cpp src/position.cpp src/sensor.cpp src/diferential_drive.cpp src/robot.cpp -o main1 -std=c++14 -lm -pthread -lstdc++fs
2+
echo "main1 compiled"
3+
sudo docker run --rm -v $(pwd):/src ev3dev-cpp-compiler -mcpu=arm926ej-s -march=armv5te -marm -O3 -Wl,--gc-sections -fdata-sections -ffunction-sections -Wall -Wextra -Wshadow -Werror=return-type -flto src/mains/main2.cpp src/motor.cpp src/position.cpp src/sensor.cpp src/diferential_drive.cpp src/robot.cpp -o main2 -std=c++14 -lm -pthread -lstdc++fs
4+
echo "main2 compiled"
5+
sudo docker run --rm -v $(pwd):/src ev3dev-cpp-compiler -mcpu=arm926ej-s -march=armv5te -marm -O3 -Wl,--gc-sections -fdata-sections -ffunction-sections -Wall -Wextra -Wshadow -Werror=return-type -flto src/mains/main3.cpp src/motor.cpp src/position.cpp src/sensor.cpp src/diferential_drive.cpp src/robot.cpp -o main3 -std=c++14 -lm -pthread -lstdc++fs
6+
echo "main3 compiled"
7+
sudo docker run --rm -v $(pwd):/src ev3dev-cpp-compiler -mcpu=arm926ej-s -march=armv5te -marm -O3 -Wl,--gc-sections -fdata-sections -ffunction-sections -Wall -Wextra -Wshadow -Werror=return-type -flto src/mains/main4.cpp src/motor.cpp src/position.cpp src/sensor.cpp src/diferential_drive.cpp src/robot.cpp -o main4 -std=c++14 -lm -pthread -lstdc++fs
8+
echo "main4 compiled"
9+
sudo docker run --rm -v $(pwd):/src ev3dev-cpp-compiler -mcpu=arm926ej-s -march=armv5te -marm -O3 -Wl,--gc-sections -fdata-sections -ffunction-sections -Wall -Wextra -Wshadow -Werror=return-type -flto src/mains/main5.cpp src/motor.cpp src/position.cpp src/sensor.cpp src/diferential_drive.cpp src/robot.cpp -o main5 -std=c++14 -lm -pthread -lstdc++fs
10+
echo "main5 compiled"
11+
12+
#scp main robot@10.42.0.3:/home/robot/libc++/

readme.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
### - right arm -> D
1919
## sensor connections
2020
### - gyro -> 1
21-
### - color -> 2
21+
### - color left -> 2
22+
### - color right -> 3
2223
# Positioning
2324
### - angle zero is at Y axis
2425
### - angle is in rad

readme_SK.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
### - práve koleso -> D
1616
## Pripojenie Senzorov
1717
### - gyro -> 1
18-
### - farba -> 2
18+
### - farba lavá -> 2
19+
### - farba pravá -> 3
1920
# Pozicia
2021
### - uhol 0 je na osi Y
2122
### - uhol je v rad

src/diferential_drive.cpp

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,23 @@ void Diferential_drive::track_position(){
7171
}
7272
}
7373

74-
Diferential_drive::Diferential_drive(Motor& p_left_motor, Motor& p_right_motor, Sensor& p_gyro, Sensor& p_color, float p_wheel_base_width, float p_wheel_circumference, bool p_left_motor_inverted, bool p_right_motor_inverted, Position starting_position):
74+
Diferential_drive::Diferential_drive(Motor& p_left_motor, Motor& p_right_motor, Sensor& p_gyro, Sensor& p_color_left, Sensor& p_color_right, float p_wheel_base_width, float p_wheel_circumference, bool p_left_motor_inverted, bool p_right_motor_inverted, Position starting_position):
7575
left_motor(&p_left_motor),
7676
right_motor(&p_right_motor),
7777
left_motor_inverted(p_left_motor_inverted),
7878
right_motor_inverted(p_right_motor_inverted),
7979
gyro(&p_gyro),
80-
color(&p_color),
80+
color_left(&p_color_left),
81+
color_right(&p_color_right),
8182
wheel_base_width(p_wheel_base_width),
8283
wheel_circumference(p_wheel_circumference){
8384

8485
position = starting_position;
8586
left_motor->set_position(100000); // large value so tracking would work with run_direct
8687
right_motor->set_position(100000); // only 6 characters to leave space for \0
8788
gyro->set_mode("GYRO-ANG");
89+
color_left->set_mode("COL-REFLECT");
90+
color_right->set_mode("COL-REFLECT");
8891
tracking_position.store(true);
8992
position_tracker = std::thread(&Diferential_drive::track_position, this);
9093
}
@@ -226,13 +229,48 @@ void Diferential_drive::rotate_to_position(Position target, float precision, int
226229
void Diferential_drive::go_until_reflection(int reflection, bool darker, int speed){
227230
left_motor->run(speed, 10);
228231
right_motor->run(speed, 10);
232+
bool left_motor_stopped = false, right_motor_stopped = false;
233+
229234
while(true){
230-
if((color->get_value(0) < reflection && darker) || (color->get_value(0) > reflection && !darker)){
235+
// handle full sensor disconect is_connected doesnt register disconects
236+
if(__builtin_expect(!color_left->is_connected() && !color_right->is_connected(), 0)){
237+
std::cout << "error in go_until_reflection no color sensor is connected" << std::endl;
238+
std::cerr << "error in go_until_reflection no color sensor is connected" << std::endl;
239+
break;
240+
}
241+
242+
// handle partial disconect
243+
else if(__builtin_expect(!color_left->is_connected(), 0)){
244+
if((color_right->get_value(0) < reflection && darker) || (color_right->get_value(0) > reflection && !darker)){
245+
right_motor->stop("brake");
246+
left_motor->stop("brake");
247+
}
248+
std::cout << "error in go_until_reflection left color sensor is not connected" << std::endl;
249+
std::cerr << "error in go_until_reflection left color sensor is not connected" << std::endl;
250+
break;
251+
}
252+
else if(__builtin_expect(!color_right->is_connected(), 0)){
253+
if((color_left->get_value(0) < reflection && darker) || (color_left->get_value(0) > reflection && !darker)){
254+
right_motor->stop("brake");
255+
left_motor->stop("brake");
256+
}
257+
std::cout << "error in go_until_reflection right color sensor is not connected" << std::endl;
258+
std::cerr << "error in go_until_reflection right color sensor is not connected" << std::endl;
259+
break;
260+
}
261+
262+
// normal operation with angle alingment
263+
if((color_left->get_value(0) < reflection && darker) || (color_left->get_value(0) > reflection && !darker)){
231264
left_motor->stop("brake");
265+
left_motor_stopped = true;
266+
}
267+
if((color_right->get_value(0) < reflection && darker) || (color_right->get_value(0) > reflection && !darker)){
232268
right_motor->stop("brake");
233-
break;
269+
right_motor_stopped = true;
234270
}
235-
else std::this_thread::sleep_for(std::chrono::microseconds(200));
271+
272+
std::this_thread::sleep_for(std::chrono::microseconds(1000));
273+
if(left_motor_stopped && right_motor_stopped) break;
236274
}
237275
}
238276

src/diferential_drive.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ class Diferential_drive {
1818
const bool left_motor_inverted;
1919
const bool right_motor_inverted;
2020
Sensor* const gyro;
21-
Sensor* const color;
21+
Sensor* const color_left;
22+
Sensor* const color_right;
2223
const float wheel_base_width; // in cm
2324
const float wheel_circumference; // in cm
2425
Position_atomic position;
@@ -29,7 +30,7 @@ class Diferential_drive {
2930
void track_position();
3031

3132
public:
32-
Diferential_drive(Motor& p_left_motor, Motor& p_right_motor, Sensor& p_gyro, Sensor& p_color, const float p_wheel_base_width, const float p_wheel_diameter, const bool p_left_motor_inverted = false, const bool p_right_motor_inverted = false, const Position starting_position = Position(0, 0, 0));
33+
Diferential_drive(Motor& p_left_motor, Motor& p_right_motor, Sensor& p_gyro, Sensor& p_color_left, Sensor& p_color_right, const float p_wheel_base_width, const float p_wheel_diameter, const bool p_left_motor_inverted = false, const bool p_right_motor_inverted = false, const Position starting_position = Position(0, 0, 0));
3334
~Diferential_drive();
3435

3536
Position live_position();
@@ -40,7 +41,7 @@ class Diferential_drive {
4041
void move_tank_direct_timed(const int left_motor_speed, const int right_motor_speed, const int time_ms, const char* stop_action);
4142
void rotate_to_abs_angle(const float angle, const float precision, const int max_speed = 100);
4243
void rotate_to_position(const Position target, const float precision, const int max_speed = 100, const float offset = 0); // angle in position is ignored
43-
void go_until_reflection(const int reflection, const bool darker, const int speed);
44+
void go_until_reflection(const int reflection, const bool darker, const int speed); // reflection is in %
4445
void follow_path_curve(const std::string file_path, const float precision, const float angle_precision, const int max_speed = 100);
4546
void follow_path_straight(const std::string file_path, const float angle_precision, const int max_speed = 100);
4647
};

src/main.cpp renamed to src/mains/main1.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
#include <linux/input.h>
66
#include <thread>
77
#include <unistd.h>
8-
#include "position.h"
9-
#include "motor.h"
10-
#include "sensor.h"
11-
#include "diferential_drive.h"
12-
#include "robot.h"
8+
#include "../position.h"
9+
#include "../motor.h"
10+
#include "../sensor.h"
11+
#include "../diferential_drive.h"
12+
#include "../robot.h"
1313

1414
int main (){
1515
std::ifstream button_input("/dev/input/event1", std::ios::binary);
@@ -68,8 +68,17 @@ int main (){
6868
}
6969

7070
if(!sensors.at(1).is_connected()){
71-
std::cout << "sensor 2 \"color\" not connected, continue: NO <-> YES" << std::endl;
72-
std::cerr << "sensor 2 \"color\" not connected" << std::endl;
71+
std::cout << "sensor 2 \"color left\" not connected, continue: NO <-> YES" << std::endl;
72+
std::cerr << "sensor 2 \"color left\" not connected" << std::endl;
73+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
74+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
75+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
76+
}
77+
}
78+
79+
if(!sensors.at(2).is_connected()){
80+
std::cout << "sensor 3 \"color right\" not connected, continue: NO <-> YES" << std::endl;
81+
std::cerr << "sensor 3 \"color right\" not connected" << std::endl;
7382
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
7483
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
7584
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
@@ -82,11 +91,11 @@ int main (){
8291
run++;
8392
std::fstream("runs.txt", std::ios::out | std::ios::trunc) << run;
8493

85-
std::fstream configuration_file("robot_t.conf");
94+
std::fstream configuration_file("robot_1.conf");
8695
float base_width, wheel_diameter, starting_position_x, starting_position_y, starting_position_angle;
8796
bool left_motor_inverted, right_motor_inverted;
8897
configuration_file >> base_width >> wheel_diameter >> starting_position_x >> starting_position_y >> starting_position_angle >> left_motor_inverted >> right_motor_inverted;
89-
Robot robot(motors.at(0), motors.at(3), motors.at(1), motors.at(2), sensors.at(0), sensors.at(1), base_width, wheel_diameter, left_motor_inverted, right_motor_inverted, Position(starting_position_x, starting_position_y, starting_position_angle));
98+
Robot robot(motors.at(0), motors.at(3), motors.at(1), motors.at(2), sensors.at(0), sensors.at(1), sensors.at(2), base_width, wheel_diameter, left_motor_inverted, right_motor_inverted, Position(starting_position_x, starting_position_y, starting_position_angle));
9099
configuration_file.close();
91100

92101
// Move motors to mechanical limit (max angle) for consistent alignment
@@ -109,7 +118,7 @@ int main (){
109118
// wait for finger to be far away from robot
110119
std::this_thread::sleep_for(std::chrono::milliseconds(300));
111120

112-
robot.follow_program("program_t.prgm");
121+
robot.follow_program("program_1.prgm");
113122

114123
return 0;
115124
}

src/mains/main2.cpp

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#include <chrono>
2+
#include <iostream>
3+
#include <array>
4+
#include <fstream>
5+
#include <linux/input.h>
6+
#include <thread>
7+
#include <unistd.h>
8+
#include "../position.h"
9+
#include "../motor.h"
10+
#include "../sensor.h"
11+
#include "../diferential_drive.h"
12+
#include "../robot.h"
13+
14+
int main (){
15+
std::ifstream button_input("/dev/input/event1", std::ios::binary);
16+
if(!button_input.is_open()){
17+
std::cout << "button input file could not be opened" << std::endl;
18+
std::cerr << "button input file could not be opened" << std::endl;
19+
return 1;
20+
}
21+
input_event button_event;
22+
23+
std::array<Motor, 4> motors = Motor::find_motors();
24+
std::array<Sensor, 4> sensors = Sensor::find_sensors();
25+
26+
// check if motors are connected
27+
if(!motors.at(0).is_connected()){
28+
std::cout << "motor A not connected, continue: NO <-> YES" << std::endl;
29+
std::cerr << "motor A not connected" << std::endl;
30+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
31+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
32+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
33+
}
34+
}
35+
if(!motors.at(1).is_connected()){
36+
std::cout << "motor B not connected, continue: NO <-> YES" << std::endl;
37+
std::cerr << "motor B not connected" << std::endl;
38+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
39+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
40+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
41+
}
42+
}
43+
if(!motors.at(2).is_connected()){
44+
std::cout << "motor C not connected, continue: NO <-> YES" << std::endl;
45+
std::cerr << "motor C not connected" << std::endl;
46+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
47+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
48+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
49+
}
50+
}
51+
if(!motors.at(3).is_connected()){
52+
std::cout << "motor D not connected, continue: NO <-> YES" << std::endl;
53+
std::cerr << "motor D not connected" << std::endl;
54+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
55+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
56+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
57+
}
58+
}
59+
60+
// check if sensors are connected
61+
if(!sensors.at(0).is_connected()){
62+
std::cout << "sensor 1 \"gyro\" not connected, continue: NO <-> YES" << std::endl;
63+
std::cerr << "sensor 1 \"gyro\" not connected" << std::endl;
64+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
65+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
66+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
67+
}
68+
}
69+
70+
if(!sensors.at(1).is_connected()){
71+
std::cout << "sensor 2 \"color left\" not connected, continue: NO <-> YES" << std::endl;
72+
std::cerr << "sensor 2 \"color left\" not connected" << std::endl;
73+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
74+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
75+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
76+
}
77+
}
78+
79+
if(!sensors.at(2).is_connected()){
80+
std::cout << "sensor 3 \"color right\" not connected, continue: NO <-> YES" << std::endl;
81+
std::cerr << "sensor 3 \"color right\" not connected" << std::endl;
82+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){ // reaad input
83+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_RIGHT) break;
84+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_LEFT) return 1;
85+
}
86+
}
87+
88+
// fun experiment
89+
int run;
90+
std::fstream("runs.txt", std::ios::in) >> run;
91+
run++;
92+
std::fstream("runs.txt", std::ios::out | std::ios::trunc) << run;
93+
94+
std::fstream configuration_file("robot_1.conf");
95+
float base_width, wheel_diameter, starting_position_x, starting_position_y, starting_position_angle;
96+
bool left_motor_inverted, right_motor_inverted;
97+
configuration_file >> base_width >> wheel_diameter >> starting_position_x >> starting_position_y >> starting_position_angle >> left_motor_inverted >> right_motor_inverted;
98+
Robot robot(motors.at(0), motors.at(3), motors.at(1), motors.at(2), sensors.at(0), sensors.at(1), sensors.at(2), base_width, wheel_diameter, left_motor_inverted, right_motor_inverted, Position(starting_position_x, starting_position_y, starting_position_angle));
99+
configuration_file.close();
100+
101+
// Move motors to mechanical limit (max angle) for consistent alignment
102+
motors.at(0).run_direct(30, true);
103+
motors.at(3).run_direct(30, true);
104+
105+
// wait for midle button
106+
while(true) if (button_input.read(reinterpret_cast<char*>(&button_event), sizeof(button_event))){
107+
if (button_event.type == EV_KEY && button_event.value == 1 && button_event.code == KEY_ENTER) break;
108+
std::this_thread::sleep_for(std::chrono::milliseconds(5));
109+
}
110+
111+
motors.at(0).run_direct(0, false);
112+
motors.at(0).stop("brake");
113+
motors.at(0).set_position(0);
114+
motors.at(3).run_direct(0, false);
115+
motors.at(3).stop("brake");
116+
motors.at(3).set_position(0);
117+
118+
// wait for finger to be far away from robot
119+
std::this_thread::sleep_for(std::chrono::milliseconds(300));
120+
121+
robot.follow_program("program_1.prgm");
122+
123+
return 0;
124+
}
125+

0 commit comments

Comments
 (0)