<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title> – Transformations</title>
    <link>/docs/applications/configure_application/axes_control/transformation/</link>
    <description>Recent content in Transformations on </description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="/docs/applications/configure_application/axes_control/transformation/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Position transformation</title>
      <link>/docs/applications/configure_application/axes_control/transformation/position-transformation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/applications/configure_application/axes_control/transformation/position-transformation/</guid>
      <description>
        
        
        &lt;p&gt;The position transformation turns the ticks the drive reports into the axis position at the load, and turns the position target back into ticks. All paths are under &lt;code&gt;root/AxesControl/actuatorControlLoops/actuatorControlLoopNN/&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;mcx-svg mcx-axis&#34; role=&#34;group&#34; aria-label=&#34;Between the drive and axes control sits positionTransformation, with its offset, gain and gearbox. From the drive, motorPositionActual in ticks goes in and actuatorPositionActual in rad or m at the load comes out. Towards the drive, actuatorPositionTarget goes in and motorPositionTarget in ticks comes out.&#34;&gt;
&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 760 190&#34; width=&#34;100%&#34;&gt;
  &lt;defs&gt;
    &lt;marker id=&#34;mcx-pos-fwd&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-fwd&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-pos-back&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-back&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-pos-line&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-line&#34;/&gt;&lt;/marker&gt;
  &lt;/defs&gt;
  &lt;g class=&#34;mcx-ax-drive&#34;&gt;&lt;rect x=&#34;16&#34; y=&#34;30&#34; width=&#34;70&#34; height=&#34;140&#34; rx=&#34;12&#34;/&gt;&lt;text class=&#34;mcx-ax-title&#34; x=&#34;51&#34; y=&#34;105&#34;&gt;Drive&lt;/text&gt;&lt;/g&gt;
  &lt;g class=&#34;mcx-ax-plain&#34;&gt;&lt;rect x=&#34;290&#34; y=&#34;30&#34; width=&#34;180&#34; height=&#34;140&#34; rx=&#34;12&#34;/&gt;
    &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;380&#34; y=&#34;88&#34;&gt;positionTransformation&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;380&#34; y=&#34;108&#34;&gt;offset, gain, gearbox&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;380&#34; y=&#34;124&#34;&gt;(gain: transducer/gain)&lt;/text&gt;&lt;/g&gt;
  &lt;g class=&#34;mcx-ax-grey&#34;&gt;&lt;rect x=&#34;674&#34; y=&#34;30&#34; width=&#34;70&#34; height=&#34;140&#34; rx=&#34;12&#34;/&gt;&lt;text class=&#34;mcx-ax-title&#34; x=&#34;709&#34; y=&#34;100&#34;&gt;Axes&lt;/text&gt;&lt;text class=&#34;mcx-ax-sub&#34; x=&#34;709&#34; y=&#34;116&#34;&gt;control&lt;/text&gt;&lt;/g&gt;
  &lt;path class=&#34;mcx-ax-fwd&#34; d=&#34;M674 66 L472 66&#34; marker-end=&#34;url(#mcx-pos-fwd)&#34;/&gt;
  &lt;path class=&#34;mcx-ax-fwd&#34; d=&#34;M290 66 L88 66&#34; marker-end=&#34;url(#mcx-pos-fwd)&#34;/&gt;
  &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;573&#34; y=&#34;58&#34;&gt;actuatorPositionTarget&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;188&#34; y=&#34;58&#34;&gt;motorPositionTarget&lt;/text&gt;
  &lt;path class=&#34;mcx-ax-back&#34; d=&#34;M88 134 L288 134&#34; marker-end=&#34;url(#mcx-pos-back)&#34;/&gt;
  &lt;path class=&#34;mcx-ax-back&#34; d=&#34;M472 134 L672 134&#34; marker-end=&#34;url(#mcx-pos-back)&#34;/&gt;
  &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;188&#34; y=&#34;126&#34;&gt;motorPositionActual&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;573&#34; y=&#34;126&#34;&gt;actuatorPositionActual&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-label&#34; x=&#34;188&#34; y=&#34;160&#34;&gt;ticks&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-label&#34; x=&#34;573&#34; y=&#34;160&#34;&gt;rad or m, at the load&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-label&#34; x=&#34;188&#34; y=&#34;20&#34;&gt;drive side&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-label&#34; x=&#34;573&#34; y=&#34;20&#34;&gt;application side&lt;/text&gt;
&lt;/svg&gt;

&lt;/div&gt;

