<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: timbo4u</title>
    <description>The latest articles on DEV Community by timbo4u (@timbo4u1).</description>
    <link>https://dev.to/timbo4u1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3809071%2F80b7a520-dabb-430c-a3aa-aed5b1fbaafd.png</url>
      <title>DEV Community: timbo4u</title>
      <link>https://dev.to/timbo4u1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/timbo4u1"/>
    <language>en</language>
    <item>
      <title>21.9% of robot training data violates physics — we measured it.</title>
      <dc:creator>timbo4u</dc:creator>
      <pubDate>Sun, 05 Apr 2026 17:40:00 +0000</pubDate>
      <link>https://dev.to/timbo4u1/219-of-robot-training-data-violates-physics-we-measured-it-4o2g</link>
      <guid>https://dev.to/timbo4u1/219-of-robot-training-data-violates-physics-we-measured-it-4o2g</guid>
      <description>&lt;p&gt;We ran 216 RoboTurk robot teleoperation episodes through a physics &lt;br&gt;
checker. 21.9% failed.&lt;/p&gt;

&lt;p&gt;“This is not synthetic data. These are publicly used datasets.”&lt;/p&gt;

&lt;p&gt;Not mislabeled. Not missing values. Physically impossible motion — &lt;br&gt;
data that violates Newton's laws, rigid-body kinematics, or IMU &lt;br&gt;
internal consistency.&lt;/p&gt;

&lt;p&gt;These episodes were being used to train robot arms.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we checked
&lt;/h2&gt;

&lt;p&gt;Seven biomechanical laws validated per window:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Newton's Second Law (F = ma coupling)&lt;/li&gt;
&lt;li&gt;Segment resonance frequency&lt;/li&gt;
&lt;li&gt;Rigid body kinematics&lt;/li&gt;
&lt;li&gt;Jerk bounds (human motion ≤ 500 m/s³, Flash &amp;amp; Hogan 1985)&lt;/li&gt;
&lt;li&gt;IMU internal consistency&lt;/li&gt;
&lt;li&gt;Ballistocardiography&lt;/li&gt;
&lt;li&gt;Joule heating (EMG + thermal)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each window gets a score 0–100 and a tier:&lt;br&gt;
GOLD / SILVER / BRONZE / REJECTED&lt;/p&gt;




&lt;h2&gt;
  
  
  Results on real datasets
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RoboTurk Open-X (216 episodes)&lt;/td&gt;
&lt;td&gt;21.9% rejected as physically invalid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PAMAP2 (100Hz IMU)&lt;/td&gt;
&lt;td&gt;+4.23% F1 after filtering corrupted windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WESAD (stress classification)&lt;/td&gt;
&lt;td&gt;+3.1% F1 improvement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UCI HAR&lt;/td&gt;
&lt;td&gt;+2.51% F1 vs corrupted baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WISDM 2019&lt;/td&gt;
&lt;td&gt;+1.74% F1 improvement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The F1 improvements are from training classifiers on certified-only &lt;br&gt;
data vs all data. Not a bigger model. Not more data. Just cleaner data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for Physical AI
&lt;/h2&gt;

&lt;p&gt;When you train on images, bad data hurts accuracy.&lt;br&gt;
When you train a robot arm, bad data teaches physically impossible &lt;br&gt;
movement patterns. The arm learns to move like it has no mass.&lt;/p&gt;

&lt;p&gt;A prosthetic hand trained on corrupted EMG data fails the person &lt;br&gt;
wearing it. A humanoid robot trained on synthetic motion that violates &lt;br&gt;
rigid-body kinematics learns to move like a cartoon.&lt;/p&gt;

&lt;p&gt;There's no standard quality floor for motion data. &lt;br&gt;
We built one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tool
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;s2s-certify
s2s-certify your_imu_data.csv &lt;span class="nt"&gt;--segment&lt;/span&gt; forearm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;s2s_standard_v1_3&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;S2SPipeline&lt;/span&gt;

