Myxa with Ardupilot

The logs contain no errors.

This message says that you are already running firmware com.zubax.telega-1.0.1e5c06b5751eefb2.6a34880f9af5cb71 (I see that you added the hardware version number to the file name but it’s not needed). Updating to the same version does not make a lot of sense.

The syntax is correct but the command will only work if the C:\ directory contains the firmware file. From the other invocations it is unclear if this is the case.

It doesn’t hang but keeps running while not doing anything, because there are either no nodes to update or no firmware files available.

This invocation is probably not what you mean because you are using 124 as the file name for the allocation table, while not giving an explicit list of nodes to update. The previous forms are correct.


In case you are dealing with some Windows-specific issues, you could upload the firmware via the debug connector of Myxa:

The load address is 0x800c000

My apologies.

I didn’t do that - that was the same file name from the server.

Would updating it to a much higher version number work?? (i.e. v1.5.6)

Indeed this the case. I tried a few different folders just to be sure…

I’m just trying everything at this point given that I’m not familar with Yakut as much as I’d like to be.

PS C:\Windows\system32> yakut file-server C:\Users\Public --update-software 124
2024-11-11 21:43:14 0003680 WAR yakut.cmd.file_server: Requesting node 124 to update its software: uavcan.node.ExecuteCommand.Request.1.1(command=65533, parameter='com.zubax.telega-1.4.1e5c06b5751eefb2.6a34880f9af5cb71.app.bin')
2024-11-11 21:43:22 0003680 WAR yakut.cmd.file_server: Node 124 ignored because total update mode not selected and its ID is not given explicitly (explicit node-IDs are: (none given))

This is the closest (I think) I’ve gotten.

I’m using a Babel as part of this workflow. How do I use the the debug connector…?

Hm, this is sus. Your logs refer to com.zubax.telega-1.3-1.1.1e5c06b5751eefb2.6a34880f9af5cb71.app.bin (the second entry from your previous post), but the file on the file server is named slightly differently. The name itself doesn’t matter that much but I need to understand what caused it to be different.

Regarless, though, you don’t need to use the v1 firmware, since you want to downgrade (although I would go with that Lua script still, in which case no downgrade is needed). If you’re confident you want to downgrade, obtain the latest v0 firmware from the file server.

Please try running your first command again, but this time ensure that the binary file is indeed contained in the specified path (or change the path), and add the node-ID after the --update-software flag, like this (I am using shorthand options here for brevity):

y -v file-server  C:\Users\Public  -P allocation_table.db  -u 124

You should see the command emit messages like Requesting node 124 to update its software: ..., followed by requests coming back from the node. If anything goes wrong, we should see helpful log messages.


An alternative to this would be to use any STM32-compatible SWD adapter to upload the firmware as I mentioned earlier. One such adapter is available here:

I changed the name to “cheat” the updater into thinking it was a newer version of firmware (as per @psandro 's suggestion). That’s all. :slight_smile:

I tried this, but my Pixhawk 2 doesn’t have enough mem for the script apparently.

In C:\ until I manually cancel it:

PS C:\Windows\system32> y -v file-server  C:\Users\Public  -P allocation_table.db  -u 124
2024-11-12 07:29:33 0009848 INF yakut.cmd.file_server: File server root directories: ['C:\\Users\\Public']
2024-11-12 07:29:33 0009848 INF yakut.cmd.file_server: Total update: False; trigger explicitly: [124]
2024-11-12 07:29:36 0009848 INF yakut.param.transport: Transport constructed from registers: CANTransport(PythonCANMedia('slcan:COM7', mtu=8), local_node_id=3)
2024-11-12 07:29:36 0009848 INF yakut.param.node: Output TID map: Could not restore from file C:\Users\Jeeva Arjun\AppData\Roaming\yakut\v0.13\output-transfer-id-maps\3: FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Jeeva Arjun\\AppData\\Roaming\\yakut\\v0.13\\output-transfer-id-maps\\3'. No problem, will use defaults.
2024-11-12 07:29:36 0009848 INF yakut.cmd.file_server: Starting a plug-and-play allocator using file 'C:\\Windows\\System32\\allocation_table.db'
2024-11-12 07:29:36 0009848 INF yakut.cmd.file_server: Initializing the node tracker
2024-11-12 07:29:36 0009848 INF yakut.cmd.file_server: Initializing the software update checker
2024-11-12 07:29:37 0009848 INF yakut.cmd.file_server: Node 124 most recent heartbeat: uavcan.node.Heartbeat.1.0(uptime=30, health=uavcan.node.Health.1.0(value=0), mode=uavcan.node.Mode.1.0(value=0), vendor_specific_status_code=0)
2024-11-12 07:29:37 0009848 INF yakut.cmd.file_server: Node 124 info: <not available>
2024-11-12 07:29:42 0009848 INF yakut.cmd.file_server: Node 124 most recent heartbeat: uavcan.node.Heartbeat.1.0(uptime=35, health=uavcan.node.Health.1.0(value=0), mode=uavcan.node.Mode.1.0(value=0), vendor_specific_status_code=0)
2024-11-12 07:29:42 0009848 INF yakut.cmd.file_server: Node 124 info: 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=1, minor=3), software_version=uavcan.node.Version.1.0(major=1, minor=0), software_vcs_revision_id=2187630895419027378, unique_id=[62, 0,79, 0,10,81,54,49,48,54,56,56, 0, 0, 0, 0], name='com.zubax.telega', software_image_crc=[7652891267415001969], certificate_of_authenticity="|\x98_\xa7\x11Co\xe0\xda\xce\x92\x9c\xea\xf1%\xa8\r)\xb0\x86V\xbfT\xad\x14\xbd\xe0\xed&C}c\xeamr\xf2u\x8dx\x85\xd2\x96aW\xaa\xa2\x00vz\x1ecl4[\x8e\xfd\x92fEx\x99\x9a-\xdb\xaeS\xc0Y%\x10:)\xc9\xb4\xfd\t\xa9_\x91\xde\xec\x8aBK;\x11\x92M2\xd3\xd7\x89u\x0b\xa2o\xd1\x99\xfd\xd9\x14\xba\xb2\x15\xd9p\xa5\xc9\xc2(\x89r\xa7\xb7#\x96\xbf\xd3\x91\xd74\xf3\x7f\x8f\xc3\xc2\xed\x9a3'\xe5-`\xaa\x81R\xaa0\x8di\xd9V\x0f\x14\x95HbR\xf54\xff\x9f\xe3\x98\xa5G\xc9M\x12\x80\xd7\xe5\xfc\xbf\x83\x9fc\xe7\x08S\xd5\xa3\x0bL\x01C\x16\xf0\x1aM\xa8k(ET\x89u\x100\xfa\xab\x8e^\xfd\x82cv\xac4\xf5\xaa\n\xcf:(V\x10\xf6\xa3\xc1\x8d\xb6y5\x1aYv\xf7\xdb\xf2\x97]")
2024-11-12 07:29:42 0009848 INF yakut.cmd.file_server: Checking if node 124 requires a software update...
2024-11-12 07:29:42 0009848 WAR yakut.cmd.file_server: Node 124 does not require a software update.
2024-11-12 07:30:02 0009848 INF pycyphal.transport.can.media.pythoncan._pythoncan: PythonCANMedia('slcan:COM7', mtu=8) thread is about to exit

In C:\Users\Public until I manually cancel it:

PS C:\Windows\system32> y -v file-server  C:\  -P allocation_table.db  -u 124
2024-11-12 07:30:14 0009428 INF yakut.cmd.file_server: File server root directories: ['C:\\']
2024-11-12 07:30:14 0009428 INF yakut.cmd.file_server: Total update: False; trigger explicitly: [124]
2024-11-12 07:30:16 0009428 INF yakut.param.transport: Transport constructed from registers: CANTransport(PythonCANMedia('slcan:COM7', mtu=8), local_node_id=3)
2024-11-12 07:30:16 0009428 INF yakut.cmd.file_server: Starting a plug-and-play allocator using file 'C:\\Windows\\System32\\allocation_table.db'
2024-11-12 07:30:16 0009428 INF yakut.cmd.file_server: Initializing the node tracker
2024-11-12 07:30:16 0009428 INF yakut.cmd.file_server: Initializing the software update checker
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: Node 124 most recent heartbeat: uavcan.node.Heartbeat.1.0(uptime=70, health=uavcan.node.Health.1.0(value=0), mode=uavcan.node.Mode.1.0(value=0), vendor_specific_status_code=0)
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: Node 124 info: <not available>
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: Node 124 most recent heartbeat: uavcan.node.Heartbeat.1.0(uptime=70, health=uavcan.node.Health.1.0(value=0), mode=uavcan.node.Mode.1.0(value=0), vendor_specific_status_code=0)
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: Node 124 info: 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=1, minor=3), software_version=uavcan.node.Version.1.0(major=1, minor=0), software_vcs_revision_id=2187630895419027378, unique_id=[62, 0,79, 0,10,81,54,49,48,54,56,56, 0, 0, 0, 0], name='com.zubax.telega', software_image_crc=[7652891267415001969], certificate_of_authenticity="|\x98_\xa7\x11Co\xe0\xda\xce\x92\x9c\xea\xf1%\xa8\r)\xb0\x86V\xbfT\xad\x14\xbd\xe0\xed&C}c\xeamr\xf2u\x8dx\x85\xd2\x96aW\xaa\xa2\x00vz\x1ecl4[\x8e\xfd\x92fEx\x99\x9a-\xdb\xaeS\xc0Y%\x10:)\xc9\xb4\xfd\t\xa9_\x91\xde\xec\x8aBK;\x11\x92M2\xd3\xd7\x89u\x0b\xa2o\xd1\x99\xfd\xd9\x14\xba\xb2\x15\xd9p\xa5\xc9\xc2(\x89r\xa7\xb7#\x96\xbf\xd3\x91\xd74\xf3\x7f\x8f\xc3\xc2\xed\x9a3'\xe5-`\xaa\x81R\xaa0\x8di\xd9V\x0f\x14\x95HbR\xf54\xff\x9f\xe3\x98\xa5G\xc9M\x12\x80\xd7\xe5\xfc\xbf\x83\x9fc\xe7\x08S\xd5\xa3\x0bL\x01C\x16\xf0\x1aM\xa8k(ET\x89u\x100\xfa\xab\x8e^\xfd\x82cv\xac4\xf5\xaa\n\xcf:(V\x10\xf6\xa3\xc1\x8d\xb6y5\x1aYv\xf7\xdb\xf2\x97]")
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: Checking if node 124 requires a software update...
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: com.zubax.telega-1.3-1.0.1e5c06b5751eefb2.6a34880f9af5cb71.app: Checking if com.zubax.telega-1.3-1.1.1e5c06b5751eefb2.6a34880f9af5cb71.app is equivalent...
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: com.zubax.telega-1.3-1.0.1e5c06b5751eefb2.6a34880f9af5cb71.app: No, the software version does not match.
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: com.zubax.telega-1.3-1.0.1e5c06b5751eefb2.6a34880f9af5cb71.app: Checking if this app should be updated to com.zubax.telega-1.3-1.1.1e5c06b5751eefb2.6a34880f9af5cb71.app...
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: com.zubax.telega-1.3-1.0.1e5c06b5751eefb2.6a34880f9af5cb71.app: The applications appear to be compatible -- an update would not break the node. Looking further...
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: com.zubax.telega-1.3-1.0.1e5c06b5751eefb2.6a34880f9af5cb71.app: CRC is identical or not defined, checking the version information...
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: com.zubax.telega-1.3-1.0.1e5c06b5751eefb2.6a34880f9af5cb71.app: Yes, com.zubax.telega-1.3-1.1.1e5c06b5751eefb2.6a34880f9af5cb71.app is of a different version and is not older than the current one.
2024-11-12 07:30:17 0009428 WAR yakut.cmd.file_server: Requesting node 124 to update its software: uavcan.node.ExecuteCommand.Request.1.1(command=65533, parameter='com.zubax.telega-1.3-1.1.1e5c06b5751eefb2.6a34880f9af5cb71.app.bin')
2024-11-12 07:30:17 0009428 INF yakut.cmd.file_server: Node 124 confirmed software update command uavcan.node.ExecuteCommand.Request.1.1(command=65533, parameter='com.zubax.telega-1.3-1.1.1e5c06b5751eefb2.6a34880f9af5cb71.app.bin')
2024-11-12 07:30:21 0009428 INF yakut.cmd.file_server: Node 124 went offline
2024-11-12 07:30:25 0009428 INF yakut.cmd.file_server: Node 124 most recent heartbeat: uavcan.node.Heartbeat.1.0(uptime=3, health=uavcan.node.Health.1.0(value=0), mode=uavcan.node.Mode.1.0(value=0), vendor_specific_status_code=0)
2024-11-12 07:30:25 0009428 INF yakut.cmd.file_server: Node 124 info: <not available>
2024-11-12 07:30:25 0009428 INF yakut.cmd.file_server: Node 124 most recent heartbeat: uavcan.node.Heartbeat.1.0(uptime=3, health=uavcan.node.Health.1.0(value=0), mode=uavcan.node.Mode.1.0(value=0), vendor_specific_status_code=0)
2024-11-12 07:30:25 0009428 INF yakut.cmd.file_server: Node 124 info: 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=1, minor=3), software_version=uavcan.node.Version.1.0(major=1, minor=0), software_vcs_revision_id=2187630895419027378, unique_id=[62, 0,79, 0,10,81,54,49,48,54,56,56, 0, 0, 0, 0], name='com.zubax.telega', software_image_crc=[7652891267415001969], certificate_of_authenticity="|\x98_\xa7\x11Co\xe0\xda\xce\x92\x9c\xea\xf1%\xa8\r)\xb0\x86V\xbfT\xad\x14\xbd\xe0\xed&C}c\xeamr\xf2u\x8dx\x85\xd2\x96aW\xaa\xa2\x00vz\x1ecl4[\x8e\xfd\x92fEx\x99\x9a-\xdb\xaeS\xc0Y%\x10:)\xc9\xb4\xfd\t\xa9_\x91\xde\xec\x8aBK;\x11\x92M2\xd3\xd7\x89u\x0b\xa2o\xd1\x99\xfd\xd9\x14\xba\xb2\x15\xd9p\xa5\xc9\xc2(\x89r\xa7\xb7#\x96\xbf\xd3\x91\xd74\xf3\x7f\x8f\xc3\xc2\xed\x9a3'\xe5-`\xaa\x81R\xaa0\x8di\xd9V\x0f\x14\x95HbR\xf54\xff\x9f\xe3\x98\xa5G\xc9M\x12\x80\xd7\xe5\xfc\xbf\x83\x9fc\xe7\x08S\xd5\xa3\x0bL\x01C\x16\xf0\x1aM\xa8k(ET\x89u\x100\xfa\xab\x8e^\xfd\x82cv\xac4\xf5\xaa\n\xcf:(V\x10\xf6\xa3\xc1\x8d\xb6y5\x1aYv\xf7\xdb\xf2\x97]")
2024-11-12 07:30:25 0009428 WAR yakut.cmd.file_server: Node 124 ignored because total update mode not selected and its ID is not given explicitly (explicit node-IDs are: (none given))
2024-11-12 07:30:40 0009428 INF pycyphal.transport.can.media.pythoncan._pythoncan: PythonCANMedia('slcan:COM7', mtu=8) thread is about to exit

