NML Hand Exoskeleton Logo

Getting started

  • Quickstart
    • Prerequisites
    • Install
    • Check the applications without opening hardware
    • Connect
    • Before motion
  • Python usage
    • Install the package
    • USB serial
    • TCP bridge
    • Motor commands
    • Applications
  • Frequently Asked Questions (FAQ)
    • General Questions
    • Safety
    • Troubleshooting
    • More Information

Integration

  • CircuitPython Wi-Fi Server
    • Software Setup
    • Hardware Setup
    • HTTP Webpage
  • Manual Button State Machine
    • Overview
    • Hardware Setup
    • Interaction Logic

API reference

  • Python API reference
    • Package version
      • __version__
    • Device and transport API
      • BaseComm
        • BaseComm.connect()
        • BaseComm.disconnect()
        • BaseComm.send()
        • BaseComm.receive()
        • BaseComm.is_connected()
        • BaseComm.flush_input()
        • BaseComm.fast_telemetry_device()
      • DualHandExo
        • DualHandExo.close()
        • DualHandExo.info()
        • DualHandExo.send_command()
        • DualHandExo.get_motor_angle()
        • DualHandExo.set_motor_angle()
        • DualHandExo.get_absolute_motor_angle()
        • DualHandExo.set_absolute_motor_angle()
        • DualHandExo.get_motor_torque()
        • DualHandExo.get_motor_current()
        • DualHandExo.enable_motor()
        • DualHandExo.disable_motor()
        • DualHandExo.home()
        • DualHandExo.apply_calibration()
        • DualHandExo.set_zero_offset()
        • DualHandExo.set_flip()
        • DualHandExo.set_motor_limits()
        • DualHandExo.set_debug()
        • DualHandExo.set_exo_mode()
      • DualSerialComm
        • DualSerialComm.MAX_TELEMETRY_LINES
        • DualSerialComm.MAX_QUEUED_REPLIES
        • DualSerialComm.connect()
        • DualSerialComm.telemetry_lines()
        • DualSerialComm.reader_alive()
        • DualSerialComm.close()
        • DualSerialComm.send()
        • DualSerialComm.receive()
        • DualSerialComm.is_connected()
        • DualSerialComm.flush_input()
        • DualSerialComm.fast_telemetry_device()
      • FakeHandExo
        • FakeHandExo.logger()
        • FakeHandExo.set_comm()
        • FakeHandExo.connect()
        • FakeHandExo.close()
        • FakeHandExo.get_imu_angles()
        • FakeHandExo.set_imu_angles()
        • FakeHandExo.get_motor_angles()
        • FakeHandExo.set_motor_angles()
        • FakeHandExo.home()
        • FakeHandExo.set_gesture_state()
      • GestureController
        • GestureController.POSTURE_STATES
        • GestureController.JOINT_STATES
        • GestureController.set_gesture()
        • GestureController.get_current_gesture()
      • HandExo
        • HandExo.logger()
        • HandExo.detect_side()
        • HandExo.set_comm()
        • HandExo.connect()
        • HandExo.send_command()
        • HandExo.get_fast_telemetry()
        • HandExo.configure_shadow_telemetry()
        • HandExo.start_shadow_telemetry()
        • HandExo.stop_shadow_telemetry()
        • HandExo.get_shadow_telemetry()
        • HandExo.enable_motor()
        • HandExo.enable_motors_by_id()
        • HandExo.is_enabled()
        • HandExo.disable_motor()
        • HandExo.disable_motors_by_id()
        • HandExo.enable_led()
        • HandExo.disable_led()
        • HandExo.help()
        • HandExo.set_debug()
        • HandExo.version()
        • HandExo.firmware_version()
        • HandExo.firmware_at_least()
        • HandExo.require_gesture_angle_support()
        • HandExo.home()
        • HandExo.info()
        • HandExo.get_baudrate()
        • HandExo.set_baudrate()
        • HandExo.get_motor_velocity()
        • HandExo.set_motor_velocity()
        • HandExo.get_motor_velocity_limit()
        • HandExo.set_motor_velocity_limit()
        • HandExo.get_present_velocity()
        • HandExo.set_direct_velocity()
        • HandExo.get_motor_acceleration()
        • HandExo.set_motor_acceleration()
        • HandExo.get_motor_angle()
        • HandExo.set_motor_angle()
        • HandExo.get_absolute_motor_angle()
        • HandExo.set_absolute_motor_angle()
        • HandExo.get_home()
        • HandExo.set_home()
        • HandExo.get_motor_torque()
        • HandExo.get_motor_current()
        • HandExo.get_motor_current_limit()
        • HandExo.set_current_limit()
        • HandExo.set_total_current_limit()
        • HandExo.get_total_current_limit()
        • HandExo.set_hold_current()
        • HandExo.set_current_governor()
        • HandExo.current_status()
        • HandExo.get_goal_current()
        • HandExo.set_direct_current()
        • HandExo.stop_direct_control()
        • HandExo.hold_motor_position()
        • HandExo.release_motor_hold()
        • HandExo.set_direct_command_timeout()
        • HandExo.set_control_mode()
        • HandExo.get_motor_limits()
        • HandExo.set_motor_upper_limit()
        • HandExo.set_motor_lower_limit()
        • HandExo.set_motor_limits()
        • HandExo.reboot_motor()
        • HandExo.get_motor_mode()
        • HandExo.set_motor_mode()
        • HandExo.get_exo_mode()
        • HandExo.set_exo_mode()
        • HandExo.get_gesture()
        • HandExo.set_gesture()
        • HandExo.set_gesture_angle()
        • HandExo.get_gesture_angle()
        • HandExo.get_gesture_sang()
        • HandExo.get_gesture_angles()
        • HandExo.set_gesture_state()
        • HandExo.get_gesture_list()
        • HandExo.cycle_gesture()
        • HandExo.cycle_gesture_state()
        • HandExo.set_zero_offset()
        • HandExo.set_flip()
        • HandExo.apply_calibration()
        • HandExo.calibrate_exo()
        • HandExo.enable_oled()
        • HandExo.disable_oled()
        • HandExo.get_oled_status()
        • HandExo.close()
        • HandExo.get_imu_data()
        • HandExo.get_imu_angles()
        • HandExo.get_imu_heading()
        • HandExo.get_imu_roll()
        • HandExo.get_imu_pitch()
        • HandExo.set_yaw_angle()
        • HandExo.get_gesture_state()
      • LSLClient
        • LSLClient.start_streaming()
        • LSLClient.stop_streaming()
        • LSLClient.get_latest_window()
        • LSLClient.get_connection_status()
        • LSLClient.get_metadata()
      • LSLMarkerSubscriber
        • LSLMarkerSubscriber.start()
        • LSLMarkerSubscriber.stop()
        • LSLMarkerSubscriber.set_callback()
        • LSLMarkerSubscriber.get_recent_markers()
        • LSLMarkerSubscriber.get_markers_since()
        • LSLMarkerSubscriber.poll_latest()
        • LSLMarkerSubscriber.pull()
        • LSLMarkerSubscriber.metadata()
      • LSLMessagePublisher
        • LSLMessagePublisher.publish()
        • LSLMessagePublisher.close()
      • LSLNumericSubscriber
        • LSLNumericSubscriber.start()
        • LSLNumericSubscriber.stop()
        • LSLNumericSubscriber.get_latest_window()
        • LSLNumericSubscriber.metadata()
      • ProtocolResponseError
      • SerialComm
        • SerialComm.connect()
        • SerialComm.close()
        • SerialComm.send()
        • SerialComm.receive()
        • SerialComm.is_connected()
        • SerialComm.flush_input()
        • SerialComm.fast_telemetry_device()
      • TCPComm
        • TCPComm.connect()
        • TCPComm.close()
        • TCPComm.send()
        • TCPComm.receive()
        • TCPComm.is_connected()
    • Calibration
      • CalibrationProfileStore
        • CalibrationProfileStore.profile_path()
        • CalibrationProfileStore.list_profiles()
        • CalibrationProfileStore.load_profile()
        • CalibrationProfileStore.get_default_profile_name()
        • CalibrationProfileStore.save_profile()
        • CalibrationProfileStore.set_default_profile()
      • build_motor_orientation()
      • determine_run_number()
      • get_default_profile_name()
      • list_profiles()
      • load_profile()
      • normalize_angle()
      • profile_path()
      • save_profile()
      • set_default_profile()
    • Intent decoding
      • ContinuousRestAdapter
        • ContinuousRestAdapter.coefficients
        • ContinuousRestAdapter.scale
        • ContinuousRestAdapter.global_baseline
        • ContinuousRestAdapter.ridge
        • ContinuousRestAdapter.fit()
        • ContinuousRestAdapter.baseline()
        • ContinuousRestAdapter.transform()
      • DecoderDecision
        • DecoderDecision.state
        • DecoderDecision.signed_intent
        • DecoderDecision.confidence
        • DecoderDecision.rejected
        • DecoderDecision.reason
        • DecoderDecision.probabilities
        • DecoderDecision.open_activation
        • DecoderDecision.close_activation
        • DecoderDecision.raw_signed_projection
      • FeatureConfig
        • FeatureConfig.common_mode
        • FeatureConfig.log_compress
        • FeatureConfig.include_waveform_length
      • IntentCaptureSession
        • IntentCaptureSession.participant_id
        • IntentCaptureSession.device_name
        • IntentCaptureSession.channel_count
        • IntentCaptureSession.features
        • IntentCaptureSession.labels
        • IntentCaptureSession.groups
        • IntentCaptureSession.roll_deg
        • IntentCaptureSession.pitch_deg
        • IntentCaptureSession.emg_windows
        • IntentCaptureSession.comfort
        • IntentCaptureSession.add()
        • IntentCaptureSession.arrays()
        • IntentCaptureSession.class_counts()
        • IntentCaptureSession.save()
        • IntentCaptureSession.load()
      • IntentDecoderPipeline
        • IntentDecoderPipeline.rest_label
        • IntentDecoderPipeline.open_label
        • IntentDecoderPipeline.close_label
        • IntentDecoderPipeline.confidence_threshold
        • IntentDecoderPipeline.effort_deadband
        • IntentDecoderPipeline.active_reference_quantile
        • IntentDecoderPipeline.require_orientation
        • IntentDecoderPipeline.adapter
        • IntentDecoderPipeline.model
        • IntentDecoderPipeline.fit()
        • IntentDecoderPipeline.project_continuous()
        • IntentDecoderPipeline.predict()
      • OrientationSample
        • OrientationSample.roll_deg
        • OrientationSample.pitch_deg
        • OrientationSample.gyro_norm
        • OrientationSample.accel_norm
        • OrientationSample.is_available
      • PairEvaluation
        • PairEvaluation.open_label
        • PairEvaluation.close_label
        • PairEvaluation.balanced_accuracy
        • PairEvaluation.balanced_accuracy_std
        • PairEvaluation.rest_false_activation_rate
        • PairEvaluation.reject_false_activation_rate
        • PairEvaluation.direction_confusion_rate
        • PairEvaluation.composite_score
        • PairEvaluation.folds
      • PreprocessConfig
        • PreprocessConfig.sample_rate_hz
        • PreprocessConfig.highpass_hz
        • PreprocessConfig.lowpass_hz
        • PreprocessConfig.notch_hz
        • PreprocessConfig.notch_quality
      • ShrinkageLDAIntentModel
        • ShrinkageLDAIntentModel.scaler
        • ShrinkageLDAIntentModel.classifier
        • ShrinkageLDAIntentModel.fit()
        • ShrinkageLDAIntentModel.classes
        • ShrinkageLDAIntentModel.predict()
        • ShrinkageLDAIntentModel.predict_proba()
      • StreamLayout
        • StreamLayout.emg_channels
        • StreamLayout.accel_channels
        • StreamLayout.gyro_channels
        • StreamLayout.from_specs()
        • StreamLayout.select_emg()
        • StreamLayout.mean_accel()
        • StreamLayout.mean_gyro()
      • SignalQuality
        • SignalQuality.channel_rms
        • SignalQuality.flat_channels
        • SignalQuality.saturated_channels
        • SignalQuality.noisy_channels
        • SignalQuality.usable_fraction
      • assess_signal_quality()
      • canonical_intent_label()
      • extract_emg_features()
      • import_xdf_file()
      • import_xdf_session()
      • orientation_from_accel()
      • parse_channel_spec()
      • preprocess_emg()
      • rank_intent_pairs()
      • IntentOutputStabilizer
        • IntentOutputStabilizer.ema_alpha
        • IntentOutputStabilizer.max_step
        • IntentOutputStabilizer.enter_threshold
        • IntentOutputStabilizer.open_enter_threshold
        • IntentOutputStabilizer.close_enter_threshold
        • IntentOutputStabilizer.release_threshold
        • IntentOutputStabilizer.switch_samples
        • IntentOutputStabilizer.output_gain
        • IntentOutputStabilizer.response_exponent
        • IntentOutputStabilizer.value
        • IntentOutputStabilizer.direction
        • IntentOutputStabilizer.pending_direction
        • IntentOutputStabilizer.pending_count
        • IntentOutputStabilizer.reset()
        • IntentOutputStabilizer.update()
  • C++ firmware API
NML Hand Exoskeleton
  • Overview: module code

All modules for which code is available

  • nml_hand_exo.calibration.profiles
  • nml_hand_exo.calibration.rom
  • nml_hand_exo.decoding.contracts
  • nml_hand_exo.decoding.features
  • nml_hand_exo.decoding.layout
  • nml_hand_exo.decoding.models
  • nml_hand_exo.decoding.orientation
  • nml_hand_exo.decoding.pipeline
  • nml_hand_exo.decoding.preprocessing
  • nml_hand_exo.decoding.selection
  • nml_hand_exo.decoding.session
  • nml_hand_exo.decoding.stabilization
  • nml_hand_exo.decoding.xdf_session
  • nml_hand_exo.interface._dual_hand_exo
  • nml_hand_exo.interface._fake_hand_exo
  • nml_hand_exo.interface._gesture_controller
  • nml_hand_exo.interface._hand_exo
  • nml_hand_exo.interface._interfaces
  • nml_hand_exo.interface._lsl_client
  • nml_hand_exo.interface._lsl_publisher
  • nml_hand_exo.interface._lsl_subscriber

© Copyright 2026, Neuromechatronics Lab.

Built with Sphinx using a theme provided by Read the Docs.