&lt;span class="n"&gt;pipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;S2SPipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;segment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;forearm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;certify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imu_raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamps_ns&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                               &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                               &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gyro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gyro&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# GOLD / SILVER / BRONZE / REJECTED
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# 0–100
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero runtime dependencies. 116/116 tests passing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference benchmark
&lt;/h2&gt;

&lt;p&gt;We published a reproducible benchmark: 29 windows from NinaPro DB5, &lt;br&gt;
PAMAP2, and WESAD — real data, not synthetic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real_human: 20/21 correctly certified (95%)&lt;/li&gt;
&lt;li&gt;corrupted: correctly rejected or downgraded&lt;/li&gt;
&lt;li&gt;Results: experiments/s2s_reference_benchmark.json&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone can run it and get the same numbers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we found that surprised us
&lt;/h2&gt;

&lt;p&gt;The most common failure mode in RoboTurk wasn't jerk violations.&lt;br&gt;
It was IMU internal consistency — the translation and rotation &lt;br&gt;
channels showed different teleoperation latency. &lt;br&gt;
52% of rejected windows had this pattern.&lt;/p&gt;

&lt;p&gt;This means the robot arm's internal sensors were decoupled during &lt;br&gt;
recording — the motion looked valid to a human reviewer but the &lt;br&gt;
physics said otherwise.&lt;/p&gt;




&lt;p&gt;GitHub: &lt;a href="https://github.com/timbo4u1/S2S" rel="noopener noreferrer"&gt;https://github.com/timbo4u1/S2S&lt;/a&gt;&lt;br&gt;&lt;br&gt;
PyPI: pip install s2s-certify&lt;br&gt;&lt;br&gt;
DOI: 10.5281/zenodo.18878307&lt;/p&gt;

&lt;p&gt;If you're working with IMU, EMG, or robot teleoperation data and &lt;br&gt;
want to know what percentage of your dataset is physically valid — &lt;br&gt;
run it and see.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>machinelearning</category>
      <category>testing</category>
    </item>
    <item>
      <title>I Built a Physics Certification Layer for Motion Data — Here's What I Found</title>
      <dc:creator>timbo4u</dc:creator>
      <pubDate>Fri, 06 Mar 2026 05:09:47 +0000</pubDate>
      <link>https://dev.to/timbo4u1/i-built-a-physics-certification-layer-for-motion-data-heres-what-i-found-4dbp</link>
      <guid>https://dev.to/timbo4u1/i-built-a-physics-certification-layer-for-motion-data-heres-what-i-found-4dbp</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update March 9, 2026:&lt;/strong&gt; Found and fixed two real bugs in the physics engine since this post. Jerk was computing 4 derivatives instead of 3. Gravity bias wasn't removed before jerk calculation. Both fixed. Also ran hybrid model experiments — results below updated with new numbers.&lt;/p&gt;




&lt;p&gt;TL;DR: I trained a classifier on robot motion data and kept getting weird failures. The data looked fine. It wasn't fine. So I wrote a tool that checks whether sensor data actually obeys the laws of physics before you train on it. Here's what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;When you train a model on images or text, bad data is annoying but recoverable — you clean it, re-label it, filter it. The model is usually forgiving.&lt;/p&gt;

&lt;p&gt;When you train a physical AI system — a prosthetic hand, a robot arm, a rehabilitation exoskeleton — bad training data doesn't just hurt accuracy. It teaches the system physically impossible movement patterns. A prosthetic hand trained on corrupted EMG data fails the person wearing it. A humanoid robot trained on synthetic motion data that violates rigid-body kinematics learns to move like a cartoon.&lt;/p&gt;

&lt;p&gt;The problem is that most motion datasets have no quality floor. They contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synthetic data generated without real sensors (no actual physics coupling)&lt;/li&gt;
&lt;li&gt;Corrupted recordings with dropped samples and sensor drift&lt;/li&gt;
&lt;li&gt;Mislabeled actions where the label doesn't match the measured physics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there's no standard way to detect any of this.&lt;/p&gt;

&lt;p&gt;I decided to build one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea: Check the Physics, Not the Labels
&lt;/h2&gt;

&lt;p&gt;Instead of asking "does this data look human?" (subjective, learnable by fakes), I asked: does this data obey the physical laws that govern human movement?&lt;/p&gt;

