Zubax Babel, Ark-Flow and pycyphal

Hi,
I’m trying to figure out how to read the messages coming from an Ark Flow module. I’m using a Zubax Babel on a mac (OSX 10.14.6), I tried on Windows 10 too.

For the hardware part:
Zubax Babel <-> Ark Flow <-> CAN Transceiver <-> Pycom FIPY
I use the FIPY as a hardware monitor. 120 ohm terminaison resistor are on both sides.

For the software part:

For the configuration part:

export YAKUT_PATH="$YAKUT_COMPILE_OUTPUT"
export PYCYPHAL_LOGLEVEL=DEBUG

export UAVCAN__SERIAL__IFACE="/dev/tty.usbmodem1431201"
export UAVCAN__CAN__BITRATE="1000000 1000000"
export UAVCAN__CAN__MTU="8"
export UAVCAN__NODE__ID="127"

minimal application code:

import sys
import os


compiled_dsdl_dir = os.getenv('YAKUT_COMPILE_OUTPUT')
if compiled_dsdl_dir is None:
    raise SystemExit('YAKUT_COMPILE_OUTPUT environment variable is not set')
sys.path.insert(0, compiled_dsdl_dir)



import pycyphal.application
import pyuavcan.presentation
import pyuavcan.transport
import uavcan.node


async def main():
    node_info = pycyphal.application.NodeInfo(software_version=uavcan.node.Version_1(major=1, minor=0), name="org.app")
    node = pycyphal.application.make_node(node_info)
    node.heartbeat_publisher.mode = uavcan.node.Mode_1.OPERATIONAL
    node.heartbeat_publisher.vendor_specific_status_code = os.getpid() % 100
    node.start()

    while 1:
        await asyncio.sleep(1)


asyncio.run(main())

logs from runtime:

