From d415c25afbf8a571cd677af5af525e3c698f6252 Mon Sep 17 00:00:00 2001 From: lennlouisgeek Date: Wed, 8 Apr 2026 00:58:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=B7=BB=E5=8A=A0=E5=8A=9B?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E7=B2=97=E6=A0=87=E5=AE=9A=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_processing/1.py | 11 ++++ data_processing/~$第一次粗标定.xlsx | Bin 0 -> 165 bytes {doc => data_processing}/第一次粗标定.xlsx | Bin src-tauri/src/serial_core/codecs/tactile_a.rs | 48 +++++++++++++++--- 4 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 data_processing/1.py create mode 100644 data_processing/~$第一次粗标定.xlsx rename {doc => data_processing}/第一次粗标定.xlsx (100%) diff --git a/data_processing/1.py b/data_processing/1.py new file mode 100644 index 0000000..3fd7127 --- /dev/null +++ b/data_processing/1.py @@ -0,0 +1,11 @@ +import matplotlib.pyplot as plt + +y = [0, 160, 260, 360, 460, 560, 660, 860, 1060, 1560, 2060] +x = [0, 74602, 105503, 131459, 153512, 172041, 193794, 218947, 240580, 295118, 332346] + +plt.plot(x, y) +plt.title("Simple Line Plot") +plt.xlabel("g") +plt.ylabel("raw data") + +plt.show() diff --git a/data_processing/~$第一次粗标定.xlsx b/data_processing/~$第一次粗标定.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6c66d32a1b8135ae34d4def514b36ee4931d3aad GIT binary patch literal 165 acmZSaNzKbsAQ`YQ_%Nh0 for TactileAHandler { match frame { TactileAFrame::Rep(rep) => { let vals = TactileACodec::parse_data_frame(&rep.payload)?; - + let g = raw_to_g1(vals.iter().sum::() as u32); + debug!("force is {g}"); Ok(Some(vals)) } _ => Ok(None), @@ -249,12 +250,47 @@ impl FrameHandler for TactileAHandler { } } +fn raw_to_g1(raw: u32) -> f64 { + const X: [u32; 11] = [ + 0, 74602, 105503, 131459, 153512, 172041, 193794, 218947, 240580, 295118, 332346, + ]; -fn trans_data_2_n(val: i32) -> i32 { - if val <= 74602 { - val / 466 - } else if val > 74602 && val <= 105503 { - + const Y: [f64; 11] = [ + 0.0, 160.0, 260.0, 360.0, 460.0, 560.0, 660.0, 860.0, 1060.0, 1560.0, 2060.0, + ]; + + let n = X.len(); + if raw <= X[0] { + return Y[0]; + } + if raw >= X[n - 1] { + return Y[n - 1]; + } + + let mut left = 0; + let mut right = n - 1; + + while left + 1 < right { + let mid = (left + right) / 2; + if raw < X[mid] { + right = mid; + } else { + left = mid; + } + } + + let ratio = (raw - X[left]) as f64 / (X[right] - X[left]) as f64; + Y[left] + ratio * (Y[right] - Y[left]) / 100.0 +} + +#[cfg(test)] +mod test { + use crate::serial_core::codecs::tactile_a::raw_to_g1; + #[test] + fn raw_to_g1_test() { + let input = 198000; + let g = raw_to_g1(input); + println!("input {input} -> g {g}"); } }