&lt;p&gt;A real human arm moving through space has to satisfy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rigid body kinematics&lt;/strong&gt; — accelerometer and gyroscope on the same limb must couple: a = α×r + ω²×r. Two sensors on the same rigid body cannot disagree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jerk bounds&lt;/strong&gt; — human motion minimizes jerk (third derivative of position). Flash &amp;amp; Hogan proved this in 1985. Superhuman jerk = sensor spike or synthetic artifact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EMG-acceleration timing&lt;/strong&gt; — muscle electrical activation precedes limb acceleration by ~75ms. If acceleration comes first, something is wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resonance frequency&lt;/strong&gt; — human forearm tremor is 8–12Hz. Always. Vibrations at 40Hz = mechanical noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BCG heartbeat&lt;/strong&gt; — a wrist IMU on a resting human shows the mechanical heartbeat signature at 1–3Hz. No signal = not a human.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't heuristics. They're physics. You can't fake them without running a full skeletal simulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built: S2S
&lt;/h2&gt;

&lt;p&gt;Pure Python, zero external dependencies, runs anywhere including embedded systems.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;s2s_standard_v1_3.s2s_physics_v1_3&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PhysicsEngine&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PhysicsEngine&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;certify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;imu_raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamps_ns&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...],&lt;/span&gt;   &lt;span class="c1"&gt;# [[ax, ay, az], ...] m/s²
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gyro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...],&lt;/span&gt;    &lt;span class="c1"&gt;# [[gx, gy, gz], ...] rad/s
&lt;/span&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;segment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;forearm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tier&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;               &lt;span class="c1"&gt;# GOLD / SILVER / BRONZE / REJECTED
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;physical_law_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# 0–100
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;laws_passed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;        &lt;span class="c1"&gt;# ['rigid_body_kinematics', 'jerk_bounds', ...]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;s2s-certify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  The Result That Surprised Me
&lt;/h2&gt;

&lt;p&gt;Real iPhone 11 IMU data (37 seconds of natural hand movement) versus synthetic data generated to look similar:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Real Human&lt;/th&gt;
&lt;th&gt;Synthetic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rigid body coupling r&lt;/td&gt;
&lt;td&gt;0.35&lt;/td&gt;
&lt;td&gt;-0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jerk P95 (m/s³)&lt;/td&gt;
&lt;td&gt;25.8&lt;/td&gt;
&lt;td&gt;54.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resonance (Hz)&lt;/td&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;13.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physics score&lt;/td&gt;
&lt;td&gt;69/100&lt;/td&gt;
&lt;td&gt;53/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certification tier&lt;/td&gt;
&lt;td&gt;SILVER&lt;/td&gt;
&lt;td&gt;BRONZE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;r=0.35 (real) vs r=-0.01 (synthetic) — physics alone, no labels, no training required.&lt;/p&gt;

&lt;p&gt;Applied to 10,360 windows from UCI HAR + PAMAP2: 9,050 certified (87.4%), 1,310 rejected for physics violations. Those 1,310 windows aren't low quality — they're physically impossible.&lt;/p&gt;
&lt;h2&gt;
  
  
  Level 4: Where It Gets Interesting
&lt;/h2&gt;

&lt;p&gt;The single-sensor laws are powerful, but the most interesting result came from kinematic chain consistency across multiple sensors.&lt;/p&gt;

&lt;p&gt;PAMAP2 has 3 IMUs — hand, chest, ankle. These sensors don't just need to look right individually. They have to be consistent with each other at the physics level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ankle leads chest in jerk timing by 50–100ms (force propagates up the skeleton)&lt;/li&gt;
&lt;li&gt;Dominant locomotion frequency must agree across all three sensors&lt;/li&gt;
&lt;li&gt;Coupling between segments must respect joint constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A synthetic generator can fool single-sensor checks by learning the right statistics. It cannot fake cross-sensor timing without running a complete rigid-body skeletal simulation.&lt;/p&gt;