&lt;p&gt;Set it up in this order; click a step to jump to it.&lt;/p&gt;
&lt;div class=&#34;mcx-svg mcx-axis&#34; role=&#34;group&#34; aria-label=&#34;Four steps: 1 encoder and gearbox, from ticks to rad or m; 2 direction, the sign of gainNum; 3 zero position, homing sets the offset; 4 power cycle, optional persistence.&#34;&gt;
&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 760 104&#34; width=&#34;100%&#34;&gt;
  &lt;defs&gt;
    &lt;marker id=&#34;mcx-pst-fwd&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-fwd&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-pst-back&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-back&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-pst-line&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-line&#34;/&gt;&lt;/marker&gt;
  &lt;/defs&gt;
  &lt;a href=&#34;#enter-the-encoder-and-gearbox&#34; aria-label=&#34;Step 1: Encoder, gearbox&#34;&gt;
    &lt;title&gt;Step 1: Encoder, gearbox&lt;/title&gt;
    &lt;g class=&#34;mcx-ax-card&#34;&gt;&lt;rect x=&#34;16&#34; y=&#34;22&#34; width=&#34;164&#34; height=&#34;64&#34; rx=&#34;12&#34;/&gt;
      &lt;text class=&#34;mcx-ax-title&#34; x=&#34;98.0&#34; y=&#34;50&#34;&gt;Encoder, gearbox&lt;/text&gt;
      &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;98.0&#34; y=&#34;68&#34;&gt;ticks to rad or m&lt;/text&gt;
      &lt;circle class=&#34;mcx-ax-num&#34; cx=&#34;20&#34; cy=&#34;26&#34; r=&#34;11&#34;/&gt;&lt;text class=&#34;mcx-ax-num-text&#34; x=&#34;20&#34; y=&#34;30&#34;&gt;1&lt;/text&gt;&lt;/g&gt;
  &lt;/a&gt;
  &lt;path class=&#34;mcx-ax-line&#34; d=&#34;M184 54 L202 54&#34; marker-end=&#34;url(#mcx-pst-line)&#34;/&gt;
  &lt;a href=&#34;#check-the-direction&#34; aria-label=&#34;Step 2: Direction&#34;&gt;
    &lt;title&gt;Step 2: Direction&lt;/title&gt;
    &lt;g class=&#34;mcx-ax-card&#34;&gt;&lt;rect x=&#34;206&#34; y=&#34;22&#34; width=&#34;164&#34; height=&#34;64&#34; rx=&#34;12&#34;/&gt;
      &lt;text class=&#34;mcx-ax-title&#34; x=&#34;288.0&#34; y=&#34;50&#34;&gt;Direction&lt;/text&gt;
      &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;288.0&#34; y=&#34;68&#34;&gt;sign of gainNum&lt;/text&gt;
      &lt;circle class=&#34;mcx-ax-num&#34; cx=&#34;210&#34; cy=&#34;26&#34; r=&#34;11&#34;/&gt;&lt;text class=&#34;mcx-ax-num-text&#34; x=&#34;210&#34; y=&#34;30&#34;&gt;2&lt;/text&gt;&lt;/g&gt;
  &lt;/a&gt;
  &lt;path class=&#34;mcx-ax-line&#34; d=&#34;M374 54 L392 54&#34; marker-end=&#34;url(#mcx-pst-line)&#34;/&gt;
  &lt;a href=&#34;#set-the-zero-position&#34; aria-label=&#34;Step 3: Zero position&#34;&gt;
    &lt;title&gt;Step 3: Zero position&lt;/title&gt;
    &lt;g class=&#34;mcx-ax-card&#34;&gt;&lt;rect x=&#34;396&#34; y=&#34;22&#34; width=&#34;164&#34; height=&#34;64&#34; rx=&#34;12&#34;/&gt;
      &lt;text class=&#34;mcx-ax-title&#34; x=&#34;478.0&#34; y=&#34;50&#34;&gt;Zero position&lt;/text&gt;
      &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;478.0&#34; y=&#34;68&#34;&gt;homing sets offset&lt;/text&gt;
      &lt;circle class=&#34;mcx-ax-num&#34; cx=&#34;400&#34; cy=&#34;26&#34; r=&#34;11&#34;/&gt;&lt;text class=&#34;mcx-ax-num-text&#34; x=&#34;400&#34; y=&#34;30&#34;&gt;3&lt;/text&gt;&lt;/g&gt;
  &lt;/a&gt;
  &lt;path class=&#34;mcx-ax-line&#34; d=&#34;M564 54 L582 54&#34; marker-end=&#34;url(#mcx-pst-line)&#34;/&gt;
  &lt;a href=&#34;#keep-the-position-after-a-power-cycle&#34; aria-label=&#34;Step 4: Power cycle&#34;&gt;
    &lt;title&gt;Step 4: Power cycle&lt;/title&gt;
    &lt;g class=&#34;mcx-ax-card mcx-ax-grey&#34;&gt;&lt;rect x=&#34;586&#34; y=&#34;22&#34; width=&#34;164&#34; height=&#34;64&#34; rx=&#34;12&#34;/&gt;
      &lt;text class=&#34;mcx-ax-title&#34; x=&#34;668.0&#34; y=&#34;50&#34;&gt;Power cycle&lt;/text&gt;
      &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;668.0&#34; y=&#34;68&#34;&gt;optional: persistence&lt;/text&gt;
      &lt;circle class=&#34;mcx-ax-num&#34; cx=&#34;590&#34; cy=&#34;26&#34; r=&#34;11&#34;/&gt;&lt;text class=&#34;mcx-ax-num-text&#34; x=&#34;590&#34; y=&#34;30&#34;&gt;4&lt;/text&gt;&lt;/g&gt;
  &lt;/a&gt;
