TeslasuitDocumentation

APIs

One SDK, two languages

Native access to haptics, motion capture and biometry on the Suit and Glove. The C API is the core library; Python is a first-class binding over it — same devices, same concepts, same assets.

from teslasuit_sdk import ts_api
from teslasuit_sdk.ts_mapper import TsBone2dIndex

api = ts_api.TsApi()
device = api.get_device_manager().get_or_wait_last_device_attached()
player, mapper = device.haptic, api.mapper

layout = mapper.get_haptic_electric_channel_layout(device.get_mapping())
bones = mapper.get_layout_bones(layout)
channels = mapper.get_bone_contents(bones[TsBone2dIndex.RightUpperArm.value])

params = player.create_touch_parameters(10000, 40, 120)  # period µs (10000 = 100 Hz)
player.play_playable(player.create_touch(params, channels, 3000))

Pick your language

Python APIRecommended

The fastest path from idea to a working prototype. Powers RapidKit.

C APINative

Lowest latency and full control — the library every other surface is built on.

Body & channel map

The real TeslasuitXR5 mapping, unwrapped — front on the left, back on the right, all 80 channels in place. Click a channel (or a muscle group on the EMS layer) to get the exact create_touch() call that drives it.

frontback
unwrapped suit · click a channel

Right upper arm

frontchannel 1

On TsBone2dIndex.RightUpperArmget_bone_contents() returns this bone's channels; the snippet plays just this one.

RightUpperArm channels (7) · click to select
Amplitude40%
Pulse width120µs
Duration3000ms
Safety: Calibrate the device in Control Center before running any stimulation. Start with low amplitude and short duration; stop immediately if anything feels wrong.
# Right upper arm · channel 1 (front)  →  TsBone2dIndex.RightUpperArm
channels = mapper.get_bone_contents(bones[TsBone2dIndex.RightUpperArm.value])  # 7 channels on this bone
channel = channels[0]  # the selected channel
params = player.create_touch_parameters(10000, amplitude=40, pulse_width=120)  # period in µs (10000 = 100 Hz) · amplitude is a percent (1–100)
playable_id = player.create_touch(params, [channel], duration=3000)  # play this one channel for 3000 ms
player.play_playable(playable_id)
Building in an engine instead? The Unity and Unreal plugins wrap these same APIs. Prototyping a loop? Start with RapidKit.Plugins →Frameworks →