You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Release v0.3.0 — slim install, safe-RL Colab, GitHub Pages blog, and green CI (#362)
* feat: v0.3.0 — slim install, safe-RL Colab, GitHub Pages, and green CI
Package CBFKit for distribution and first-time users:
- Slim the core: move casadi/cvxopt/plotly/black from mandatory deps to extras
(casadi, cvxopt, plotly, codegen); add all/solvers/vis umbrellas; dev pulls
cbfkit[all]. `import cbfkit` now loads zero heavy deps, guarded by a new
core-import CI job.
- Bump VERSION to 0.3.0; enrich metadata (keywords, classifiers, URLs);
absolutize README showcase image URLs so they render off-repo.
- Add a Gymnasium safe-RL Colab quickstart (installs from GitHub).
- README badges; GitHub Pages workflow to host the blog.
- run_black degrades gracefully when black is absent so codegen works on a slim
install; add a friendly ImportError for the CasADi controller path.
Fix pre-existing CI failures (ruff was red on main, blocking all tests):
- Remove unused locals (unicycle_sweep, monte_carlo_gpu, plot_mppi_ffmpeg).
- Import Time in ros/_experiment.py (F821 undefined name).
- Manim 2D backend raises NotImplementedError before requiring manim; guard the
manim_3d_multi_robot import so the module loads without manim installed.
Verified: 469 passed, ruff clean, python -m build + twine check pass.
* fix(blog): carousel clicks, dark-section contrast, and README-style showcase gallery
Browser-QA pass on the landing page (desktop 1440px + mobile 390px):
- Carousel prev/next never fired: .bc-btn:active carried a stale
translateY(-50%) that moved the button out from under the pointer
between mousedown and mouseup. Scale-only :active now; buttons also
re-center on resize/image load and get type="button". Script tag is
versioned (?v=2) so cached copies pick up the fix.
- Dark-section contrast: stat numbers, section labels, pipeline arrows,
formulation equations, carousel bars/pills, pip-install code, and
footer hovers used slate #3d4248 on #1a1a1a; recolored to light
graphite tones. Secondary buttons on ink (CTA "Read the Paper") get
light text/border.
- New Showcase section: README-style 16-tile gallery, each tile backed
by its runnable example path and linked to the source on GitHub;
lazy-loaded GIFs; nav link added. Replaces the four GIF slides that
were buried in the benchmark carousel.
- Removed the "CBFKit vs. other toolboxes" comparison slide and all
decorative emoji icons (architecture pipeline, MPPI cards, systems
grid); tutorials use mono 01-06 labels instead.
- Equation block restyled as a flat-ink card with clause-level wrapping.
- Polish: dead particle-canvas JS and hero-gradient CSS removed, inline
SVG favicon (fixes console 404), prefers-reduced-motion support,
formulations grid balanced 2x2, gallery tiles locked to 4:3.
[](https://colab.research.google.com/github/bardhh/cbfkit/blob/main/examples/gymnasium/safe_single_integrator.ipynb)
8
+
3
9
CBFKit is a Python/ROS2 toolbox for safe planning and control using Control Barrier Functions (CBFs). Built on JAX for automatic differentiation and JIT compilation, it provides formal safety guarantees for robotic systems operating in deterministic, disturbed, and stochastic environments. It also includes an efficient JAX implementation of Model Predictive Path Integral (MPPI) control with reach-avoid specifications.
4
10
5
11
<palign="center">
6
-
<imgsrc="media/showcase/ped_mppi.gif"width="48%"alt="MPPI navigation among pedestrians">
7
-
<imgsrc="media/showcase/pedestrian_head_on.gif"width="48%"alt="CBF safety with head-on encounter">
12
+
<imgsrc="https://raw.githubusercontent.com/bardhh/cbfkit/main/media/showcase/ped_mppi.gif"width="48%"alt="MPPI navigation among pedestrians">
13
+
<imgsrc="https://raw.githubusercontent.com/bardhh/cbfkit/main/media/showcase/pedestrian_head_on.gif"width="48%"alt="CBF safety with head-on encounter">
Drop-in CBF safety filter for any continuous Gymnasium environment. Wraps the env so every action from your RL policy gets safety-projected by a CBF-QP before reaching the simulator — works with PPO, SAC, or any off-the-shelf algorithm, no policy retraining required.
89
103
90
-
<palign="center"><imgsrc="media/showcase/safe_rl_gymnasium.gif"width="85%"alt="Safe RL: naive vs CBF-filtered policy"></p>
104
+
<palign="center"><imgsrc="https://raw.githubusercontent.com/bardhh/cbfkit/main/media/showcase/safe_rl_gymnasium.gif"width="85%"alt="Safe RL: naive vs CBF-filtered policy"></p>
Skip the math: learn the barrier function from samples. A small neural network learns h(x) from labeled safe/unsafe states, then plugs straight into CBFKit's CBF-QP controller. Useful when obstacles are hard to describe analytically — point clouds, learned occupancy maps, scanned environments.
99
113
100
-
<palign="center"><imgsrc="media/showcase/neural_cbf.gif"width="65%"alt="Neural CBF: agent avoiding a learned obstacle"></p>
114
+
<palign="center"><imgsrc="https://raw.githubusercontent.com/bardhh/cbfkit/main/media/showcase/neural_cbf.gif"width="65%"alt="Neural CBF: agent avoiding a learned obstacle"></p>
Cinematic 3D simulation rendering with Manim. Multi-robot reach-avoid in 3D, rendered via CBFKit's Manim backend. Shows the visualization stack scales from quick matplotlib plots to publication-quality 3D animations.
127
141
128
-
<palign="center"><imgsrc="media/showcase/multi_robot_3d.gif"width="70%"alt="Manim 3D render of multi-robot reach-avoid"></p>
142
+
<palign="center"><imgsrc="https://raw.githubusercontent.com/bardhh/cbfkit/main/media/showcase/multi_robot_3d.gif"width="70%"alt="Manim 3D render of multi-robot reach-avoid"></p>
<sub><b>Ellipsoidal-obstacle CBF</b> <a href="examples/unicycle/reach_goal/ellipsoidal_obstacle_cbf.py" title="Source: examples/unicycle/reach_goal/ellipsoidal_obstacle_cbf.py">🔗</a><br>Unicycle reach-goal with linear class-K</sub>
<sub><b>Ellipsoidal-obstacle CBF</b> <a href="https://github.com/bardhh/cbfkit/blob/main/examples/unicycle/reach_goal/ellipsoidal_obstacle_cbf.py" title="Source: examples/unicycle/reach_goal/ellipsoidal_obstacle_cbf.py">🔗</a><br>Unicycle reach-goal with linear class-K</sub>
<img src="media/showcase/ekf_estimation.gif" width="100%" alt="EKF state estimation"><br>
176
-
<sub><b>EKF state estimation</b> <a href="examples/unicycle/reach_goal/ekf.py" title="Source: examples/unicycle/reach_goal/ekf.py">🔗</a><br>Unicycle reach-goal under measurement noise</sub>
189
+
<img src="https://raw.githubusercontent.com/bardhh/cbfkit/main/media/showcase/ekf_estimation.gif" width="100%" alt="EKF state estimation"><br>
190
+
<sub><b>EKF state estimation</b> <a href="https://github.com/bardhh/cbfkit/blob/main/examples/unicycle/reach_goal/ekf.py" title="Source: examples/unicycle/reach_goal/ekf.py">🔗</a><br>Unicycle reach-goal under measurement noise</sub>
177
191
</td>
178
192
</tr>
179
193
<tr>
180
194
<td align="center" width="33%">
181
-
<img src="media/showcase/van_der_pol_clf.gif" width="100%" alt="Van der Pol CLF"><br>
182
-
<sub><b>Van der Pol (CLF)</b> <a href="examples/van_der_pol/regulation/perfect_sensing.py" title="Source: examples/van_der_pol/regulation/perfect_sensing.py">🔗</a><br>Nonlinear regulation to the origin</sub>
195
+
<img src="https://raw.githubusercontent.com/bardhh/cbfkit/main/media/showcase/van_der_pol_clf.gif" width="100%" alt="Van der Pol CLF"><br>
196
+
<sub><b>Van der Pol (CLF)</b> <a href="https://github.com/bardhh/cbfkit/blob/main/examples/van_der_pol/regulation/perfect_sensing.py" title="Source: examples/van_der_pol/regulation/perfect_sensing.py">🔗</a><br>Nonlinear regulation to the origin</sub>
0 commit comments