&lt;/svg&gt;

&lt;/div&gt;

&lt;h4 id=&#34;enter-the-encoder-and-gearbox&#34;&gt;Enter the encoder and gearbox&lt;/h4&gt;
&lt;p&gt;Three things turn ticks into a position: the encoder resolution, the unit you count in, and the gearbox. The first two are under &lt;code&gt;positionTransformation/transducer/&lt;/code&gt;, the gearbox is on the control loop itself. Together they make the gain: &lt;code&gt;ticksPerRevolution × gainNum / gainDen&lt;/code&gt; ticks per unit at the motor, divided by the gearbox ratio at the load.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Rotary axis in rad&lt;/th&gt;
&lt;th&gt;Linear axis in m&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ticksPerRevolution&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encoder ticks per motor revolution&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1048576&lt;/code&gt;: 20-bit encoder&lt;/td&gt;
&lt;td&gt;&lt;code&gt;524288&lt;/code&gt;: 19-bit encoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gainNum&lt;/code&gt;, &lt;code&gt;gainDen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Motor revolutions per unit, as a fraction. A negative &lt;code&gt;gainNum&lt;/code&gt; reverses the direction&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;6.283185&lt;/code&gt;: one revolution is 2π rad&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;: count in revolutions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gearboxLoadSide&lt;/code&gt;, &lt;code&gt;gearboxMotorSide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Motor revolutions per revolution, or metre, at the load. Leave at &lt;code&gt;1&lt;/code&gt; if the drive applies the gearbox itself&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;80&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;: 80:1 gearbox&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;: 100 motor revolutions per metre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;offset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ticks at the zero position&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set by homing&lt;/td&gt;
&lt;td&gt;Set by homing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rotary axis:&lt;/strong&gt; the standard robot configuration uses these values, with a 1:1 gearbox.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linear axis:&lt;/strong&gt; a motor turns a spindle with a 10 mm pitch through two pulleys of the same size, so the carriage moves 10 mm per motor revolution. Counting in revolutions and setting the gearbox to 100:1 makes the axis read metres.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;/docs/applications/configure_application/axes_control/transformation/_media/spindelExample.png&#34;
         alt=&#34;Motor driving a spindle through two pulleys&#34; width=&#34;350&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;To check your numbers, read back &lt;code&gt;positionTransformation/transducer/gain&lt;/code&gt;, the ticks per unit at the motor, and move the axis a known distance while you watch &lt;code&gt;actuatorPositionActual&lt;/code&gt;. The positions of all axes together are in &lt;code&gt;root/AxesControl/axesPositionsActual&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;check-the-direction&#34;&gt;Check the direction&lt;/h4&gt;