Thoughts??

Can I not use Babel??

Oh I see what the problem is – I should have checked this early. The device you’re upgrading was manufactured back in 2019. The bootloaders shipped in 2019 are not compatible with Telega v1 – you can switch to v1 but you can’t go back after that. You have two solutions:

  • Replace the bootloader using an SWD adapter. Babel cannot be used for this because it is not an SWD adapter. To do that, upload this binary at 0x08000000 (i.e., the origin of flash): https://files.zubax.com/products/com.zubax.telega/com.zubax.telega.bootloader.bin; be sure to retain the 256 bytes between 0x0000BF00 and 0x0000C000, they contain the digital signature. Since you’re using the SWD adapter anyway, you can also use it to rewrite the application as well while you’re at it; the load address is 0x0000C000.

  • Replace the bootloader using this script via CAN, then update the firmware normally like you’ve been attempting to do: update_bootloader.py (13.5 KB); invoke it as follows (this is Unix shell; adjust for powershell as needed):

export UAVCAN__CAN__IFACE='socketcan:slcan0'  # Update as necessary
export UAVCAN__CAN__MTU=8
export UAVCAN__CAN__BITRATE='1000000 1000000'
export UAVCAN__NODE__ID=$(yakut accommodate)
echo "Auto-selected node-ID for this session: $UAVCAN__NODE__ID"
#export VERBOSE=1  # Enable extra logging for troubleshooting.
export UAVCAN__CLN__LOW_LEVEL_IO__ID=10
exec ./update_bootloader.py
1 Like