2022-06-15 16:53:32,494 13803 DEBUG    asyncio: Using selector: KqueueSelector
2022-06-15 16:53:32,505 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Initialized with registers: KeysView(StaticBackend(':memory:', persistent=False))
2022-06-15 16:53:32,505 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.node.unique_id' <- uavcan.register.Value.1.0(unstructured=uavcan.primitive.Unstructured.1.0(value='\xad\x8c\\\xac\xd9\xc3\x06\xd6\xe5\xd6%|\xee\x80\xc4\x8d'))
2022-06-15 16:53:32,505 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.node.unique_id' = uavcan.register.Value.1.0(unstructured=uavcan.primitive.Unstructured.1.0(value='\xad\x8c\\\xac\xd9\xc3\x06\xd6\xe5\xd6%|\xee\x80\xc4\x8d'))
2022-06-15 16:53:32,505 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.node.unique_id' <- Entry(value=uavcan.register.Value.1.0(unstructured=uavcan.primitive.Unstructured.1.0(value='\xad\x8c\\\xac\xd9\xc3\x06\xd6\xe5\xd6%|\xee\x80\xc4\x8d')), mutable=True)
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.node.unique_id' -> Entry(value=uavcan.register.Value.1.0(unstructured=uavcan.primitive.Unstructured.1.0(value='\xad\x8c\\\xac\xd9\xc3\x06\xd6\xe5\xd6%|\xee\x80\xc4\x8d')), mutable=True)
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.node.description' <- uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value=''))
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.node.description' = uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value=''))
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.node.description' <- Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.node.description' -> Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.node.id' <- ValueProxy(uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[65535])))
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.node.id' = uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[65535]))
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.node.id' <- Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[65535])), mutable=True)
2022-06-15 16:53:32,506 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Update from env: 'uavcan.node.id' <- b'127'
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.node.id' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[65535])), mutable=True)
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.node.id' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[65535])), mutable=True)
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.node.id' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[65535])), mutable=True)
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.node.id' <- Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[127])), mutable=True)
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.node.id' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[127])), mutable=True)
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.udp.iface' <- ValueProxy(uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')))
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.udp.iface' = uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value=''))
2022-06-15 16:53:32,507 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.udp.iface' <- Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.udp.iface' -> Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.udp.mtu' <- ValueProxy(uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[1200])))
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.udp.mtu' = uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[1200]))
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.udp.mtu' <- Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[1200])), mutable=True)
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.udp.mtu' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[1200])), mutable=True)
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.udp.duplicate_service_transfers' <- ValueProxy(uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])))
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.udp.duplicate_service_transfers' = uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False]))
2022-06-15 16:53:32,508 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.udp.duplicate_service_transfers' <- Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.udp.duplicate_service_transfers' -> Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.serial.iface' <- ValueProxy(uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')))
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.serial.iface' = uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value=''))
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.serial.iface' <- Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Update from env: 'uavcan.serial.iface' <- b'/dev/tty.usbmodem1431201'
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.iface' -> Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.iface' -> Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.iface' -> Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,509 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.serial.iface' <- Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='/dev/tty.usbmodem1431201')), mutable=True)
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.iface' -> Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='/dev/tty.usbmodem1431201')), mutable=True)
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.serial.duplicate_service_transfers' <- ValueProxy(uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])))
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.serial.duplicate_service_transfers' = uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False]))
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.serial.duplicate_service_transfers' <- Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.duplicate_service_transfers' -> Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.serial.baudrate' <- ValueProxy(uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[0])))
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.serial.baudrate' = uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[0]))
2022-06-15 16:53:32,510 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.serial.baudrate' <- Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[0])), mutable=True)
2022-06-15 16:53:32,511 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Update from env: 'uavcan.serial.baudrate' <- b'3000000'
2022-06-15 16:53:32,511 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.baudrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[0])), mutable=True)
2022-06-15 16:53:32,511 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.baudrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[0])), mutable=True)
2022-06-15 16:53:32,511 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.baudrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[0])), mutable=True)
2022-06-15 16:53:32,511 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.serial.baudrate' <- Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[3000000])), mutable=True)
2022-06-15 16:53:32,511 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.serial.baudrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[3000000])), mutable=True)
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.can.iface' <- ValueProxy(uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')))
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.can.iface' = uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value=''))
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.can.iface' <- Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.iface' -> Entry(value=uavcan.register.Value.1.0(string=uavcan.primitive.String.1.0(value='')), mutable=True)
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.can.mtu' <- ValueProxy(uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[64])))
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.can.mtu' = uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[64]))
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.can.mtu' <- Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[64])), mutable=True)
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Update from env: 'uavcan.can.mtu' <- b'8'
2022-06-15 16:53:32,529 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.mtu' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[64])), mutable=True)
2022-06-15 16:53:32,530 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.mtu' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[64])), mutable=True)
2022-06-15 16:53:32,530 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.mtu' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[64])), mutable=True)
2022-06-15 16:53:32,530 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.can.mtu' <- Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[8])), mutable=True)
2022-06-15 16:53:32,530 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.mtu' -> Entry(value=uavcan.register.Value.1.0(natural16=uavcan.primitive.array.Natural16.1.0(value=[8])), mutable=True)
2022-06-15 16:53:32,530 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.can.bitrate' <- ValueProxy(uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,4000000])))
2022-06-15 16:53:32,530 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.can.bitrate' = uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,4000000]))
2022-06-15 16:53:32,531 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.can.bitrate' <- Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,4000000])), mutable=True)
2022-06-15 16:53:32,531 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Update from env: 'uavcan.can.bitrate' <- b'1000000 1000000'
2022-06-15 16:53:32,531 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.bitrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,4000000])), mutable=True)
2022-06-15 16:53:32,531 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.bitrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,4000000])), mutable=True)
2022-06-15 16:53:32,531 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.bitrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,4000000])), mutable=True)
2022-06-15 16:53:32,531 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.can.bitrate' <- Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,1000000])), mutable=True)
2022-06-15 16:53:32,531 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.can.bitrate' -> Entry(value=uavcan.register.Value.1.0(natural32=uavcan.primitive.array.Natural32.1.0(value=[1000000,1000000])), mutable=True)
2022-06-15 16:53:32,532 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.loopback' <- ValueProxy(uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])))
2022-06-15 16:53:32,532 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.loopback' = uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False]))
2022-06-15 16:53:32,532 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.loopback' <- Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,532 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.loopback' -> Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,532 13803 DEBUG    pycyphal.presentation._presentation: Presentation(SerialTransport('/dev/tty.usbmodem1431201', local_node_id=127, service_transfer_multiplier=1, baudrate=3000000), num_publishers=0, num_subscribers=0, num_clients=0, num_servers=0): Constructing new subscriber for <class 'uavcan.node.Heartbeat_1_0.Heartbeat_1_0'> at subject-ID 7509 with queue limit None
2022-06-15 16:53:32,538 13803 DEBUG    pycyphal.presentation._presentation: Presentation(SerialTransport('/dev/tty.usbmodem1431201', local_node_id=127, service_transfer_multiplier=1, baudrate=3000000), num_publishers=0, num_subscribers=1, num_clients=0, num_servers=0): Providing server for <class 'uavcan.register.List_1_0.List_1_0'> at service-ID 385
2022-06-15 16:53:32,538 13803 DEBUG    pycyphal.presentation._presentation: Presentation(SerialTransport('/dev/tty.usbmodem1431201', local_node_id=127, service_transfer_multiplier=1, baudrate=3000000), num_publishers=0, num_subscribers=1, num_clients=0, num_servers=1): Providing server for <class 'uavcan.register.Access_1_0.Access_1_0'> at service-ID 384
2022-06-15 16:53:32,538 13803 DEBUG    pycyphal.presentation._presentation: Presentation(SerialTransport('/dev/tty.usbmodem1431201', local_node_id=127, service_transfer_multiplier=1, baudrate=3000000), num_publishers=0, num_subscribers=1, num_clients=0, num_servers=2): Providing server for <class 'uavcan.node.GetInfo_1_0.GetInfo_1_0'> at service-ID 430
2022-06-15 16:53:32,542 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.diagnostic.severity' <- uavcan.register.Value.1.0(natural8=uavcan.primitive.array.Natural8.1.0(value='\xff'))
2022-06-15 16:53:32,542 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.diagnostic.severity' = uavcan.register.Value.1.0(natural8=uavcan.primitive.array.Natural8.1.0(value='\xff'))
2022-06-15 16:53:32,542 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.diagnostic.severity' <- Entry(value=uavcan.register.Value.1.0(natural8=uavcan.primitive.array.Natural8.1.0(value='\xff')), mutable=True)
2022-06-15 16:53:32,542 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.diagnostic.severity' -> Entry(value=uavcan.register.Value.1.0(natural8=uavcan.primitive.array.Natural8.1.0(value='\xff')), mutable=True)
2022-06-15 16:53:32,542 13803 DEBUG    pycyphal.application.register._registry: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create 'uavcan.diagnostic.timestamp' <- uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False]))
2022-06-15 16:53:32,542 13803 DEBUG    pycyphal.application._registry_factory: SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]): Create static 'uavcan.diagnostic.timestamp' = uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False]))
2022-06-15 16:53:32,543 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Set 'uavcan.diagnostic.timestamp' <- Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,543 13803 DEBUG    pycyphal.application.register.backend.static: StaticBackend(':memory:', persistent=False): Get 'uavcan.diagnostic.timestamp' -> Entry(value=uavcan.register.Value.1.0(bit=uavcan.primitive.array.Bit.1.0(value=[False])), mutable=True)
2022-06-15 16:53:32,543 13803 DEBUG    pycyphal.presentation._presentation: Presentation(SerialTransport('/dev/tty.usbmodem1431201', local_node_id=127, service_transfer_multiplier=1, baudrate=3000000), num_publishers=0, num_subscribers=1, num_clients=0, num_servers=3): Constructing new publisher for <class 'uavcan.node.Heartbeat_1_0.Heartbeat_1_0'> at subject-ID 7509
2022-06-15 16:53:32,543 13803 DEBUG    pycyphal.presentation._port._publisher: PublisherImpl(dtype=uavcan.node.Heartbeat.1.0, transport_session=SerialOutputSession(OutputSessionSpecifier(data_specifier=MessageDataSpecifier(subject_id=7509), remote_node_id=None), PayloadMetadata(extent_bytes=12)), proxy_count=1) got a new proxy, new count 1
2022-06-15 16:53:32,543 13803 DEBUG    pycyphal.transport.serial._session._output: SerialOutputSession(OutputSessionSpecifier(data_specifier=MessageDataSpecifier(subject_id=7509), remote_node_id=None), PayloadMetadata(extent_bytes=12)): Sending transfer: Transfer(2022-06-15T16:53:32.543775/23978.243229, priority=NOMINAL, transfer_id=0, fragmented_payload=[7B]); current stats: SessionStatistics(transfers=0, frames=0, payload_bytes=0, errors=0, drops=0)
2022-06-15 16:53:33,546 13803 DEBUG    pycyphal.presentation._presentation: Presentation(SerialTransport('/dev/tty.usbmodem1431201', local_node_id=127, service_transfer_multiplier=1, baudrate=3000000), num_publishers=1, num_subscribers=1, num_clients=0, num_servers=3): Constructing new publisher for <class 'uavcan.node.port.List_0_1.List_0_1'> at subject-ID 7510
2022-06-15 16:53:33,546 13803 DEBUG    pycyphal.presentation._port._publisher: PublisherImpl(dtype=uavcan.node.port.List.0.1, transport_session=SerialOutputSession(OutputSessionSpecifier(data_specifier=MessageDataSpecifier(subject_id=7510), remote_node_id=None), PayloadMetadata(extent_bytes=8466)), proxy_count=1) got a new proxy, new count 1
2022-06-15 16:53:33,546 13803 DEBUG    pycyphal.application._port_list_publisher: PortListPublisher(SimpleNode(uavcan.node.GetInfo.Response.1.0(protocol_version=uavcan.node.Version.1.0(major=1, minor=0), hardware_version=uavcan.node.Version.1.0(major=0, minor=0), software_version=uavcan.node.Version.1.0(major=1, minor=0), software_vcs_revision_id=0, unique_id=[173,140, 92,172,217,195,  6,214,229,214, 37,124,238,128,196,141], name='org.app', software_image_crc=[], certificate_of_authenticity=''), Presentation(SerialTransport('/dev/tty.usbmodem1431201', local_node_id=127, service_transfer_multiplier=1, baudrate=3000000), num_publishers=2, num_subscribers=1, num_clients=0, num_servers=3), SimpleRegistry([StaticBackend(':memory:', persistent=False), DynamicBackend('', persistent=False)]))): Publisher initialized: Publisher(dtype=uavcan.node.port.List.0.1, transport_session=SerialOutputSession(OutputSessionSpecifier(data_specifier=MessageDataSpecifier(subject_id=7510), remote_node_id=None), PayloadMetadata(extent_bytes=8466)))

