Compare commits
2 Commits
f13ab9deb9
...
main
Author | SHA1 | Date | |
---|---|---|---|
8e8b3cd305 | |||
33fdd0252f |
@ -3,6 +3,7 @@ target = "armv5te-unknown-linux-musleabi"
|
|||||||
|
|
||||||
[target.armv5te-unknown-linux-musleabi]
|
[target.armv5te-unknown-linux-musleabi]
|
||||||
linker = "rust-lld"
|
linker = "rust-lld"
|
||||||
|
runner = "./upload.sh"
|
||||||
|
|
||||||
[target.armv5te-unknown-linux-gnueabi]
|
[target.armv5te-unknown-linux-gnueabi]
|
||||||
linker = "/usr/bin/arm-linux-gnueabi-gcc"
|
linker = "/usr/bin/arm-linux-gnueabi-gcc"
|
||||||
|
19
Cargo.lock
generated
19
Cargo.lock
generated
@ -179,9 +179,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ev3dev-lang-rust"
|
name = "ev3dev-lang-rust"
|
||||||
version = "0.12.1"
|
version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d275b47949d28dbb58753369e37b4fae3b0643db685a2673ae189ad3cf286862"
|
checksum = "029332714b8e1658454779f5dba942de0f2d408e21f63cdc794b13792eca33ee"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ev3dev-lang-rust-derive",
|
"ev3dev-lang-rust-derive",
|
||||||
"framebuffer",
|
"framebuffer",
|
||||||
@ -202,13 +202,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ev3dev-pid-linefollow"
|
name = "ev3dev-pid-linefollow"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ev3dev-lang-rust",
|
"ev3dev-lang-rust",
|
||||||
"exec",
|
"exec",
|
||||||
"image",
|
"image",
|
||||||
"imageproc",
|
"imageproc",
|
||||||
"itertools",
|
"itertools 0.12.0",
|
||||||
"paste",
|
"paste",
|
||||||
"pid",
|
"pid",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
@ -367,7 +367,7 @@ dependencies = [
|
|||||||
"approx",
|
"approx",
|
||||||
"conv",
|
"conv",
|
||||||
"image",
|
"image",
|
||||||
"itertools",
|
"itertools 0.10.5",
|
||||||
"nalgebra",
|
"nalgebra",
|
||||||
"num",
|
"num",
|
||||||
"rand 0.7.3",
|
"rand 0.7.3",
|
||||||
@ -385,6 +385,15 @@ dependencies = [
|
|||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jpeg-decoder"
|
name = "jpeg-decoder"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ev3dev-pid-linefollow"
|
name = "ev3dev-pid-linefollow"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ev3dev-lang-rust = { version = "0.12.0", features = ["screen"] }
|
ev3dev-lang-rust = { version = "0.13.0", features = ["screen"] }
|
||||||
image = "0.24"
|
image = "0.24"
|
||||||
imageproc = "0.23"
|
imageproc = "0.23"
|
||||||
rusttype = "0.9"
|
rusttype = "0.9"
|
||||||
@ -12,9 +12,11 @@ paste = "1.0"
|
|||||||
pid = "4.0"
|
pid = "4.0"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
itertools = "0.10"
|
itertools = "0.12"
|
||||||
exec = "0.3"
|
exec = "0.3"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
|
opt-level = "z"
|
||||||
lto = true
|
lto = true
|
||||||
|
codegen-units = 1
|
||||||
strip = "debuginfo"
|
strip = "debuginfo"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use ev3dev_lang_rust::Ev3Button;
|
use ev3dev_lang_rust::Button;
|
||||||
use ev3dev_lang_rust::Ev3Result;
|
use ev3dev_lang_rust::Ev3Result;
|
||||||
use paste::paste;
|
use paste::paste;
|
||||||
|
|
||||||
@ -7,7 +7,7 @@ macro_rules! button_impl {
|
|||||||
paste! {
|
paste! {
|
||||||
|
|
||||||
pub struct SmartEv3Buttons {
|
pub struct SmartEv3Buttons {
|
||||||
buttons: Ev3Button,
|
buttons: Button,
|
||||||
$(
|
$(
|
||||||
[<last_ $name>]: bool,
|
[<last_ $name>]: bool,
|
||||||
)*
|
)*
|
||||||
@ -15,7 +15,7 @@ macro_rules! button_impl {
|
|||||||
|
|
||||||
impl SmartEv3Buttons {
|
impl SmartEv3Buttons {
|
||||||
pub fn new() -> Ev3Result<Self> {
|
pub fn new() -> Ev3Result<Self> {
|
||||||
let buttons = Ev3Button::new()?;
|
let buttons = Button::new()?;
|
||||||
buttons.process();
|
buttons.process();
|
||||||
$(
|
$(
|
||||||
let [<last_ $name>] = buttons.[<is_ $name>]();
|
let [<last_ $name>] = buttons.[<is_ $name>]();
|
||||||
|
32
src/main.rs
32
src/main.rs
@ -11,7 +11,6 @@ use ev3dev_lang_rust::{
|
|||||||
use exec::execvp;
|
use exec::execvp;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use pid::Pid;
|
use pid::Pid;
|
||||||
use rand::{thread_rng, Rng};
|
|
||||||
use rusttype::Font;
|
use rusttype::Font;
|
||||||
use std::{
|
use std::{
|
||||||
env,
|
env,
|
||||||
@ -51,8 +50,8 @@ fn try_main() -> Result<(), Box<dyn Error>> {
|
|||||||
})?;
|
})?;
|
||||||
let mut buttons = SmartEv3Buttons::new()?;
|
let mut buttons = SmartEv3Buttons::new()?;
|
||||||
|
|
||||||
left_motor.set_polarity(LargeMotor::POLARITY_INVERSED)?;
|
left_motor.set_polarity(LargeMotor::POLARITY_NORMAL)?;
|
||||||
right_motor.set_polarity(LargeMotor::POLARITY_INVERSED)?;
|
right_motor.set_polarity(LargeMotor::POLARITY_NORMAL)?;
|
||||||
left_motor.set_stop_action(LargeMotor::STOP_ACTION_BRAKE)?;
|
left_motor.set_stop_action(LargeMotor::STOP_ACTION_BRAKE)?;
|
||||||
right_motor.set_stop_action(LargeMotor::STOP_ACTION_BRAKE)?;
|
right_motor.set_stop_action(LargeMotor::STOP_ACTION_BRAKE)?;
|
||||||
|
|
||||||
@ -71,7 +70,7 @@ fn try_main() -> Result<(), Box<dyn Error>> {
|
|||||||
&sensor,
|
&sensor,
|
||||||
&mut buttons,
|
&mut buttons,
|
||||||
setpoint,
|
setpoint,
|
||||||
(k_p / 10.0, k_i / 10000.0, k_d / 10000.0),
|
(k_p / 5.0, k_i / 5000.0, k_d * 10.0),
|
||||||
v,
|
v,
|
||||||
);
|
);
|
||||||
left_motor.stop().and(right_motor.stop())?;
|
left_motor.stop().and(right_motor.stop())?;
|
||||||
@ -95,10 +94,10 @@ fn select_values(
|
|||||||
font: &Font,
|
font: &Font,
|
||||||
) -> (f32, f32, f32, i32) {
|
) -> (f32, f32, f32, i32) {
|
||||||
use Parameter::{Kd, Ki, Kp, Speed};
|
use Parameter::{Kd, Ki, Kp, Speed};
|
||||||
let mut k_p = thread_rng().gen_range(0.01..=10.0);
|
let mut k_p = 0.0; //thread_rng().gen_range(0.01..=10.0);
|
||||||
let mut k_i = thread_rng().gen_range(0.01..=10.0);
|
let mut k_i = 0.0; //thread_rng().gen_range(0.01..=10.0);
|
||||||
let mut k_d = thread_rng().gen_range(0.01..=10.0);
|
let mut k_d = 0.0; //thread_rng().gen_range(0.01..=10.0);
|
||||||
let mut v = thread_rng().gen_range(1..=100);
|
let mut v = 0; //thread_rng().gen_range(1..=100);
|
||||||
let mut selected = Kp;
|
let mut selected = Kp;
|
||||||
let mut times_pressed_up = 0;
|
let mut times_pressed_up = 0;
|
||||||
let mut times_pressed_down = 0;
|
let mut times_pressed_down = 0;
|
||||||
@ -156,18 +155,18 @@ fn select_values(
|
|||||||
if buttons.is_up() {
|
if buttons.is_up() {
|
||||||
*param = (*param
|
*param = (*param
|
||||||
+ if times_pressed_up > 10 {
|
+ if times_pressed_up > 10 {
|
||||||
0.01f32
|
|
||||||
} else {
|
|
||||||
0.1f32
|
0.1f32
|
||||||
|
} else {
|
||||||
|
0.01f32
|
||||||
})
|
})
|
||||||
.min(99.99);
|
.min(99.99);
|
||||||
}
|
}
|
||||||
if buttons.is_down() {
|
if buttons.is_down() {
|
||||||
*param = (*param
|
*param = (*param
|
||||||
- if times_pressed_down > 10 {
|
- if times_pressed_down > 10 {
|
||||||
0.01f32
|
|
||||||
} else {
|
|
||||||
0.1f32
|
0.1f32
|
||||||
|
} else {
|
||||||
|
0.01f32
|
||||||
})
|
})
|
||||||
.max(0.0);
|
.max(0.0);
|
||||||
}
|
}
|
||||||
@ -231,10 +230,7 @@ fn follow_line(
|
|||||||
v: i32,
|
v: i32,
|
||||||
) -> Result<Duration, ProgramError> {
|
) -> Result<Duration, ProgramError> {
|
||||||
let mut controller = Pid::new(setpoint, 200.0);
|
let mut controller = Pid::new(setpoint, 200.0);
|
||||||
controller
|
controller.p(k_p, 200.0).i(k_i, 200.0).d(k_d, 200.0);
|
||||||
.p(k_p, f32::INFINITY)
|
|
||||||
.i(k_i, f32::INFINITY)
|
|
||||||
.d(k_d, f32::INFINITY);
|
|
||||||
left.set_duty_cycle_sp(0)?;
|
left.set_duty_cycle_sp(0)?;
|
||||||
right.set_duty_cycle_sp(0)?;
|
right.set_duty_cycle_sp(0)?;
|
||||||
buttons.process();
|
buttons.process();
|
||||||
@ -253,7 +249,9 @@ fn follow_line(
|
|||||||
let red = is_red(color);
|
let red = is_red(color);
|
||||||
match state {
|
match state {
|
||||||
LineFollowState::PreStart if red => state = LineFollowState::Start(Instant::now()),
|
LineFollowState::PreStart if red => state = LineFollowState::Start(Instant::now()),
|
||||||
LineFollowState::Start(start) if !red => state = LineFollowState::Run(start),
|
LineFollowState::Start(start) if !red && start.elapsed().as_secs() > 10 => {
|
||||||
|
state = LineFollowState::Run(start);
|
||||||
|
}
|
||||||
LineFollowState::Run(start) if red => state = LineFollowState::Finish(start.elapsed()),
|
LineFollowState::Run(start) if red => state = LineFollowState::Finish(start.elapsed()),
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user