In attempting to run the Python script:

PS C:\Users\Jeeva Arjun\Downloads> python ./update_bootloader.py
Install PyCyphal: pip install pycyphal[transport-can-pythoncan,transport-serial]; also configure the CYPHAL_PATH environment variable; see PyCyphal or Yakut docs for details.

I have set my Windows environment variables, but this error strongly suggests I’ve done it incorrectly. I’ve tried it a few different ways and there is no change.
(Indeed my installation of PyCyphal is also correct - installed as per the PyPI docs and the error thrown up)
Some help would be appreciated in the verification of my installation.

Thanks!

Have you considered switching to Linux, you’d be surprised how much easier it is to setup (and for Pavel to help you).

I used to run WSL (Windows Subsystem for Linux) for that express purpose but it had lots of cross-os dependency issues.

I run Windows for Solidworks/Edge and other stuff. Unless I really have to, I’d like to stick to Windows, but I guess I could run an Ubuntu Virtual Machine. It just means that I’ve got to set everything up again.
@pavel-kirienko, did you want me to switch to Ubuntu or can you help me solve this Windows environment variable problem?
Thanks again!

As far as I’m aware using WSL does not solve the issue that Windows is just not very good for these kinds of tasks.

It might work for compiling the occasional program or something like that, but as soon as you want to venture beyond that (like connecting to CAN networks) it becomes really difficult (as you mentioned, that’s when the cross-OS issues start to get in the way).

As a simple example, here I’m doing a simple demo by turning a magnet on/off; on Ubuntu I can open 2 separate terminals connected to the device through Cyphal/CAN; one observing the state of the magnet and one sending commands. This works because at the level of interacting with the network we can rely on SocketCAN.

Using Windows, doing exactly the same is simply not possible: a serial port can only be accessed by 1 process on Windows (and SocketCAN is only supported on Linux).

(If you’re planning to do embedded programming, GNU/Linux is also a no-brainer.)

I have no experience with WSL so I can’t be certain if things are going to work there as they should. If you can switch to a GNU/Linux distribution, that would certainly help (it doesn’t have to be Ubuntu).

The error message explains what needs to be done to fix the problem:

Install PyCyphal: pip install pycyphal[transport-can-pythoncan,transport-serial];

Once you’ve executed that command, things should work.

Tried that, no difference. Just tells me that I’ve already installed pycyphal and just checks the installation.

I’d assume something wrong with my environment variables.

Something is broken in your Python installation.

I’ve installed an Ubuntu virtual machine on my Windows machine (Ubuntu 20.04).

Following your screencast, I’ve installed Yakut correctly (it gives an output when yakut --help). However, I can’t seem to run the transport. I tried the sourcing method, but it returns:

sudo: setup_slcan: command not found
OSError: [Errno 19] No such device
Auto-selected node-ID for this session: 

When I try setting the environment variables manually, I’ve found my Babel as tty/ACM0:

user@ubuntu:/sys$ export UAVCAN__CAN__IFACE="slcan:ttyACM0"
user@ubuntu:/sys$ export UAVCAN__NODE__ID=$(yakut accommodate) 
InvalidMediaConfigurationError: Interface does not support CAN FD: slcan

How do I fix this?
Sorry for being a pain :sweat_smile: :sweat_smile:

The first command failed because you need to install setup_slcan, as suggested by the error message. If you google the name, you will find it in the first search result: setup_slcan -- a simple script for managing SocketCAN SLCAN interfaces on GNU/Linux · GitHub

To fix the “interface does not support CAN FD” error, you need to set the bit rate and the MTU manually. This is because by default, PyCyphal assumes that you want CAN FD, but it is not supported by the SLCAN protocol. Here’s how you can do it:

export UAVCAN__CAN__BITRATE="1000000 1000000"
export UAVCAN__CAN__MTU="8"

So I’ve done a fair level of digging and I’m up to this point:

user@ubuntu:~/Desktop$ python3 update_bootloader.py
Install PyCyphal: pip install pycyphal[transport-can-pythoncan,transport-serial]; also configure the CYPHAL_PATH environment variable; see PyCyphal or Yakut docs for details.

But I know that my env path is installed correctly (following the screencast). In the actual python updatebootloader file, I see that error is returned when the program can’t:

import pycyphal
import uavcan
import zubax

Manually running python and checking sees that I can indeed import PyCyphal, but I can’t import uavcan (even after installing it (pip3 install uavcan/pip install pyuavcan_v0) and I can’t import zubax. However, I can’t seem to find an package for that.
How do I solve this?

Thank you once again for your patience Pavel!!

This is because PyCyphal cannot find the DSDL files. Your CYPHAL_PATH variable needs to contain a list of directories that contain DSDL namespaces. For example, if you clone GitHub - OpenCyphal/public_regulated_data_types: Regulated DSDL definitions for Cyphal (standard and third-party) into your home directory, then you should export CYPHAL_PATH=$HOME/public_regulated_data_types.

Please uninstall these, they are not needed.

Done.
When I run echo $CYPHAL_PATH I get: /home/usr/public_regulated_data_types/, and running cd $CYPHAL PATH, throws me into the right folder. When I set the variable correctly, I got a compiling DSDL .... (can’t recall fully), and then the shell gives me the same error as earlier:

Install PyCyphal: pip install pycyphal[transport-can-pythoncan,transport-serial]; also configure the CYPHAL_PATH environment variable; see PyCyphal or Yakut docs for details.

The DSDL files are correct now, yet the error is the same.

Weird. Please export PYCYPHAL_LOGLEVEL="DEBUG" and re-run, then share the output.

This is the result. Not too sure what to make of it.

user@ubuntu:~/Desktop$ python3 update_bootloader.py 
2024-11-20 05:32:35,987  8569 INFO     pycyphal: Log config from env var; level: 'DEBUG'
2024-11-20 05:32:36,136  8569 DEBUG    pycyphal.dsdl._import_hook: Installing default import hook.
2024-11-20 05:32:36,136  8569 DEBUG    pycyphal.dsdl._import_hook: lookup dirs: ['/home/usr/public_regulated_data_types/']
2024-11-20 05:32:36,136  8569 DEBUG    pycyphal.dsdl._import_hook: output dir: /home/usr/.pycyphal
2024-11-20 05:32:36,137  8569 DEBUG    pycyphal.dsdl._import_hook: Using root namespace uavcan at /home/usr/public_regulated_data_types/uavcan
2024-11-20 05:32:36,137  8569 DEBUG    pycyphal.dsdl._import_hook: Using root namespace reg at /home/usr/public_regulated_data_types/reg
2024-11-20 05:32:36,192  8569 DEBUG    pycyphal.dsdl._import_hook: Attempting to load module uavcan as DSDL
2024-11-20 05:32:36,193  8569 DEBUG    pycyphal.dsdl._import_hook: Found root namespace uavcan in DSDL source directory /home/usr/public_regulated_data_types/uavcan
2024-11-20 05:32:36,193  8569 DEBUG    pycyphal.dsdl._import_hook: Attempting to load module zubax as DSDL
Install PyCyphal: pip install pycyphal[transport-can-pythoncan,transport-serial]; also configure the CYPHAL_PATH environment variable; see PyCyphal or Yakut docs for details.

Ah it’s easy. According to the last two lines of the log, you just need to download this and store it similarly to your public_regulated_data_types:

Be sure it is listed in CYPHAL_PATH.