I don’t read anything on the CAN bus on the FIPY’s end. On the other hand, I tried using the same setup in dronecan_gui_tool (in a different virtual environment) and i’m able to read data on the CAN bus: the dynamic allocation goes through and i’m also able to read Heartbeat messages from both dronecan_gui_tool and the Ark-Flow.

Not sure what is happening to be honest, I’m quite new to Cyphal and CAN. Do you have any ideas? I wouldn’t mind some links to open source application code using pycyphal, if such things are available. I didn’t find much references for non-library code, except the exemple in pycyphal github repo, snippets on OpenCyphal’s forum and another project called cyphal_communicator.

Thanks for your great work.
Cheers

Does ARK Flow actually support Cyphal though? Anyway, your request is out of place here, you should seek help from the manufacturer.

Thanks for you quick answer

Does the ARK Flow actually support Cyphal though?

According to this article they support UAVCAN 1.0

Anyway, your request is out of place here, you should seek help from the manufacturer.

I forgot to mention that the same configuration without the Ark-Flow, yields the same result, ie no data is transmitted on the physical CAN bus.

Ah. Thanks for the clarification. You have a problem in your configuration: UAVCAN__SERIAL__IFACE is incorrect because you should be using Cyphal/CAN, not Cyphal/serial. Use UAVCAN__CAN__IFACE=slcan:/dev/tty.usbmodem1431201 instead.

More on this: pycyphal.transport.can.media.pythoncan package — PyCyphal 1.9.0 documentation

Ah. Thanks for the clarification.

Yeah I guess I shouldn’t have mentioned a competitor’s product in the actual topic, my bad, I got caught up in my work…

UAVCAN__SERIAL__IFACE is incorrect because you should be using Cyphal/CAN, not Cyphal/serial. Use UAVCAN__CAN__IFACE=slcan:/dev/tty.usbmodem1431201 instead.

That’s it, many thanks for your time, and your answer !
Cheers