i
The Tactile Sensing Utilities are part of the Bota Control Toolkit. It is highly advisable to first read about the Bota Control Toolkit to understand the broader context and architecture.

Tactile Sensing Utilities

The Bota Tactile Sensing Utilities are a collection of utilities that turn a six-axis force/torque measurement into tactile information. These utilities cleanly encapsulate the contact mechanics, and are offered as two blocks:

Contact Point

Estimates the point of application on a known contact surface, and reports whether a contact is present at all.

Slip Detector

Estimates whether a contact is slipping, by comparing the wrench at the contact point against the friction limits of the contact.

Tactile Mathematics

Definitions

For the algorithms presented below, there are two reference frames to consider:

  • The contact point frame is the reference frame located at the contact point on the surface.

  • The sensor frame is the reference frame located at the origin of the sensor measuring the wrench.

Note

The reference frame in the case of a wrench signal indicates the origin from which the torque signal is measured. See more about this in the transformation utilities page.

Tactile sensing force diagram

Forces referenced in the contact point and in the sensor frame.

Tactile sensing moment diagram

Torques referenced in the contact point and in the sensor frame.

The terminology used in the figures above, and in the equations below is the following:

Symbol

Description

\(F_{contact}\)

Contact force: the total force at the contact point.

\(F^{n}_{contact}\)

Normal component of the contact force, perpendicular to the contact surface.

\(F^{t}_{contact}\)

Tangential component of the contact force, parallel to the contact surface (in-plane shear force).

\(F_{sensor}\)

Force measured by the sensor (reference at the sensor frame).

\(M_{contact}\)

Contact torque: the total torque at the contact point.

\(M^{n}_{contact}\)

Torsional component of the contact torque, about the normal to the contact surface.

\(M^{t}_{contact}\)

Tangential component of the contact torque, which is zero for a point contact.

\(M_{sensor}\)

Torque measured by the sensor (reference at the sensor frame).

\(\mathbf{n}\)

Unit vector normal to the contact surface.

\(\mathbf{p}_c\)

Position of the contact point relative to the sensor origin.

Contact Point

The core assumption to be able to compute a point of contact is that the contact is punctual, i.e., it occurs at a single point. If a distributed contact occurs, or there are several contact points, the algorithm will report the center of pressure.

A single point cannot transmit a torque about an axis lying in the contact plane. At the contact point \(\mathbf{p}_c\) the contact torque must therefore be purely torsional, i.e. parallel to the outward surface normal \(\mathbf{n}\). So the tangential component of the contact torque must be zero:

(1)\[M^{t}_{contact} = \left( I - \mathbf{n}\mathbf{n}^T \right) M_{contact} = 0\]

The contact torque can be computed from the sensor measurements by transforming the reference point of the wrench signal. This equation is the same one encapsulated in the transformation utilities package.

(2)\[M_{contact} = M_{sensor} - \mathbf{p}_c \times F_{sensor}\]

Combining (1) and (2), and defining \(M^{n}_{contact} = M_{contact} \cdot \mathbf{n}\) as the pure torsional torque:

(3)\[\mathbf{p}_c \times F_{sensor} = M_{sensor} - M^{n}_{contact} \, \mathbf{n}\]

Line of action

Taking the dot product of (3) with \(F_{sensor}\) eliminates \(\mathbf{p}_c\) and we can solve for the pure torsion torque scalar as shown in (4):

(4)\[M^{n}_{contact} = \frac{F_{sensor} \cdot M_{sensor}}{F_{sensor} \cdot \mathbf{n}}\]

With \(M^{n}_{contact}\) known, the solutions of (3) form the line of action of the contact force:

(5)\[\mathbf{p}(\lambda) = \frac{F_{sensor} \times \left( M_{sensor} - M^{n}_{contact} \, \mathbf{n} \right)}{\lVert F_{sensor} \rVert^2} + \lambda \, \frac{F_{sensor}}{\lVert F_{sensor} \rVert}, \qquad \lambda \in \mathbb{R}\]

All points on this line produce the same wrench measured at the sensor, so the actual contact point must lie on this line and can be determined by intersecting this line with the contact surface.

Intersection with the contact surface

The sensor surface is described in the sensor frame by an implicit function \(S(\mathbf{p}) = 0\), with \(S < 0\) inside the body and \(S > 0\) outside. Its outward normal is \(\mathbf{n} = \nabla S / \lVert \nabla S \rVert\). The surface must be:

  • convex, so the line of action crosses it at most twice;

  • smooth (\(\nabla S \neq 0\)), so the normal is defined everywhere.

We assume a unilateral contact, i.e., the environment can push on the sensor but not pull it, so

(6)\[F_{sensor} \cdot \mathbf{n}(\mathbf{p}_c) < 0\]

Solution

The unknowns \(\mathbf{p}_c\) and \(M^{n}_{contact}\) satisfy:

(7)\[\begin{split}\begin{cases} S(\mathbf{p}_c) = 0 \\ \mathbf{n} = \nabla S(\mathbf{p}_c) / \lVert \nabla S(\mathbf{p}_c) \rVert \\ \mathbf{p}_c \times F_{sensor} = M_{sensor} - M^{n}_{contact} \, \mathbf{n} \\ F_{sensor} \cdot \mathbf{n} < 0 \end{cases}\end{split}\]

The system is generally nonlinear, since \(\mathbf{n}\) depends on \(\mathbf{p}_c\). It can be solved iteratively:

  1. Set \(M^{n}_{contact} = 0\).

  2. Compute the line of action (5).

  3. Solve \(S(\mathbf{p}(\lambda)) = 0\) for \(\lambda\) (closed form for planes, spheres, cylinders; 1D root finder otherwise) and keep the root satisfying (6).

  4. Update \(\mathbf{n}(\mathbf{p}_c)\) and \(M^{n}_{contact}\) with (4); repeat from step 2 until \(\mathbf{p}_c\) converges.

If torsion torque \(M^{n}_{contact}\) is negligible, one iteration suffices.

Warning

\(\lVert F_{sensor} \rVert^2\) and \(F_{sensor} \cdot \mathbf{n}\) appear in denominators, so the estimate is ill-conditioned for small forces. Compute the contact point only when \(\lVert F_{sensor} \rVert\) exceeds a threshold related to the sensor noise.

Example: flat surface

A plane parallel to the sensor \(xy\) plane at height \(d_z\), with outward normal \(+z\): \(S(\mathbf{p}) = p_z - d_z\), \(\mathbf{n} = \mathbf{e}_z\). The normal is constant, so the system is linear. With \(\mathbf{p}_c = [p_x, \, p_y, \, d_z]^T\):

\[\begin{split}M_x &= p_y F_z - d_z F_y &\Rightarrow\quad p_x &= (d_z F_x - M_y) / F_z \\ M_y &= d_z F_x - p_x F_z &\Rightarrow\quad p_y &= (M_x + d_z F_y) / F_z \\ M_z &= p_x F_y - p_y F_x + M^{n}_{contact} &\Rightarrow\quad M^{n}_{contact} &= M_z - p_x F_y + p_y F_x\end{split}\]

There is a single intersection, so (6) reduces to the validity check \(F_z < 0\).


Slip Detector

To detect slip, the load on the contact is compared with what friction can supply, i.e. whether the contact wrench lies inside the friction cone.

The force \(F_{contact}\) and the contact torque \(M_{contact}\) from the contact point computation are decomposed along the outward normal \(\mathbf{n}(\mathbf{p}_c)\):

(8)\[F^{n}_{contact} = F_{contact} \cdot \mathbf{n} = F_{sensor} \cdot \mathbf{n}, \qquad F^{t}_{contact} = \left( I - \mathbf{n}\mathbf{n}^T \right) F_{sensor}, \qquad M^{n}_{contact} = M_{contact} \cdot \mathbf{n}\]

Friction capacity scales with the normal force, so slip is declared when a load-to-normal-force ratio exceeds the corresponding friction coefficient:

(9)\[\rho_{\text{lin}} = \frac{\lVert F^{t}_{contact} \rVert}{\lvert F^{n}_{contact} \rvert} > \mu_{\text{lin}} \quad\text{(linear slip)}, \qquad \rho_{\text{tor}} = \frac{\lvert M^{n}_{contact} \rvert}{\lvert F^{n}_{contact} \rvert} > \mu_{\text{tor}} \quad\text{(torsional slip)}\]

Note

\(\rho_{\text{lin}}\) and \(\mu_{\text{lin}}\) are dimensionless; \(\rho_{\text{tor}}\) and \(\mu_{\text{tor}}\) are lengths, the lever arm at which the friction force would act to produce the torsion. \(\mu_{\text{tor}}\) grows with the contact patch size, which is why a wide, soft finger resists twisting better than a hard point at the same normal force.

Both ratios divide by \(F^{n}_{contact}\), so the slip detector uses the same force threshold as the contact point computation: no contact, no slip verdict.


Ready to Get Started?

1

Learn the Concept

Understand the usage pattern, where these blocks sit in a processing chain and how they are configured.

2

Choose Your SDK

Select your preferred development platform and get started with the demos.

Tip: New here? Start with the Concept page. Already familiar? Jump straight to the SDK documentation.