<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title> – Migration notes</title>
    <link>/docs/developing-control-applications/control-blocks/migration-notes/</link>
    <description>Recent content in Migration notes on </description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="/docs/developing-control-applications/control-blocks/migration-notes/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Migrating from 3.23.1 to 3.24.0 — `stictionFrictionForce = 0` users</title>
      <link>/docs/developing-control-applications/control-blocks/migration-notes/migration-3.23.1-to-3.24.0/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/developing-control-applications/control-blocks/migration-notes/migration-3.23.1-to-3.24.0/</guid>
      <description>
        
        
        &lt;div class=&#34;c3-version&#34;&gt;
  &lt;span class=&#34;c3-version__control c3-version__control--static&#34;&gt;
    &lt;span class=&#34;c3-version__label&#34; aria-hidden=&#34;true&#34;&gt;Control3&lt;/span&gt;
    &lt;span class=&#34;c3-version__value&#34;&gt;3.30–3.34&lt;/span&gt;
  &lt;/span&gt;

&lt;/div&gt;
&lt;h2 id=&#34;who-this-applies-to&#34;&gt;Who this applies to&lt;/h2&gt;
&lt;p&gt;If on &lt;code&gt;3.23.1&lt;/code&gt; you set &lt;code&gt;stictionFrictionForce = 0&lt;/code&gt; on a &lt;code&gt;FrictionCompensation&lt;/code&gt; block to remove chatter near zero velocity under friction feedforward, you must change your config when upgrading to &lt;code&gt;3.24.0&lt;/code&gt;. Without the change, the behavior you relied on is lost.&lt;/p&gt;
&lt;p&gt;If you never set &lt;code&gt;stictionFrictionForce&lt;/code&gt; below &lt;code&gt;coulombFrictionForce&lt;/code&gt;, no change is required — your config keeps working with identical behavior.&lt;/p&gt;
&lt;h2 id=&#34;what-changed-and-why&#34;&gt;What changed and why&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;3.23.1&lt;/code&gt; hotfix relaxed the parameter clamp from &lt;code&gt;Fs ≥ Fc&lt;/code&gt; to &lt;code&gt;Fs ≥ 0&lt;/code&gt; so the established workaround of setting &lt;code&gt;Fs = 0&lt;/code&gt; (which makes &lt;code&gt;g(0) = 0&lt;/code&gt; in the static Stribeck curve) was honored again. That removed the &lt;code&gt;±Fc&lt;/code&gt; step at every zero crossing and stopped the chatter.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;3.24.0&lt;/code&gt; reverts that relaxation — the textbook invariant &lt;code&gt;stictionFrictionForce ≥ coulombFrictionForce&lt;/code&gt; is enforced for every &lt;code&gt;model&lt;/code&gt; by writeback at the start of each iterate. Setting &lt;code&gt;Fs&lt;/code&gt; below &lt;code&gt;Fc&lt;/code&gt; is silently raised to &lt;code&gt;Fc&lt;/code&gt;. The chatter would return.&lt;/p&gt;
&lt;p&gt;Instead, &lt;code&gt;3.24.0&lt;/code&gt; introduces a new &lt;code&gt;model&lt;/code&gt; value — &lt;code&gt;CONTINUOUS_TANH&lt;/code&gt; — based on Makkar et al. 2005, a continuously-differentiable tanh-based formulation. It eliminates the zero-crossing discontinuity &lt;em&gt;by construction&lt;/em&gt;, without needing to abuse the stiction parameter. See &lt;code&gt;papers/README.md&lt;/code&gt; for the literature.&lt;/p&gt;
&lt;h2 id=&#34;how-to-migrate&#34;&gt;How to migrate&lt;/h2&gt;
&lt;p&gt;Three changes per affected actuator config:&lt;/p&gt;
&lt;h3 id=&#34;1-switch-the-model&#34;&gt;1. Switch the model&lt;/h3&gt;
&lt;p&gt;In your config (&lt;code&gt;control.xml&lt;/code&gt;, &lt;code&gt;*.link.json&lt;/code&gt;, or wherever you set parameters), set:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;model = 2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;2&lt;/code&gt; corresponds to &lt;code&gt;CONTINUOUS_TANH&lt;/code&gt;. Values: &lt;code&gt;0&lt;/code&gt; = &lt;code&gt;LUGRE_DYNAMIC&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt; = &lt;code&gt;STATIC_SIGN&lt;/code&gt; (the pre-3.24.0 default), &lt;code&gt;2&lt;/code&gt; = &lt;code&gt;CONTINUOUS_TANH&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If your existing config still has &lt;code&gt;useStaticFriction = 0/1&lt;/code&gt;, it continues to work. The legacy key is registered as &lt;code&gt;PARAMETER_VOLATILE&lt;/code&gt;: loaded from &lt;code&gt;control.xml&lt;/code&gt; at boot, but &lt;strong&gt;dropped from runtime saves&lt;/strong&gt; — once you save the config, only &lt;code&gt;model&lt;/code&gt; is persisted. At startup the alias is mapped to &lt;code&gt;model&lt;/code&gt; (&lt;code&gt;1 → STATIC_SIGN&lt;/code&gt;, &lt;code&gt;0 → LUGRE_DYNAMIC&lt;/code&gt;) only when &lt;code&gt;model&lt;/code&gt; itself has not been set; an explicit &lt;code&gt;model = N&lt;/code&gt; in the same XML always wins. A one-shot deprecation warning is logged per block whenever the alias is applied. If neither &lt;code&gt;model&lt;/code&gt; nor &lt;code&gt;useStaticFriction&lt;/code&gt; is set, the block falls back to &lt;code&gt;STATIC_SIGN&lt;/code&gt; (the pre-3.24.0 default). Replace &lt;code&gt;useStaticFriction&lt;/code&gt; with &lt;code&gt;model = N&lt;/code&gt; to silence the warning and to enable &lt;code&gt;CONTINUOUS_TANH&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;2-restore-stictionfrictionforce-to-a-physical-value&#34;&gt;2. Restore &lt;code&gt;stictionFrictionForce&lt;/code&gt; to a physical value&lt;/h3&gt;
&lt;p&gt;Set &lt;code&gt;stictionFrictionForce&lt;/code&gt; to its actual measured/physical value, satisfying &lt;code&gt;stictionFrictionForce ≥ coulombFrictionForce&lt;/code&gt;. Typical ratio is &lt;code&gt;Fs ≈ 1.5·Fc&lt;/code&gt; to &lt;code&gt;2·Fc&lt;/code&gt;. &lt;strong&gt;Do not leave it at 0&lt;/strong&gt; — under &lt;code&gt;CONTINUOUS_TANH&lt;/code&gt; it would be writeback-clamped up to &lt;code&gt;coulombFrictionForce&lt;/code&gt; anyway, and you&amp;rsquo;d lose the Stribeck overshoot the new model is designed to represent.&lt;/p&gt;
&lt;h3 id=&#34;3-set-coulombvelocity&#34;&gt;3. Set &lt;code&gt;coulombVelocity&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Set the new parameter:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;coulombVelocity = stribeckVelocity / 10
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Default is &lt;code&gt;0.001&lt;/code&gt;, which matches &lt;code&gt;DEFAULT_STRIBECKVELOCITY / 10 = 0.01 / 10&lt;/code&gt;. For most setups, this default just works. If your &lt;code&gt;stribeckVelocity&lt;/code&gt; is significantly different from &lt;code&gt;0.01&lt;/code&gt;, scale &lt;code&gt;coulombVelocity&lt;/code&gt; proportionally. See &lt;a href=&#34;/docs/developing-control-applications/control-blocks/physical-models-and-compensation/friction-model/&#34;&gt;&lt;code&gt;friction-model.md&lt;/code&gt;&lt;/a&gt; §2.2 for the full tuning recipe.&lt;/p&gt;
&lt;h2 id=&#34;example-diff&#34;&gt;Example diff&lt;/h2&gt;
&lt;p&gt;For a config previously running on &lt;code&gt;3.23.1&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;color:#a40000&#34;&gt;- stictionFrictionForce = 0          # 3.23.1 hack to smooth zero crossing
&lt;/span&gt;&lt;span style=&#34;color:#a40000&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00a000&#34;&gt;+ stictionFrictionForce = 18         # physical stiction, satisfies Fs &amp;gt;= Fc=10
&lt;/span&gt;&lt;span style=&#34;color:#00a000&#34;&gt;+ model                 = 2          # CONTINUOUS_TANH (Makkar 2005)
&lt;/span&gt;&lt;span style=&#34;color:#00a000&#34;&gt;+ coulombVelocity       = 0.001      # = stribeckVelocity / 10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;coulombFrictionForce&lt;/code&gt;, &lt;code&gt;stribeckVelocity&lt;/code&gt;, &lt;code&gt;viscousFrictionDamping&lt;/code&gt;, and &lt;code&gt;preSlidingDisplacement&lt;/code&gt; keep their old values.&lt;/p&gt;
&lt;h2 id=&#34;what-you-give-up-what-you-gain&#34;&gt;What you give up, what you gain&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Give up:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Fs = 0&lt;/code&gt; parameter hack. It&amp;rsquo;s now writeback-clamped.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Gain:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A C¹ friction model — derivative is bounded everywhere, including at &lt;code&gt;v = 0&lt;/code&gt;. No step changes at zero crossings.&lt;/li&gt;
&lt;li&gt;A textbook-supported formulation citable to Makkar et al. 2005 — auditable against published literature.&lt;/li&gt;
&lt;li&gt;The textbook &lt;code&gt;Fs ≥ Fc&lt;/code&gt; invariant is restored, matching every standard friction-model implementation (Simscape, Modelica, etc.).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CollisionDetector&lt;/code&gt; near-zero-speed sensitivity is preserved (no velocity deadzone).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;verification&#34;&gt;Verification&lt;/h2&gt;
&lt;p&gt;After updating the config, drive the actuator through a zero-velocity crossing and observe the friction feedforward output. Expected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Output transitions smoothly through zero (no step).&lt;/li&gt;
&lt;li&gt;Peak friction force near &lt;code&gt;|v| ≈ stribeckVelocity&lt;/code&gt; exceeds &lt;code&gt;coulombFrictionForce&lt;/code&gt; and approaches &lt;code&gt;stictionFrictionForce&lt;/code&gt; (the Stribeck overshoot).&lt;/li&gt;
&lt;li&gt;At higher speeds (&lt;code&gt;|v| ≫ stribeckVelocity&lt;/code&gt;), the friction force settles to &lt;code&gt;coulombFrictionForce + viscousFrictionDamping·v&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unit tests T1, T2, T3 in &lt;code&gt;test/utest_frictioncompensation.cpp&lt;/code&gt; exercise this on the simulated block — T1 documents the old chatter source in &lt;code&gt;STATIC_SIGN&lt;/code&gt;, T2 asserts continuity in &lt;code&gt;CONTINUOUS_TANH&lt;/code&gt;, T3 reproduces the customer&amp;rsquo;s sinusoid scenario in both modes side-by-side.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;User guide: &lt;a href=&#34;/docs/developing-control-applications/control-blocks/physical-models-and-compensation/friction-model/&#34;&gt;&lt;code&gt;friction-model.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Papers: &lt;code&gt;papers/README.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;3.23.1 hotfix branch: &lt;code&gt;fix/friction-stiction-below-coulomb&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
  </channel>
</rss>
