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:
- zsh 5.3
- Python 3.10.5
- virtualenv 20.14.1
- pycyphal 1.8.5
- DSDL coming from GitHub - OpenCyphal/public_regulated_data_types: Regulated DSDL definitions for Cyphal (standard and third-party), compiled with yakut 0.11.1
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