Skip to content
Merged
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
69 changes: 69 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Package CI

on:
pull_request:
push:
branches: [main, master]
workflow_dispatch:

permissions:
contents: read

jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Check out package
uses: actions/checkout@v6
with:
path: package
- name: Check out Blacknode
uses: actions/checkout@v6
with:
repository: temiroff/Blacknode
path: core
- name: Check out package dependencies
shell: bash
run: |
mkdir -p core/packages
git clone --depth 1 https://github.com/temiroff/blacknode-ros2.git core/packages/blacknode-ros2
git clone --depth 1 https://github.com/temiroff/blacknode-drivers.git core/packages/blacknode-drivers
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install test dependencies
shell: bash
run: |
python -m pip install --upgrade pip
python -m pip install -e ./core pytest
if [ -f package/requirements.txt ]; then
python -m pip install -r package/requirements.txt
fi
- name: Link package into Blacknode
shell: bash
run: |
mkdir -p core/packages
ln -s "$GITHUB_WORKSPACE/package" "core/packages/${GITHUB_REPOSITORY#*/}"
- name: Run package tests
working-directory: package
env:
PYTHONPATH: ../core/python
PYTEST_DISABLE_PLUGIN_AUTOLOAD: "1"
BLACKNODE_FEETECH_DRIVER: ${{ github.workspace }}/core/packages/blacknode-drivers/components/feetech/adapters/ros2/runtime/feetech_bus_driver.py
run: python -m pytest tests
- name: Validate official package catalog
working-directory: core
env:
PYTHONPATH: python
run: python -m blacknode.cli packages validate-catalog ../package
- name: Validate package templates
if: ${{ hashFiles('package/**/templates/*.json') != '' }}
working-directory: core
env:
PYTHONPATH: python
shell: bash
run: |
find ../package -path '*/templates/*.json' -print0 | while IFS= read -r -d '' template; do
python -m blacknode.cli validate "$template"
done
5 changes: 3 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ state separately from the Blacknode core checkout that may contain it.
## Scope

Keep generic USB discovery, permission checks, driver descriptors and launch,
robot profiles, hardware-bound calibration, and physical robot drivers here.
Keep ROS transport/control nodes in `blacknode-ros2`.
robot profiles, hardware-bound calibration, and capability bindings here.
Keep physical drivers in `blacknode-drivers`, generic controllers in
`blacknode-controllers`, and ROS transport/control nodes in `blacknode-ros2`.

## Safety rules

Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# blacknode-robot

`blacknode-robot/core` owns stable robot contracts, profiles, discovery,
hardware-identity calibration, capability bindings, and process descriptors.
Physical driver implementations are selectable `blacknode-drivers` components.
The existing Feetech script path remains as a compatibility launcher for saved
profiles and delegates to the `ros2` adapter nested under the `feetech`
component in `blacknode-drivers`.

<video src="https://github.com/user-attachments/assets/80a9b797-ecf7-47d3-b6d3-baad7c0ea170" controls width="860"></video>

**Generic robot setup nodes for [Blacknode](https://github.com/temiroff/Blacknode).**
Expand Down
22 changes: 17 additions & 5 deletions blacknode-package.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
[package]
name = "blacknode-robot"
version = "0.1.0"
version = "0.2.0"
description = "Generic robot discovery, USB permission checks, driver launch, and robot profile contracts."
requires-blacknode = ">=0.1.0"
requires-blacknode = ">=0.3.0"
layer = "robot"
component-mode = true

[categories]
"Robot" = "#14b8a6"

[dependencies]
pip = ["feetech-servo-sdk>=1.0", "roslibpy>=1.5"]
imports = ["scservo_sdk", "roslibpy"]
[components.core]
description = "Robot contracts, discovery, profiles, calibration, capabilities, and driver launch descriptors."
default = true
capabilities = ["robot.contracts", "robot.profiles", "robot.calibration", "robot.discovery"]
nodes = ["nodes"]
module-root = true
node-types = [
"Robot", "RobotCalibrationRecorder", "RobotConnectionDashboard", "RobotDefinition",
"RobotDiscovery", "RobotDriverDescriptor", "RobotDriverLauncher", "RobotDriverPreset",
"RobotJointDefinition", "RobotJointList", "RobotProfileDuplicate", "RobotProfileList",
"RobotProfileLoad", "RobotProfileSave", "RobotUSBDiscovery",
]

Loading