Repository navigation
Tactile Schema: New Feature and Feedbacks Collection #1289
lotusl-code
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Summary
We are adding first-class support for tactile sensors, such as taxel arrays on gloves and robot hands, as an upcoming feature. The design adds two FlatBuffers tables:
TactileData: per-frame force readings, one entry per taxel.TactileShape: the device's static layout, meaning where each taxel sits on a hand skeleton and how it moves with the hand.A generated
TactileTrackerships both, and they work with live sessions, MCAP recording and replay, and the retargeting graph.Status: in development, not yet released. Implementation: #1242.
This thread has three purposes:
Why
Tactile devices differ widely in taxel count, placement and mounting. A consumer needs two things to use a reading: the forces, and where each force was measured on the bodypart (like hand). Consumers include retargeting, visualization, recording and policy learning. The design separates the two because they change at very different rates.
Design
Data flow
TactileShape: static layoutConventions
The skeleton follows OpenXR hand joints:
joints[i]isXrHandJointEXTordinali, and the hierarchy is acyclic.Taxels follow the hand by Linear Blend Skinning over four slots:
where$j_k$ is $w_k$ is $\mathbf{p}^{\text{bind}}$ is the taxel's $j$ 's current joint-to-hand-root transform. Both transforms are rigid; the sum blends transformed points, not poses.
joint_indices[k],joint_weights[k],position, $\mathbf{T}^{\text{bind}}{j}$ is joint $j$'sbind_pose, and $\mathbf{T}^{\text{current}}{j}$ is jointSize: 32 bytes per joint plus 68 bytes per taxel. A 26-joint hand with 200 taxels is about 14 KB. There's no size limit for TactileShape.
TactileData: per framemax_flatbuffer_sizeto the tracker.DeviceDataTimestampin its MCAP record.Why the layout is tracker metadata, not a second stream
TactileShapeis fixed for a device, so it is published as the tracker's metadata rather than as timestamped samples.Using it
TactileData,TactileShape) are built from NumPy arrays, which are validated for lengths and joint indices. Every field reads back as a zero-copy NumPy view.Producers
TactileDataon the data collection every frame.TactileShapeon"<collection_id>/metadata"periodically:SchemaPusherandSchemaMetadataPusher;TensorPushTracker.Consumers
Major approach of reading tactile data is device plugins, which is a separate process that the session starts, reads the device and publishes
TactileDataandTactileShape. The application declares the plugin and reads the data throughTactileSource; both sides use the same collection id.TactileSource. It outputs the forces and the shape as fixed-size arrays.Example:
examples/tactilehas a mock feeder and a printer that run end to end without hardware, including MCAP recording and replay.Feedback we are looking for
Once released, these schemas follow the repository's schema evolution rules: tables can gain new optional fields, but structs can never change, because recordings embed their schema. Feedbacks are therefore most valuable before release.
We are open to any feedback on any part of the design. Some directions for example:
When you reply, it helps to include your device or use case: taxel count, rate, measured quantities, and where the taxels are mounted.
What's next
We will update this thread with:
All reactions