Skip to content

ljuszkie/RigidBodyCollisions.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

70 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

RigidBodyCollisions animation

RigidBodyCollisions.jl

⚠️ AI Development Disclaimer This is an experimental project where the code has been developed solely by AI assistants, specifically Claude (Anthropic) and Codex (OpenAI). While the project demonstrates the potential of AI-driven software development, users should exercise appropriate caution and thoroughly test any code before use in production environments.

Overview

RigidBodyCollisions.jl extends RigidBodyDynamics.jl with differentiable collision detection capabilities using DifferentiableCollisions.jl. This enables collision-free inverse kinematics and motion planning using gradient-based optimization methods.

Features

πŸ€– Collision Detection

  • Self-collision detection between robot links
  • Environment collision detection with static obstacles
  • Differentiable collision checking for optimization-based methods
  • Efficient gradient computation with analytical Jacobians

🎯 Optimization Integration

  • Collision-free inverse kinematics using Optimization.jl
  • Gradient-based collision avoidance with ForwardDiff support
  • Configurable collision margins and penalty weights
  • Multi-stage optimization workflows

πŸ“Š Visualization & Analysis

  • Interactive 3D visualization with MeshCat.jl
  • Real-time collision highlighting with color-coded feedback
  • Dynamic collision scene visualization during robot motion
  • Collision geometry rendering with transparency and material options

πŸ”§ Mesh Processing

  • Automatic mesh-to-primitive fitting (spheres, capsules, boxes)
  • Optimized collision geometry generation from URDF visual meshes
  • Collision pair exclusion rules for adjacent links
  • Multiple primitive types per robot link

Installation

using Pkg
Pkg.add(url="https://github.com/your-username/RigidBodyCollisions.jl")

Dependencies

This package requires:

  • Julia β‰₯ 1.9
  • RigidBodyDynamics.jl β‰₯ 2.5
  • DifferentiableCollisions.jl β‰₯ 0.1.5
  • Optimization.jl β‰₯ 4.6
  • MeshCat.jl β‰₯ 0.16 (for visualization)

Quick Start

using RigidBodyCollisions
using RigidBodyDynamics

# Load robot from URDF
urdf_path = "path/to/your/robot.urdf"
mechanism, collision_model = create_kinematic_collision_model(urdf_path)

# Create collision state
collision_state = RobotCollisionState(mechanism, collision_model)

# Check self-collisions
q = zeros(num_positions(mechanism))  # Joint configuration
update_collision_poses!(collision_state, q)
alphas = check_self_collisions(collision_state)

println("Minimum collision alpha: ", minimum(alphas))
println(minimum(alphas) <= 1.0 ? "Collision detected!" : "Collision-free")

Examples

The examples/ directory contains comprehensive demonstrations:

🎯 Core Functionality

πŸ€– Self-Collision Detection

🎯 Inverse Kinematics & Optimization

πŸ“Š Visualization & Analysis

Main Demo: TCP Pose IK Optimization

The flagship example demonstrates two-stage collision-free inverse kinematics:

# Run without visualization
julia --project=. examples/tcp_pose_ik_optimization.jl

# Run with interactive 3D visualization
RBC_SHOW_MESHCAT=true julia --project=. examples/tcp_pose_ik_optimization.jl

Features:

  • Stage 1: Solve IK without collision constraints
  • Stage 2: Add environment obstacle and re-solve with collision avoidance
  • Real-time collision highlighting during optimization
  • Null-space exploitation for redundant manipulators
  • Interactive MeshCat visualization with collision feedback

API Reference

Core Types

# Main collision state for a robot
RobotCollisionState(mechanism, collision_model)

# Complete collision scene (robot + environment)
CollisionScene(robot_collision_state)

Collision Detection

# Update collision geometries to current joint configuration
update_collision_poses!(collision_state, q)

# Check self-collisions (returns Ξ± values, ≀1 indicates collision)
alphas = check_self_collisions(collision_state)

# Check robot-environment collisions
alphas = check_robot_env_collisions(scene)

# Get actively colliding pairs
pairs = get_self_colliding_pairs(collision_state)
pairs = get_robot_env_colliding_pairs(scene)

Optimization Integration

# Self-collision cost function (differentiable)
cost = self_collision_cost(collision_state, q; margin=1.05, weight=10.0)

# Environment collision cost function
cost = environment_collision_cost(scene, q; margin=1.05, weight=10.0)

# With analytical gradients
cost, grad = self_collision_cost_with_gradient(collision_state, q; ...)
cost, grad = environment_collision_cost_with_gradient(scene, q; ...)

Visualization

# Visualize robot collision geometries
visualize_robot_collision_state!(vis, collision_state)

# Visualize complete collision scene
visualize_collision_scene!(vis, scene)

# Update visualization during motion
update_collision_scene_visualization!(vis, scene)

Collision Detection Details

Self-Collision Detection

  • Uses fitted primitive geometries (spheres, capsules, boxes) for efficiency
  • Excludes adjacent links and user-specified link pairs
  • Returns continuous distance measures (Ξ± values) for smooth optimization
  • Supports analytical gradient computation via ChainRules.jl

Environment Collision Detection

  • Handles arbitrary static obstacles (spheres, boxes, cylinders, polytopes)
  • Integrates with robot collision checking in unified scene representation
  • Supports dynamic obstacle addition/removal
  • Compatible with all DifferentiableCollisions.jl primitive types

Distance Semantics

  • Ξ± > 1: Objects separated (no collision)
  • Ξ± = 1: Objects touching (contact)
  • Ξ± < 1: Objects interpenetrating (collision)

Performance Notes

  • Analytical gradients are ~10-100Γ— faster than finite differences
  • Capsule fitting provides good collision approximation with fewer primitives
  • Collision pair exclusions reduce computational overhead
  • Batch collision checking scales efficiently with robot complexity

Project Structure

RigidBodyCollisions.jl/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ RigidBodyCollisions.jl     # Main module
β”‚   β”œβ”€β”€ collision_state.jl         # Robot collision state management
β”‚   β”œβ”€β”€ collision_scene.jl         # Complete scene management
β”‚   β”œβ”€β”€ forward_kinematics.jl      # Kinematic chain utilities
β”‚   β”œβ”€β”€ mesh_fitting.jl            # Mesh-to-primitive fitting
β”‚   β”œβ”€β”€ urdf_parsing.jl           # URDF loading and processing
β”‚   └── visualization.jl           # MeshCat visualization tools
β”œβ”€β”€ examples/                      # Comprehensive demonstrations
β”œβ”€β”€ test/                         # Test suite
└── assets/                       # Robot models and meshes

Contributing

While this project was developed by AI assistants, contributions from the community are welcome:

  1. Bug reports and feature requests via GitHub Issues
  2. Pull requests for fixes and enhancements
  3. Example contributions showcasing new use cases
  4. Documentation improvements and tutorials

Please thoroughly test any modifications before submitting.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Related Projects

Citation

If you use this project in research, please cite:

@software{rigidbodycollisions_jl,
  title = {RigidBodyCollisions.jl: Differentiable Collision Detection for Robot Motion Planning},
  author = {AI Development (Claude \& Codex)},
  year = {2024},
  url = {https://github.com/your-username/RigidBodyCollisions.jl},
  note = {Experimental AI-developed software}
}

⚠️ Reminder: This codebase was developed entirely by AI assistants. While functional, it should be considered experimental and thoroughly validated before use in critical applications.

About

Experimental AI developed collision checking extension for RigidBodyDynamics.jl

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages