Compare commits

...

2 Commits

Author SHA1 Message Date
8e8b3cd305 updating and housekeeping 2024-01-22 21:20:49 +01:00
Max
33fdd0252f Adjust scaling of parameters 2023-02-09 14:24:21 +01:00
6 changed files with 39 additions and 29 deletions

View File

@ -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
View File

@ -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"

View File

@ -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"

View File

@ -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>]();

View File

@ -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()),
_ => (), _ => (),
} }

View File

@ -1,2 +1,2 @@
#!/bin/sh #!/bin/sh
cargo build --release && scp target/armv5te-unknown-linux-musleabi/release/ev3dev-pid-linefollow robot@ev3dev:/home/robot/ scp "$1" robot@ev3dev:/home/robot/