Current section
Files
Jump to
Current section
Files
README.md
<!--SPDX-FileCopyrightText: 2025 James HartonSPDX-License-Identifier: Apache-2.0--><img src="https://github.com/beam-bots/bb/blob/main/logos/beam_bots_logo.png?raw=true" alt="Beam Bots Logo" width="250" /># Beam Bots[](https://github.com/beam-bots/bb/actions/workflows/ci.yml)[](https://opensource.org/licenses/Apache-2.0)[](https://hex.pm/packages/bb)[](https://hexdocs.pm/bb)[](https://api.reuse.software/info/github.com/beam-bots/bb)[](https://www.bestpractices.dev/projects/11772)[](https://scorecard.dev/viewer/?uri=github.com/beam-bots/bb)[](https://deepwiki.com/beam-bots/bb)Beam Bots is a framework for building resilient robotics projects in Elixir.## Features- **Spark DSL** for defining robot topologies (links, joints, sensors, actuators)- **Physical units** via `~u` sigil with automatic SI conversion (e.g., `~u(90 degree)`, `~u(0.1 meter)`)- **Topology-based supervision** - supervision tree mirrors robot structure for fault isolation- **Hierarchical PubSub** - subscribe to messages by path or subtree- **Forward kinematics** - compute link positions using Nx tensors- **Message system** - typed payloads with schema validation- **Command system** - state machine with arm/disarm and custom commands- **URDF export** - export robot definitions for use with ROS tools## Example```elixirdefmodule MyRobot do use BB topology do link :base do joint :shoulder do type(:revolute) origin do z(~u(0.1 meter)) end axis do end limit do effort(~u(10 newton_meter)) velocity(~u(1 radian_per_second)) end link :upper_arm do joint :elbow do type(:revolute) origin do z(~u(0.3 meter)) end axis do roll(~u(-90 degree)) end limit do effort(~u(10 newton_meter)) velocity(~u(1 radian_per_second)) end link :forearm do end end end end end endend# Start the supervision tree{:ok, _pid} = BB.Supervisor.start_link(MyRobot)# Compute forward kinematicsrobot = MyRobot.robot()positions = %{shoulder: :math.pi() / 4, elbow: 0.0}{x, y, z} = BB.Robot.Kinematics.link_position(robot, positions, :forearm)# Export to URDFmix bb.to_urdf MyRobot -o robot.urdf```## Documentation### TutorialsGuided introduction to Beam Bots:1. [Your First Robot](https://hexdocs.pm/bb/01-first-robot.html) - defining robots with the DSL2. [Starting and Stopping](https://hexdocs.pm/bb/02-starting-and-stopping.html) - supervision trees3. [Sensors and PubSub](https://hexdocs.pm/bb/03-sensors-and-pubsub.html) - publishing and subscribing to messages4. [Forward Kinematics](https://hexdocs.pm/bb/04-kinematics.html) - computing link positions5. [Commands and State Machine](https://hexdocs.pm/bb/05-commands.html) - controlling the robot6. [Exporting to URDF](https://hexdocs.pm/bb/06-urdf-export.html) - interoperability with ROS tools7. [Parameters](https://hexdocs.pm/bb/07-parameters.html) - runtime-adjustable configuration8. [Parameter Bridges](https://hexdocs.pm/bb/08-parameter-bridges.html) - bidirectional remote access### How-to GuidesTask-oriented guides for common operations:- [Integrate a Servo Driver](https://hexdocs.pm/bb/integrate-servo-driver.html) - creating hardware driver packages- [Add a Custom Command](https://hexdocs.pm/bb/add-custom-command.html) - extending the command system- [Implement Safety Callbacks](https://hexdocs.pm/bb/implement-safety-callbacks.html) - safe hardware shutdown- [Deploy to Nerves](https://hexdocs.pm/bb/deploy-to-nerves.html) - embedded deployment- [Write a Custom Sensor](https://hexdocs.pm/bb/write-custom-sensor.html) - creating sensor modules### ExplanationUnderstanding the architecture:- [Understanding Safety](https://hexdocs.pm/bb/understanding-safety.html) - the safety system design- [Supervision Architecture](https://hexdocs.pm/bb/supervision-architecture.html) - why topology mirrors supervision- [Command System](https://hexdocs.pm/bb/command-system.html) - command execution patterns- [PubSub System](https://hexdocs.pm/bb/pubsub-system.html) - hierarchical messaging### Reference- [DSL Reference](https://hexdocs.pm/bb/dsl-bb.html) - all DSL options- [Message Types](https://hexdocs.pm/bb/message-types.html) - PubSub message schemas- [Error Types](https://hexdocs.pm/bb/error-types.html) - structured error reference- [Telemetry Events](https://hexdocs.pm/bb/telemetry-events.html) - observability## StatusCore functionality is implemented. Companion packages:- [`bb_kino`](https://github.com/beam-bots/bb_kino) - Livebook widgets for robot control and visualisation- [`bb_liveview`](https://github.com/beam-bots/bb_liveview) - Phoenix LiveView dashboard- [`bb_ik_fabrik`](https://github.com/beam-bots/bb_ik_fabrik) - FABRIK inverse kinematics solver- [`bb_servo_pca9685`](https://github.com/beam-bots/bb_servo_pca9685) - PCA9685 PWM servo driver (I2C, 16-channel)- [`bb_servo_pigpio`](https://github.com/beam-bots/bb_servo_pigpio) - pigpio servo driver (Raspberry Pi GPIO)- [`bb_servo_robotis`](https://github.com/beam-bots/bb_servo_robotis) - Robotis/Dynamixel servo driverSee [proposals](https://github.com/beam-bots/proposals) for planned features.## Installation### With Igniter (Recommended)If your project uses [Igniter](https://hex.pm/packages/igniter):```bashmix igniter.install bb```This will:- Add Beam Bots to your dependencies- Create a `{YourApp}.Robot` module with arm/disarm commands and a base link- Add the robot to your application supervision tree- Configure the formatter for the Beam Bots DSLTo add additional robots later:```bashmix bb.add_robot --robot MyApp.Robots.SecondRobot```### Manual InstallationAdd Beam Bots to your dependencies:```elixirdef deps do [ {:bb, "~> 0.1"} ]end```Then create a robot module manually (see [Your First Robot](https://hexdocs.pm/bb/01-first-robot.html)).## SponsorsThis project is made possible by the generous support of our sponsors:- **[Alembic](https://alembic.com.au)** ([@team-alembic](https://github.com/team-alembic)) - Development Support- **Frank Hunleth** ([@fhunleth](https://github.com/fhunleth)) - Hardware Donation- **Pascal Charbonneau** ([@pcharbon70](https://github.com/pcharbon70)) - GitHub Sponsor