&lt;p&gt;Position, 3D view and controllers all assume the axis counts up when it moves in its positive direction. If it counts down, the 3D view moves the wrong way. If position, velocity and torque disagree in sign, a controller pushes the axis away from its target instead of towards it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Engage the axis and jog it a small distance in the positive direction.&lt;/li&gt;
&lt;li&gt;Watch &lt;code&gt;actuatorPositionActual&lt;/code&gt;, and the 3D view if your application has one. Both must move the same way as the real axis.&lt;/li&gt;
&lt;li&gt;If they move the other way, make &lt;code&gt;gainNum&lt;/code&gt; negative. Do the same in the &lt;a href=&#34;#velocity&#34;&gt;velocity&lt;/a&gt; and &lt;a href=&#34;#torque&#34;&gt;torque&lt;/a&gt; transformations, so all three agree.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;set-the-zero-position&#34;&gt;Set the zero position&lt;/h4&gt;
&lt;p&gt;Right after start-up the encoder&amp;rsquo;s ticks say nothing about where the axis is. Homing, also called referencing, fixes that: with the axis at a known position, the transducer stores the offset that makes it read that position:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;offset = ticks at that moment − reference position × gain&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;From then on the axis reads the right position everywhere.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Move the axis to a position you know, for example straight up at 0°.&lt;/li&gt;
&lt;li&gt;Reference the axis. In the standard robot GUI: enter the position in &lt;strong&gt;Reference&lt;/strong&gt; on the axis settings tab and press &lt;strong&gt;Reference&lt;/strong&gt;, or &lt;strong&gt;Reference All&lt;/strong&gt; for every axis. See &lt;a href=&#34;/docs/applications/robot_app/usage/user_interface/robot_axis_settings/homing/&#34;&gt;Homing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check that &lt;code&gt;actuatorPositionActual&lt;/code&gt;, and the 3D view, now match the real axis.&lt;/li&gt;
&lt;li&gt;Save the parameter tree, so the offset survives a restart.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;keep-the-position-after-a-power-cycle&#34;&gt;Keep the position after a power cycle&lt;/h4&gt;
&lt;p&gt;You only need this for an encoder that does not keep its position without power, such as one that only counts within one turn. Without it you home the axis after every power cycle. Persistence stores the position at power off and checks it at start-up:&lt;/p&gt;
&lt;div class=&#34;mcx-svg mcx-axis&#34; role=&#34;group&#34; aria-label=&#34;At power off, persistence.bin keeps the ticks and the offset. At start-up the transducer compares them with the encoder, giving deltaTicks. If the absolute deltaTicks is at most deltaTicksMax, the axis is still referenced and the offset is corrected. If not, leaving Off raises ES_NOT_REFERENCED (508) and the axis must be homed again.&#34;&gt;
&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 760 190&#34; width=&#34;100%&#34;&gt;
  &lt;defs&gt;
    &lt;marker id=&#34;mcx-per-fwd&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-fwd&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-per-back&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-back&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-per-line&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-line&#34;/&gt;&lt;/marker&gt;
  &lt;/defs&gt;
  &lt;g class=&#34;mcx-ax-plain&#34;&gt;&lt;rect x=&#34;16&#34; y=&#34;55&#34; width=&#34;180&#34; height=&#34;80&#34; rx=&#34;12&#34;/&gt;
    &lt;text class=&#34;mcx-ax-title&#34; x=&#34;106.0&#34; y=&#34;82.0&#34;&gt;Power off&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;106.0&#34; y=&#34;99.0&#34;&gt;persistence.bin keeps&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;106.0&#34; y=&#34;116.0&#34;&gt;the ticks and offset&lt;/text&gt;
  &lt;/g&gt;
  &lt;g class=&#34;mcx-ax-plain&#34;&gt;&lt;rect x=&#34;236&#34; y=&#34;55&#34; width=&#34;190&#34; height=&#34;80&#34; rx=&#34;12&#34;/&gt;
    &lt;text class=&#34;mcx-ax-title&#34; x=&#34;331.0&#34; y=&#34;82.0&#34;&gt;Start-up&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;331.0&#34; y=&#34;99.0&#34;&gt;compares with the encoder:&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;331.0&#34; y=&#34;116.0&#34;&gt;deltaTicks&lt;/text&gt;
  &lt;/g&gt;
  &lt;g class=&#34;mcx-ax-ok&#34;&gt;&lt;rect x=&#34;476&#34; y=&#34;12&#34; width=&#34;268&#34; height=&#34;72&#34; rx=&#34;12&#34;/&gt;
    &lt;text class=&#34;mcx-ax-title&#34; x=&#34;610.0&#34; y=&#34;35.0&#34;&gt;✓ Still referenced&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;610.0&#34; y=&#34;52.0&#34;&gt;|deltaTicks| ≤ deltaTicksMax,&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;610.0&#34; y=&#34;69.0&#34;&gt;offset corrected&lt;/text&gt;
  &lt;/g&gt;
  &lt;g class=&#34;mcx-ax-bad&#34;&gt;&lt;rect x=&#34;476&#34; y=&#34;106&#34; width=&#34;268&#34; height=&#34;72&#34; rx=&#34;12&#34;/&gt;
    &lt;text class=&#34;mcx-ax-title&#34; x=&#34;610.0&#34; y=&#34;129.0&#34;&gt;✕ Not referenced&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;610.0&#34; y=&#34;146.0&#34;&gt;ES_NOT_REFERENCED (508) on leaving Off:&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;610.0&#34; y=&#34;163.0&#34;&gt;home the axis again&lt;/text&gt;
  &lt;/g&gt;
  &lt;path class=&#34;mcx-ax-line&#34; d=&#34;M196 95 L234 95&#34; marker-end=&#34;url(#mcx-per-line)&#34;/&gt;
  &lt;path class=&#34;mcx-ax-line&#34; d=&#34;M426 95 C 450 95, 450 48, 474 48&#34; marker-end=&#34;url(#mcx-per-line)&#34;/&gt;
  &lt;path class=&#34;mcx-ax-line&#34; d=&#34;M426 95 C 450 95, 450 142, 474 142&#34; marker-end=&#34;url(#mcx-per-line)&#34;/&gt;
