flightdb – Flight Controller Database, logging and param system

Flight Controller Database Interface

Access to the parameter and logging systems on CodeAIR’s Crazyflie flight controller.

See also Crazyflie Client Library

class codeair.flightdb.LogManager[source]

Interface to query the CF logging framework:

  • Retrieve the list of available logging items (TOC) : [(id, type, group, name), …]

  • Register new logging configs (log blocks)

  • Start/Stop logging

  • Also handle fetching of Param TOC, since logic is identical.

This class uses crtp – Crazy Real Time Protocol to implement the log interface

check_catalog_crcs()[source]

Read CRCs from flight controller, return True if they match catalog import

decode_log(blk_id, timestamp_ms, data)[source]

Decode received log values for this block, updating self.cache.

enable(do_enable)[source]

Resume / pause logging. NOTE: Must register_items() FIRST, before enable!

fetch_toc(port, info_only=False)[source]

Request TOC info, either PARAM or LOG based on port (CRTP_PORT_LOG or CRTP_PORT_PARAM)

generate_catalog(filename='new_flight_catalog.py')[source]

Create Python file with log/param TOCs to bake into new CodeAIR builds

register_items(item_list, rate=0.1)[source]

Register and start logging the given list of items. Removes all prior logging. Rate is seconds. item_list contains strings of form ‘group.variable’.

Internals:

  • The Crazyflie allows up to 16 “log blocks” to be registered.

  • You register a log block by supplying a list of [TYPE8:ID16] tuples referring to TOC items.

  • The resulting LOG_CH reports for a block must fit within a 30 byte packet, where 4 bytes are consumed with [BLK_ID_8, TIMESTAMP_24], leaving 26 bytes cumulative payload for log values. This means the max number of IDs you can register in a block depends on the size of the items (8/16/32 bits).

  • Ex: you could register up to 6 32-bit items in a log block.

Our Python API exposes a single function to register an id_list, hiding the underlying “log block” system.

  • We don’t support dynamically appending/deleting discrete blocks. All are created/removed at once.

  • Currently we don’t support different rates for different params. The underlying system has a rate for each block.

  • Currently supports only a single log block.

    • TODO: Extend to create up to max (16) blocks to support more log items.

Protocol:

  • CRTP(CRTP_PORT_LOG, CONTROL_CH)

  • Create block: ( CONTROL_CREATE_BLOCK_V2_8, BLK_ID_8, [TYPE_8, ID_16]*n )

  • Delete all: (CONTROL_RESET)

Notes: Successful registration will initialize -

self.cache # {'name': None,...}  # Dict keyed by names from all blocks
self.log_blocks = [
        [name0, name1,...],  # list of names in this block
        decode_fmt_str,  # struct format str for decoding this log block
        val_sz,   # = struct.calcsize(decode_fmt_str)
        reg_fields,  # registration fields (packet payload)
]
Returns

True if id_list can be registered, False if it would exceed logging payload limits or if list contains an invalid ID.

Return type

bool

send_ctrl_cmd(cmd, data, callback=None)[source]

Send control channel command, and callback(err_code) upon ACK. Zero means no error.

unregister_all()[source]

Delete all registered log blocks

class codeair.flightdb.ParamManager(log_mgr)[source]

Interface to query the CF parameter framework. Unlike logging, we don’t register for events in the param system.

get(group_dot_name)[source]

Read parameter. Returns data or None.

set(group_dot_name, value)[source]

Set parameter based on dotted name, ex: ‘motorPowerSet.enable’

set_by_name(group_dot_name, type_id, value)[source]

Set param without using TOC lookup (lookup on STM32 instead)

codeair.flightdb.read_crtp(port, channel, timeout_ms=100)[source]

Pump raw rx queue from flight controller, return selected data or None if timeout(ms)

Download Source