Xylo-Imu RealTime Mode With Sensor Input#
Realtime mode with sensor input is typically used for production.
Here is an example that displays infinite running with sensor input, which bases on packages :
- samna 0.33.1
import samna
import time
def initialize_board() :
dk = samna.device.open_device("XyloImuTestBoard:0")
buf = samna.graph.sink_from(dk.get_model_source_node())
source = samna.graph.source_to(dk.get_model_sink_node())
return dk, buf, source
dk, buf, source = initialize_board()
graph = samna.graph.EventFilterGraph()
_, etf, state_buf = graph.sequential([dk.get_model_source_node(), "XyloImuOutputEventTypeFilter", samna.graph.JitSink()])
etf.set_desired_type('xyloImu::event::Readout')
graph.start()
def apply_configuration():
dk.enable_manual_input_acceleration(False) # Use sensor input instead of manual input
xylo_config = samna.xyloImu.configuration.XyloConfiguration()
xylo_config.operation_mode = samna.xyloImu.OperationMode.RealTime
input_count = 3
hidden_count = 5
output_count = 2
xylo_config.input.weights = [[1] * hidden_count] * input_count
xylo_config.hidden.weights = [[1] * hidden_count] * hidden_count
hidden_neurons = [samna.xyloImu.configuration.HiddenNeuron()] * hidden_count
xylo_config.hidden.neurons = hidden_neurons
output_neurons = [samna.xyloImu.configuration.OutputNeuron()] * output_count
xylo_config.readout.neurons = output_neurons
xylo_config.readout.weights = [[1] * output_count] * hidden_count
# Preparation to run in realtime mode with input interface opened.
xylo_config.debug.always_update_omp_stat = True
xylo_config.imu_if_input_enable = True
xylo_config.debug.imu_if_clk_enable = True
xylo_config.time_resolution_wrap = 0x61a80
xylo_config.debug.imu_if_clock_freq_div = 0x169
# Open and config input interface of Xylo-IMU, you could customize the parameters.
xylo_config.input_interface.enable = True
xylo_config.input_interface.estimator_k_setting = 6
xylo_config.input_interface.select_iaf_output = True
xylo_config.input_interface.update_matrix_threshold = 255
xylo_config.input_interface.delay_threshold = 1
xylo_config.input_interface.bpf_bb_values = [6] * 15
xylo_config.input_interface.bpf_bwf_values = [8] * 15
xylo_config.input_interface.bpf_baf_values = [9] * 15
xylo_config.input_interface.bpf_a1_values = [-64700, -64458, -64330, -64138, -63884, -63566, -63169, -62743, -62238, -61672, -61045, -60357, -59611, -58805, -57941]
xylo_config.input_interface.bpf_a2_values = [31935] + [31754] * 14
xylo_config.input_interface.scale_values = [8]*15
xylo_config.input_interface.iaf_threshold_values = [0x000007d0] * 15
dk.get_model().apply_configuration(xylo_config)
return xylo_config, input_count, hidden_count, output_count
xylo_config, input_count, hidden_count, output_count = apply_configuration()
def keep_receiving(duration: int):
begin = time.time()
recv_count = 0
while time.time() - begin < duration:
evts = state_buf.get_events()
if evts:
recv_count += len(evts)
# Only three attributes of `Readout` event are available in realtime mode: `timestep`, `output_spike`, `output_v_mem`.
print("Get readout events: ", evts)
source.write([samna.xyloImu.event.TriggerProcessing()]) # Command chip to trigger infinitely.
# Keep receiving for 3 seconds.
keep_receiving(3)
print("Running infinitely...")
# You could stop running manually to debug status by command `source.write([samna.xyloImu.event.TriggerProcessing(target_timestep=0)])`.
graph.stop()