&lt;/svg&gt;

&lt;/div&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter under &lt;code&gt;positionTransformation/transducer/&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enablePersistence&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt; stores the ticks and offset in &lt;code&gt;persistence.bin&lt;/code&gt; and checks them at start-up&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deltaTicksMax&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The largest movement, in ticks, that still counts as the same position. The standard robot configuration uses &lt;code&gt;10000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deltaTicks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output: how far the encoder moved while the power was off&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enableSingleTurnCounter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt; counts the whole turns of an encoder that restarts at &lt;code&gt;0&lt;/code&gt; every turn&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;Set &lt;code&gt;enablePersistence&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;deltaTicksMax&lt;/code&gt; to the movement you accept, then save the parameter tree.&lt;/li&gt;
&lt;li&gt;Home the axis.&lt;/li&gt;
&lt;li&gt;Switch the controller off and on, and read &lt;code&gt;deltaTicks&lt;/code&gt;: it shows how far the encoder moved in between.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If &lt;code&gt;deltaTicks&lt;/code&gt; is larger than &lt;code&gt;deltaTicksMax&lt;/code&gt;, leaving Off raises the emergency stop &lt;code&gt;ES_NOT_REFERENCED&lt;/code&gt; (508). Home the axis again to clear it.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Velocity transformation</title>
      <link>/docs/applications/configure_application/axes_control/transformation/velocity-transformation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/applications/configure_application/axes_control/transformation/velocity-transformation/</guid>
      <description>
        
        
        &lt;p&gt;The velocity transformation turns the drive&amp;rsquo;s &lt;code&gt;Velocity actual value&lt;/code&gt; into rad/s or m/s at the load, and the velocity target back into drive units. It has no offset. Paths are under &lt;code&gt;actuatorControlLoopNN/velocityTransformation/transducer/&lt;/code&gt;.&lt;/p&gt;
&lt;details style=&#34;border:1px solid #f5f5f5; border-radius:0px; background:#f6f6f7; padding:0.7em 1em 0.7em 1em; margin:1em 0;&#34;&gt;
  &lt;summary style=&#34;font-weight:600; cursor:pointer; color:#1976d2; padding:0.2em 0;&#34;&gt;
    Using the standard robot GUI?
  &lt;/summary&gt;
  &lt;div style=&#34;margin-top:0.7em;&#34;&gt;
    &lt;p&gt;The velocity transformation is under &lt;strong&gt;Motor Velocity&lt;/strong&gt; on the axis settings tab. Press &lt;strong&gt;Save Settings&lt;/strong&gt; to keep your changes. See &lt;a href=&#34;/docs/applications/robot_app/usage/user_interface/robot_axis_settings/&#34;&gt;Robot axis settings&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/docs/applications/configure_application/axes_control/transformation/_media/velocityTransformation.png&#34;
         alt=&#34;Motor Velocity panel of the robot GUI: Ticks Conversion 1, Gain num -60, Gain den 6.283 and Filter freq. 50 Hz, with Ticks Conversion marked 1 and the gains marked 2&#34; width=&#34;500&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ticks Conversion&lt;/strong&gt;: &lt;code&gt;ticksPerRevolution&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gain num&lt;/strong&gt; and &lt;strong&gt;Gain den&lt;/strong&gt;: &lt;code&gt;gainNum&lt;/code&gt; and &lt;code&gt;gainDen&lt;/code&gt;. The example, &lt;code&gt;-60&lt;/code&gt; and &lt;code&gt;6.283&lt;/code&gt;, is a drive that counts in rpm, with the direction reversed.&lt;/li&gt;
&lt;/ol&gt;

  &lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;Choose the values from the unit the drive uses:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Drive unit&lt;/th&gt;
&lt;th&gt;&lt;code&gt;ticksPerRevolution&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;gainNum&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;gainDen&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Revolutions per second&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.283185&lt;/code&gt; (2π)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rpm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;60&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.283185&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.001 rpm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;60&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.283185&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoder ticks per second&lt;/td&gt;
&lt;td&gt;the encoder resolution&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.283185&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The gearbox ratio of the axis applies here too. Give &lt;code&gt;gainNum&lt;/code&gt; the same sign as in the position transformation.&lt;/p&gt;
&lt;h4 id=&#34;velocity-from-the-position&#34;&gt;Velocity from the position&lt;/h4&gt;
&lt;p&gt;To derive the actual velocity from the position instead of the drive&amp;rsquo;s velocity value, set &lt;code&gt;actuatorControlLoopNN/usePositionActualFilteredForVelocity&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt;. Use this when the drive&amp;rsquo;s velocity value is not mapped in its PDOs.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Torque transformation</title>
      <link>/docs/applications/configure_application/axes_control/transformation/torque-offset-transformation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/applications/configure_application/axes_control/transformation/torque-offset-transformation/</guid>
      <description>
        
        
        &lt;p&gt;Three drive entries carry a torque: &lt;code&gt;Target torque&lt;/code&gt;, &lt;code&gt;Torque offset&lt;/code&gt; and &lt;code&gt;Torque actual value&lt;/code&gt;. Two transformations convert them, and they must have the same settings:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transformation&lt;/th&gt;
&lt;th&gt;Converts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;torqueTransformation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The torque target and the actual torque&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;torqueOffsetTransformation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The torque offset, the feedforward torque sent in CSP and CSV&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;details style=&#34;border:1px solid #f5f5f5; border-radius:0px; background:#f6f6f7; padding:0.7em 1em 0.7em 1em; margin:1em 0;&#34;&gt;
  &lt;summary style=&#34;font-weight:600; cursor:pointer; color:#1976d2; padding:0.2em 0;&#34;&gt;
    Using the standard robot GUI?
  &lt;/summary&gt;
  &lt;div style=&#34;margin-top:0.7em;&#34;&gt;
    &lt;p&gt;Both transformations are on the axis settings tab: &lt;code&gt;torqueTransformation&lt;/code&gt; under &lt;strong&gt;Motor Torque&lt;/strong&gt;, &lt;code&gt;torqueOffsetTransformation&lt;/code&gt; under &lt;strong&gt;Motor Torque Offset&lt;/strong&gt;. Press &lt;strong&gt;Save Settings&lt;/strong&gt; to keep your changes. See &lt;a href=&#34;/docs/applications/robot_app/usage/user_interface/robot_axis_settings/&#34;&gt;Robot axis settings&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/docs/applications/configure_application/axes_control/transformation/_media/torqueTransformation.png&#34;
         alt=&#34;Motor Torque and Motor Torque Offset panels of the robot GUI for axis 1, each with Gain num 1000 and Gain den 0.640 marked 1&#34; width=&#34;1000&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gain num&lt;/strong&gt; and &lt;strong&gt;Gain den&lt;/strong&gt;, in both panels: &lt;code&gt;gainNum&lt;/code&gt; and &lt;code&gt;gainDen&lt;/code&gt;. The example, &lt;code&gt;1000&lt;/code&gt; and &lt;code&gt;0.640&lt;/code&gt;, is a motor rated at 0.64 Nm.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The other fields show the values on either side: &lt;strong&gt;Motor Torque&lt;/strong&gt; (ticks) and &lt;strong&gt;Axis Torque&lt;/strong&gt; (Nm) are &lt;code&gt;motorTorqueActual&lt;/code&gt; and &lt;code&gt;actuatorTorqueActual&lt;/code&gt;; &lt;strong&gt;Axis TorqueOffset&lt;/strong&gt; (Nm) and &lt;strong&gt;Motor Offset Torque&lt;/strong&gt; (ticks) are &lt;code&gt;actuatorTorqueOffsetTarget&lt;/code&gt; and &lt;code&gt;motorTorqueOffsetTarget&lt;/code&gt;.&lt;/p&gt;

  &lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;CiA402 drives usually count torque in thousandths of the motor&amp;rsquo;s rated torque. Then the gain is &lt;code&gt;1000 / rated torque&lt;/code&gt;: set &lt;code&gt;gainNum&lt;/code&gt; to &lt;code&gt;1000&lt;/code&gt; and &lt;code&gt;gainDen&lt;/code&gt; to the rated torque in Nm. For a motor rated at 0.64 Nm, &lt;code&gt;gainNum&lt;/code&gt; &lt;code&gt;1000&lt;/code&gt; and &lt;code&gt;gainDen&lt;/code&gt; &lt;code&gt;0.64&lt;/code&gt;. Leave &lt;code&gt;ticksPerRevolution&lt;/code&gt; at &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The gearbox works the other way round for torque: a 100:1 gearbox turns 1 Nm at the motor into 100 Nm at the load. The transformation takes care of that from the axis&amp;rsquo;s gearbox ratio. Give &lt;code&gt;gainNum&lt;/code&gt; the same sign as in the position transformation.&lt;/p&gt;
&lt;h4 id=&#34;check-it&#34;&gt;Check it&lt;/h4&gt;
&lt;p&gt;Hold the axis still against gravity, or push it gently by hand while it is engaged, and read &lt;code&gt;actuatorTorqueActual&lt;/code&gt; in Nm. It should have the sign of the force and a plausible size.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Sensor torque transformation</title>
      <link>/docs/applications/configure_application/axes_control/transformation/sensor-torque-transformation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/applications/configure_application/axes_control/transformation/sensor-torque-transformation/</guid>
      <description>
        
        
        &lt;p&gt;A joint torque sensor measures the torque at the load directly, where the motor torque is only an estimate. The sensor torque transformation turns its value into Nm. It works in one direction only, from the sensor to the application, and the gearbox ratio is not applied. Paths are under &lt;code&gt;actuatorControlLoopNN/&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;mcx-svg mcx-axis&#34; role=&#34;group&#34; aria-label=&#34;The torque sensor&amp;#39;s value, sensorTorqueActual in sensor units, goes into sensorTorqueTransformation, which applies offset and gain but no gearbox. Out comes actuatorSensorTorqueActual in Nm, for axes control. The values of all axes together are in root/AxesControl/sensorTorquesActual.&#34;&gt;
&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 760 150&#34; width=&#34;100%&#34;&gt;
  &lt;defs&gt;
    &lt;marker id=&#34;mcx-sts-fwd&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-fwd&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-sts-back&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-back&#34;/&gt;&lt;/marker&gt;
    &lt;marker id=&#34;mcx-sts-line&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;8&#34; refY=&#34;5&#34; markerWidth=&#34;6&#34; markerHeight=&#34;6&#34; orient=&#34;auto&#34;&gt;&lt;path d=&#34;M0 0 L10 5 L0 10 z&#34; class=&#34;mcx-ax-head-line&#34;/&gt;&lt;/marker&gt;
  &lt;/defs&gt;
  &lt;g class=&#34;mcx-ax-drive&#34;&gt;&lt;rect x=&#34;16&#34; y=&#34;30&#34; width=&#34;80&#34; height=&#34;90&#34; rx=&#34;12&#34;/&gt;&lt;text class=&#34;mcx-ax-title&#34; x=&#34;56&#34; y=&#34;72&#34;&gt;Torque&lt;/text&gt;&lt;text class=&#34;mcx-ax-title&#34; x=&#34;56&#34; y=&#34;90&#34;&gt;sensor&lt;/text&gt;&lt;/g&gt;
  &lt;g class=&#34;mcx-ax-plain&#34;&gt;&lt;rect x=&#34;236&#34; y=&#34;30&#34; width=&#34;220&#34; height=&#34;90&#34; rx=&#34;12&#34;/&gt;
    &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;346&#34; y=&#34;66&#34;&gt;sensorTorqueTransformation&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;346&#34; y=&#34;86&#34;&gt;offset and gain,&lt;/text&gt;
    &lt;text class=&#34;mcx-ax-sub&#34; x=&#34;346&#34; y=&#34;101&#34;&gt;no gearbox&lt;/text&gt;&lt;/g&gt;
  &lt;g class=&#34;mcx-ax-grey&#34;&gt;&lt;rect x=&#34;664&#34; y=&#34;30&#34; width=&#34;80&#34; height=&#34;90&#34; rx=&#34;12&#34;/&gt;&lt;text class=&#34;mcx-ax-title&#34; x=&#34;704&#34; y=&#34;72&#34;&gt;Axes&lt;/text&gt;&lt;text class=&#34;mcx-ax-sub&#34; x=&#34;704&#34; y=&#34;90&#34;&gt;control&lt;/text&gt;&lt;/g&gt;
  &lt;path class=&#34;mcx-ax-back&#34; d=&#34;M98 75 L234 75&#34; marker-end=&#34;url(#mcx-sts-back)&#34;/&gt;
  &lt;path class=&#34;mcx-ax-back&#34; d=&#34;M458 75 L662 75&#34; marker-end=&#34;url(#mcx-sts-back)&#34;/&gt;
  &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;166&#34; y=&#34;67&#34;&gt;sensorTorqueActual&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-mono&#34; x=&#34;560&#34; y=&#34;67&#34;&gt;actuatorSensorTorqueActual&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-label&#34; x=&#34;166&#34; y=&#34;95&#34;&gt;sensor units&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-label&#34; x=&#34;560&#34; y=&#34;95&#34;&gt;Nm&lt;/text&gt;
  &lt;text class=&#34;mcx-ax-label&#34; x=&#34;380&#34; y=&#34;142&#34;&gt;all axes together: root/AxesControl/sensorTorquesActual&lt;/text&gt;
&lt;/svg&gt;

&lt;/div&gt;

&lt;details style=&#34;border:1px solid #f5f5f5; border-radius:0px; background:#f6f6f7; padding:0.7em 1em 0.7em 1em; margin:1em 0;&#34;&gt;
  &lt;summary style=&#34;font-weight:600; cursor:pointer; color:#1976d2; padding:0.2em 0;&#34;&gt;
    Using the standard robot GUI?
  &lt;/summary&gt;
  &lt;div style=&#34;margin-top:0.7em;&#34;&gt;
    &lt;p&gt;The sensor torque transformation is under &lt;strong&gt;Torque Sensor Calibration&lt;/strong&gt; on the robot GUI&amp;rsquo;s &lt;strong&gt;Compliance&lt;/strong&gt; tab.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;/docs/applications/configure_application/axes_control/transformation/_media/sensorTorqueTransformation.png&#34;
         alt=&#34;Torque Sensor Calibration panel of the robot GUI for axis 1: Offset, GainNum, GainDen, Filter, Ref in Nm with a Ref button, Sensor Torques and Static Grav. Tq.&#34; width=&#34;900&#34;/&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Offset&lt;/strong&gt;, &lt;strong&gt;GainNum&lt;/strong&gt;, &lt;strong&gt;GainDen&lt;/strong&gt;: &lt;code&gt;transducer/offset&lt;/code&gt;, &lt;code&gt;transducer/gainNum&lt;/code&gt;, &lt;code&gt;transducer/gainDen&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ref&lt;/strong&gt; and the &lt;strong&gt;Ref&lt;/strong&gt; button: &lt;code&gt;referenceLoadSide&lt;/code&gt;, and the calibration trigger &lt;code&gt;setHardwareReference&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensor Torques&lt;/strong&gt;: the calibrated torque in Nm. &lt;strong&gt;Static Grav. Tq.&lt;/strong&gt;: the gravity torque the robot calculates for its current pose.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To calibrate in the GUI: set &lt;strong&gt;GainNum&lt;/strong&gt; and &lt;strong&gt;GainDen&lt;/strong&gt;, put the robot in a still pose, copy &lt;strong&gt;Static Grav. Tq.&lt;/strong&gt; into &lt;strong&gt;Ref&lt;/strong&gt;, press the &lt;strong&gt;Ref&lt;/strong&gt; button, and press &lt;strong&gt;Save Settings&lt;/strong&gt;.&lt;/p&gt;

  &lt;/div&gt;
&lt;/details&gt;
&lt;h4 id=&#34;enter-the-gain&#34;&gt;Enter the gain&lt;/h4&gt;
&lt;p&gt;Link the sensor&amp;rsquo;s value to &lt;code&gt;sensorTorqueActual&lt;/code&gt;, then tell the transformation how many sensor units make one Nm. The parameters are under &lt;code&gt;sensorTorqueTransformation/&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transducer/gainNum&lt;/code&gt;, &lt;code&gt;transducer/gainDen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sensor units per Nm, as a fraction. A negative &lt;code&gt;gainNum&lt;/code&gt; reverses the sign&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;referenceLoadSide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The torque in Nm the sensor should read when you calibrate&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transducer/offset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sensor value at zero torque, stored by the calibration&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Leave the gain at &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt; if the sensor already reports Nm.&lt;/p&gt;
&lt;h4 id=&#34;check-the-sign&#34;&gt;Check the sign&lt;/h4&gt;
&lt;p&gt;A sensor with the wrong sign reports every torque in the wrong direction. Engage the axis and hold it still in a pose where gravity loads the joint: the motor then carries the same torque as the sensor, so &lt;code&gt;actuatorSensorTorqueActual&lt;/code&gt; must have the same sign as &lt;code&gt;actuatorTorqueActual&lt;/code&gt;. If it has the opposite sign, make &lt;code&gt;transducer/gainNum&lt;/code&gt; negative.&lt;/p&gt;
&lt;h4 id=&#34;calibrate-the-zero&#34;&gt;Calibrate the zero&lt;/h4&gt;
&lt;p&gt;A torque sensor rarely reads exactly zero at zero torque. Calibration measures its offset in a pose where you know the torque on the joint, and stores it:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;offset = sensor value − referenceLoadSide × gain&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Put the axis in a still pose where you know the torque on the joint. On a robot that is the gravity torque, in &lt;code&gt;root/ManipulatorControl/idJointTorque/actual/gravity&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Write that torque to &lt;code&gt;sensorTorqueTransformation/referenceLoadSide&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;setHardwareReference&lt;/code&gt; in &lt;code&gt;sensorTorqueTransformation/transducer/referencing/:fromState&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt;, then back to &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check that &lt;code&gt;actuatorSensorTorqueActual&lt;/code&gt; now reads the known torque, then save the parameter tree.&lt;/li&gt;
&lt;/ol&gt;

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