&lt;p&gt;Results on PAMAP2 (12 activity classes):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;F1 Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single chest IMU baseline&lt;/td&gt;
&lt;td&gt;0.7969&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-sensor naive concat&lt;/td&gt;
&lt;td&gt;0.8308 (+3.39%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S2S kinematic chain filter&lt;/td&gt;
&lt;td&gt;0.8399 (+0.91% over concat)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Net vs single sensor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+4.23%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Level 5: Physics Features vs Raw IMU — What Actually Happened
&lt;/h2&gt;

&lt;p&gt;This is where I expected a clean win and got a more honest result instead.&lt;/p&gt;

&lt;p&gt;I extracted 19 physics features per window (jerk bounds, resonance confidence, rigid body coupling, etc.) and trained a Random Forest to classify walk/sit/run on 63,314 windows from 22 subjects.&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw IMU&lt;/td&gt;
&lt;td&gt;79.6%&lt;/td&gt;
&lt;td&gt;768&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physics only&lt;/td&gt;
&lt;td&gt;70.5%&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hybrid (raw + physics)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83.7%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;787&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The hybrid beats raw IMU alone by +4.13%. Physics adds signal that raw data misses.&lt;/p&gt;

&lt;p&gt;But here's the honest part: only 2 of the 19 physics features actually contributed — &lt;code&gt;rigid_rms_measured&lt;/code&gt; and &lt;code&gt;resonance_peak_energy&lt;/code&gt;. The other 17 had zero importance.&lt;/p&gt;

&lt;p&gt;That's not a failure. Those 17 features were designed to detect corrupted vs valid data, not to classify activities. They're doing their job — just not the job I asked them to do in this experiment. The two that matter are measuring motion intensity and frequency content, which directly distinguish walk/sit/run.&lt;/p&gt;

&lt;p&gt;The lesson: physics features are highly efficient (2.7x more predictive per feature than raw IMU) but you need to match the feature to the question being asked.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using the Physics Score as a Training Loss
&lt;/h2&gt;

&lt;p&gt;You don't have to use S2S as a hard filter. Use the score as a soft loss term:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# s2s_torch.py — physics-aware training loss
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;s2s_standard_v1_3.s2s_physics_v1_3&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PhysicsEngine&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;S2SPhysicsLoss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_loss_fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lambda_physics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task_loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;task_loss_fn&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lambda_physics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lambda_physics&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PhysicsEngine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;imu_batch&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;task_l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;task_loss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;imu_batch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;certify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;physical_law_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;physics_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;physics_penalty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;physics_scores&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;task_l&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lambda_physics&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;physics_penalty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The most useful thing right now: if you work with motion data for any application — robotics, prosthetics, sports science, rehab — try running your dataset through S2S and tell me what the rejection rate is. Every new dataset that gets certified (or fails interestingly) teaches something about what's actually in these benchmarks.&lt;/p&gt;

&lt;p&gt;The open question I'm working on: which physics features matter for which problems? Rigid body coupling matters for activity classification. What matters for gait analysis? For prosthetic control? That's the research direction.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/timbo4u1" rel="noopener noreferrer"&gt;
        timbo4u1
      &lt;/a&gt; / &lt;a href="https://github.com/timbo4u1/S2S" rel="noopener noreferrer"&gt;
        S2S
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Physics certification for robot training data. Checks 11 biomechanical laws before your model trains.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;S2S — Physics Certification for Motion Data&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Bad robot and human motion training data costs you months. S2S finds it in seconds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pypi.org/project/s2s-certify/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d4977a05c5ff39de81cec2d66019160fa21f12eb04433ad714586771fd54f416/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707970692d76312e362e302d6f72616e6765" alt="PyPI"&gt;&lt;/a&gt; &lt;a href="https://doi.org/10.5281/zenodo.18878307" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1af42fedf443fe5e1fe6290e83de63c44d9cc94fbffbab39e4059cb411e9f535/68747470733a2f2f7a656e6f646f2e6f72672f62616467652f444f492f31302e353238312f7a656e6f646f2e31383837383330372e737667" alt="DOI"&gt;&lt;/a&gt; &lt;a href="https://github.com/timbo4u1/S2S/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9c2ede701f08255baca676c9289712c9c7a5368de12d773996fe3af1edfcb7ca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d42534c2d2d312e312d626c7565" alt="License"&gt;&lt;/a&gt; &lt;a href="https://github.com/timbo4u1/S2S/pyproject.toml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5266ef63d0fec1ad4cee104c7aee0ad0f084d6c1388d39adfe556c420a0a28d2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e392532422d626c7565" alt="python"&gt;&lt;/a&gt; &lt;a href="https://github.com/timbo4u1/S2S/pyproject.toml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b23453f8bb7b1e49fa5272ef23947cc9f8f2e82222cdcdb1469f61a436ec07fe/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d7a65726f2d627269676874677265656e" alt="dependencies"&gt;&lt;/a&gt; &lt;a href="https://github.com/timbo4u1/S2S/tests/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0b9551f7389ecc4de94cbc79d251df7d35cd398a63552e5f634f43923822b73b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d3131302532463131302d627269676874677265656e" alt="tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s1"&gt;s2s_standard_v1_3&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-v"&gt;PhysicsEngine&lt;/span&gt;

&lt;span class="pl-s1"&gt;result&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;PhysicsEngine&lt;/span&gt;().&lt;span class="pl-c1"&gt;certify&lt;/span&gt;(
    &lt;span class="pl-s1"&gt;imu_raw&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;{
        &lt;span class="pl-s"&gt;"timestamps_ns"&lt;/span&gt;: &lt;span class="pl-s1"&gt;timestamps&lt;/span&gt;,
        &lt;span class="pl-s"&gt;"accel"&lt;/span&gt;: &lt;span class="pl-s1"&gt;accel_data&lt;/span&gt;,   &lt;span class="pl-c"&gt;# [[x,y,z], ...] m/s²&lt;/span&gt;
        &lt;span class="pl-s"&gt;"gyro"&lt;/span&gt;:  &lt;span class="pl-s1"&gt;gyro_data&lt;/span&gt;,    &lt;span class="pl-c"&gt;# [[x,y,z], ...] rad/s&lt;/span&gt;
    },
    &lt;span class="pl-s1"&gt;segment&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;"forearm"&lt;/span&gt;
)

&lt;span class="pl-en"&gt;print&lt;/span&gt;(&lt;span class="pl-s1"&gt;result&lt;/span&gt;[&lt;span class="pl-s"&gt;"tier"&lt;/span&gt;])                  &lt;span class="pl-c"&gt;# GOLD / SILVER / BRONZE / REJECTED&lt;/span&gt;
&lt;span class="pl-en"&gt;print&lt;/span&gt;(&lt;span class="pl-s1"&gt;result&lt;/span&gt;[&lt;span class="pl-s"&gt;"physical_law_score"&lt;/span&gt;])    &lt;span class="pl-c"&gt;# 0–100&lt;/span&gt;
&lt;span class="pl-en"&gt;print&lt;/span&gt;(&lt;span class="pl-s1"&gt;result&lt;/span&gt;[&lt;span class="pl-s"&gt;"laws_passed"&lt;/span&gt;])
&lt;span class="pl-en"&gt;print&lt;/span&gt;(&lt;span class="pl-s1"&gt;result&lt;/span&gt;[&lt;span class="pl-s"&gt;"laws_failed"&lt;/span&gt;])&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Most motion datasets contain bad data — corrupted recordings, synthetic signals that violate physics, mislabeled actions. You cannot see it by looking at the numbers. Your model trains on it anyway.&lt;/p&gt;

&lt;p&gt;S2S asks: does this data &lt;em&gt;obey the physics of human movement?&lt;/em&gt; A perfect statistical fake fails if it violates Newton's Second Law…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/timbo4u1/S2S" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;p&gt;BSL-1.1 license — free for research/education, converts to Apache 2.0 on 2028-01-01.&lt;br&gt;&lt;br&gt;
PyPI: &lt;code&gt;pip install s2s-certify&lt;/code&gt; · DOI: 10.5281/zenodo.18878307&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>robotics</category>
      <category>datascience</category>
      <category>python</category>
    </item>
  </channel>
</rss>
