Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/build_all_targets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,6 @@ jobs:
uses: softprops/action-gh-release@v2
with:
draft: true
files: artifacts/*.px4
files: |
artifacts/*.px4
artifacts/can_nodes/**/*.uavcan.bin
114 changes: 112 additions & 2 deletions Tools/ci/package_build_artifacts.sh
Original file line number Diff line number Diff line change
@@ -1,8 +1,118 @@
#!/bin/bash

# Enable globstar for recursive globbing
shopt -s globstar

mkdir artifacts
cp **/**/*.px4 artifacts/
cp **/**/*.elf artifacts/

# First, identify CAN node builds by finding which builds have .uavcan.bin files
cannode_builds=()
for uavcan_bin in **/**/*.uavcan.bin; do
if [ -f "$uavcan_bin" ]; then
build_dir=$(echo "$uavcan_bin" | sed 's|build/\([^/]*\)/.*|\1|')
cannode_builds+=("$build_dir")
fi
done

# Copy px4 files for regular flight controllers only (exclude CAN nodes)
for px4_file in **/**/*.px4; do
if [ -f "$px4_file" ]; then
build_dir=$(echo "$px4_file" | sed 's|build/\([^/]*\)/.*|\1|')
# Check if this build is NOT a CAN node
is_cannode=false
for cannode in "${cannode_builds[@]}"; do
if [ "$build_dir" == "$cannode" ]; then
is_cannode=true
break
fi
done

if [ "$is_cannode" == "false" ]; then
cp "$px4_file" artifacts/ 2>/dev/null || true
fi
fi
done

# Copy uavcan.bin files for CAN nodes to named folders
mkdir -p artifacts/can_nodes
for uavcan_bin in **/**/*.uavcan.bin; do
if [ -f "$uavcan_bin" ]; then
# Extract build directory name (e.g., "ark_can-flow_default" from "build/ark_can-flow_default/...")
build_dir=$(echo "$uavcan_bin" | sed 's|build/\([^/]*\)/.*|\1|')

# Create subdirectory for this CAN node
can_node_dir="artifacts/can_nodes/$build_dir"
mkdir -p "$can_node_dir"

# Copy the uavcan.bin file with original name
cp "$uavcan_bin" "$can_node_dir/"

echo "Packaged CAN node firmware: $uavcan_bin -> $can_node_dir/"
fi
done

# Also check for CAN node binaries in deploy directories
for deploy_bin in **/deploy/*.bin; do
if [ -f "$deploy_bin" ]; then
# Extract build directory name from deploy path
build_dir=$(echo "$deploy_bin" | sed 's|build/\([^/]*\)/.*|\1|')

# Create subdirectory for this CAN node
can_node_dir="artifacts/can_nodes/$build_dir"
mkdir -p "$can_node_dir"

# Copy the bin file
cp "$deploy_bin" "$can_node_dir/"

echo "Packaged CAN node firmware from deploy: $deploy_bin -> $can_node_dir/"
fi
done

cp **/**/*.elf artifacts/ 2>/dev/null || true
for build_dir_path in build/*/ ; do
build_dir_path=${build_dir_path::${#build_dir_path}-1}
build_dir=${build_dir_path#*/}
mkdir artifacts/$build_dir
find artifacts/ -maxdepth 1 -type f -name "*$build_dir*"
# Airframe
cp $build_dir_path/airframes.xml artifacts/$build_dir/
# Parameters
cp $build_dir_path/parameters.xml artifacts/$build_dir/
cp $build_dir_path/parameters.json artifacts/$build_dir/
cp $build_dir_path/parameters.json.xz artifacts/$build_dir/
# Actuators
cp $build_dir_path/actuators.json artifacts/$build_dir/
cp $build_dir_path/actuators.json.xz artifacts/$build_dir/
# Events
cp $build_dir_path/events/all_events.json.xz artifacts/$build_dir/
# ROS 2 msgs
cp $build_dir_path/events/all_events.json.xz artifacts/$build_dir/
# Module Docs
ls -la artifacts/$build_dir
echo "----------"
done

if [ -d artifacts/px4_sitl_default ]; then
# general metadata
mkdir artifacts/_general/
cp artifacts/px4_sitl_default/airframes.xml artifacts/_general/
# Airframe
cp artifacts/px4_sitl_default/airframes.xml artifacts/_general/
# Parameters
cp artifacts/px4_sitl_default/parameters.xml artifacts/_general/
cp artifacts/px4_sitl_default/parameters.json artifacts/_general/
cp artifacts/px4_sitl_default/parameters.json.xz artifacts/_general/
# Actuators
cp artifacts/px4_sitl_default/actuators.json artifacts/_general/
cp artifacts/px4_sitl_default/actuators.json.xz artifacts/_general/
# Events
cp artifacts/px4_sitl_default/events/all_events.json.xz artifacts/_general/
# ROS 2 msgs
cp artifacts/px4_sitl_default/events/all_events.json.xz artifacts/_general/
# Module Docs
ls -la artifacts/_general/
fi

for build_dir_path in build/*/ ; do
build_dir_path=${build_dir_path::${#build_dir_path}-1}
build_dir=${build_dir_path#*/}
Expand Down
19 changes: 19 additions & 0 deletions docs/en/dronecan/px4_cannode_fw.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,25 @@ make ark_can-flow_default

This will create an output in **build/ark_can-flow_default** named **XX-X.X.XXXXXXXX.uavcan.bin**. Follow the instructions at [DroneCAN firmware update](index.md#firmware-update) to flash the firmware.

## Firmware Releases

When PX4 creates official releases, CAN node firmware files are packaged separately from regular flight controller firmware:

- **Flight controller firmware**: Available as `.px4` files in the root of the release
- **CAN node firmware**: Available as `.uavcan.bin` files organized in named subdirectories under `can_nodes/`

For example, in a release you might find:
```
├── px4_fmu-v5_default.px4 (flight controller firmware)
├── can_nodes/
│ ├── ark_can-flow_default/
│ │ └── 1234-1.0.abcd1234.uavcan.bin (CAN node firmware)
│ └── ark_can-gps_default/
│ └── 5678-2.0.efgh5678.uavcan.bin (CAN node firmware)
```

Use the `.uavcan.bin` files from the appropriate subdirectory to flash your CAN nodes.

## Developer Information

This section has information that is relevant to developers who want to add support for new DroneCAN hardware to the PX4 Autopilot.
Expand Down