test_vscmgInitialization

Verify VSCMG attachment initialization and repeatable configuration validation.

test_vscmgInitialization.configuration(model)[source]

Create a device with finite geometry and nonzero spin and gimbal inertia.

test_vscmgInitialization.coupled_configuration_with_invalid_divisor(case)[source]

Construct finite inputs that produce a zero or overflowing coupled divisor.

test_vscmgInitialization.simulation_with_effector(config, priority=None)[source]

Attach one device and optionally schedule its command-processing lifecycle.

test_vscmgInitialization.test_attachment_matches_both_scheduler_orders(model)[source]

Derived properties and propagation must agree with either Reset ordering or no scheduled Reset.

test_vscmgInitialization.test_coupled_divisor_is_checked_again_during_propagation()[source]

A valid startup must not bypass guards when a later dynamics evaluation is singular.

test_vscmgInitialization.test_device_count_at_payload_capacity_processes_last_command(model)[source]

The largest supported array must command and publish its last device correctly.

test_vscmgInitialization.test_device_count_exceeding_payload_capacity_is_rejected(path)[source]

Reject oversized device arrays before accessing fixed-size message payloads.

test_vscmgInitialization.test_fully_coupled_device_allows_massless_gimbal()[source]

Only wheel and total mass are divisors in fully coupled initialization.

test_vscmgInitialization.test_gimbal_friction_uses_its_own_smoothing_ratio(wheel_ratio)[source]

Gimbal smoothing must be independent of the wheel friction configuration.

test_vscmgInitialization.test_invalid_configuration_rejected(path, field, value, match)[source]

Reject each invalid configuration before state registration or derived divisions.

test_vscmgInitialization.test_invalid_coupled_divisors_stop_initialization(case, divisor)[source]

Fail before dividing by a singular coupled inertia or elimination coefficient.

test_vscmgInitialization.test_invalid_coupled_spin_divisor_is_rejected_by_reset(case)[source]

Validate the configuration-dependent spin divisor without linked parent states.

test_vscmgInitialization.test_invalid_linear_friction_threshold_is_rejected(limit_field, ratio_field, limit, ratio)[source]

Finite settings must not create a zero, negative, or infinite friction divisor.

test_vscmgInitialization.test_massless_device_has_finite_derived_values(model)[source]

Balanced and simple jitter devices retain support for zero translational mass.

test_vscmgInitialization.test_mixed_models_publish_only_their_own_jitter_angles(models)[source]

Output indexing must follow the compact jitter state array when models are mixed.

test_vscmgInitialization.test_motor_arithmetic_overflow_is_rejected_before_applying_torque()[source]

Finite commands and friction must not silently overflow the applied torque.

test_vscmgInitialization.test_negative_motor_limits_and_friction_ratios_remain_supported()[source]

Negative sentinels disable limits and friction smoothing without rejecting valid commands.

test_vscmgInitialization.test_nonfinite_command_is_rejected_before_motor_processing(field, value)[source]

Reject non-finite commanded torques before saturation or friction can mask them.

test_vscmgInitialization.test_nonfinite_motor_configuration_is_rejected(path, value, field)[source]

Reject non-finite motor settings through both configuration entry points.

test_vscmgInitialization.test_repeated_reset_normalizes_axes_and_preserves_states(scale)[source]

Repeated normalization is stable and Reset does not rewind integrated states or applied torques.

test_vscmgInitialization.test_uncoupled_models_reject_zero_inertia_divisor(model, field)[source]

Reject zero denominators without requiring positive translational mass.