# LinkMotion
A comprehensive Python library for robotics applications, providing tools for robot modeling, joint control, collision detection, visualization, and URDF import/export functionality.
## Features
### 🤖 Robot Modeling
- **Flexible Robot Construction**: Build complex robot models from primitive shapes (box, sphere, cylinder, cone, capsule, mesh)
- **Joint System**: Support for revolute, prismatic, and fixed joints with configurable constraints
- **Hierarchical Structure**: Tree-based robot structure with parent-child relationships
- **Custom Robots**: Advanced robot construction utilities and custom modeling tools
### 🔄 Transform System
- **Spatial Transformations**: Comprehensive 3D transformation calculations
- **Coordinate Frames**: Hierarchical coordinate frame management
- **Transform Manager**: Advanced transform hierarchy handling and operations
### 🎯 Robot Movement
- **Joint Control**: Precise control of robot joint positions and states
- **State Management**: Real-time management of robot configuration
- **Transform Updates**: Automatic update of link transformations based on joint movements
### 💥 Collision Detection
- **Real-time Collision Checking**: Fast collision detection using FCL (Flexible Collision Library)
- **Safety Verification**: Comprehensive collision checking for robot configurations
- **Collision Manager**: High-level collision detection interface
### 📐 Workspace Analysis
- **Reachability Analysis**: Calculate robot workspace and reachable areas, which is called `range` in this project
- **Range Calculations**: Joint and workspace limit analysis
- **Multi-axis Analysis**: 2D and 3D workspace visualization
### 🎨 3D Visualization
- **Interactive Visualization**: 3D robot visualization using K3D
- **Motion Animation**: Real-time motion visualization and animation
- **Collision Visualization**: Visual collision detection and safety checking
### 📄 URDF Support
- **URDF Import**: Parse and import URDF (Unified Robot Description Format) files
- **URDF Export**: Generate URDF files from robot models
- **Mesh Support**: Handle complex mesh geometries in URDF files
### ⚙️ Advanced Modeling
- **Sweep Operations**: Complex geometry generation through sweep operations
- **Geometry Modification**: Advanced geometry removal and modification tools
## Installation
### Prerequisites
- Python 3.12 or higher
### Basic Installation
```bash
pip install linkmotion
```
### With Jupyter Support
For interactive notebooks and visualization:
```bash
pip install linkmotion[jup]
```
### Dependencies
**Core Dependencies:**
- `joblib` - Parallel computing utilities
- `manifold3d` - 3D geometry processing
- `python-fcl` - Collision detection library
- `scipy` - Scientific computing
- `shapely` - Geometric operations
- `trimesh` - 3D mesh processing
**Optional Dependencies (with `--extra jup`):**
- `jupyter` - Interactive notebooks
- `k3d` - 3D visualization in Jupyter
- `plotly` - Interactive plotting
## Quick Start
### Basic Robot Construction
```python
import numpy as np
from scipy.spatial.transform import Rotation as R
from linkmotion import Robot, Link, Joint, JointType, Transform
humanoid = Robot()
body = Link.from_box("body", extents=np.array((3, 2, 10)))
t = Transform(rotate=R.from_rotvec(90.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((4, 0, 3)))
right_arm = Link.from_cylinder("right_arm", radius=0.5, height=5, default_transform=t)
t = Transform(rotate=R.from_rotvec(90.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((-4, 0, 3)))
left_arm = Link.from_cylinder("left_arm", radius=0.5, height=5, default_transform=t)
t = Transform(rotate=R.from_rotvec(180.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((1, 0, -8)))
right_leg = Link.from_cone("right_leg", radius=0.5, height=6, default_transform=t)
t = Transform(rotate=R.from_rotvec(180.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((-1, 0, -8)))
left_leg = Link.from_cone("left_leg", radius=0.5, height=6, default_transform=t)
t = Transform(translate=np.array((0, 0, -5)))
head = Link.from_sphere("head", 3, center=np.array((0, 0, 8)))
left_leg_joint = Joint(
"left_leg_joint",
JointType.REVOLUTE,
child_link_name="left_leg",
parent_link_name="body",
center=np.array((-1, 0, -5)),
direction=np.array((1, 0, 0)),
min_=-np.pi / 2.0,
max_=np.pi / 4.0,
)
t = Transform(translate=np.array((0, -5, 0)))
wall = Link.from_box("wall", extents=np.array((20, 1, 20)), default_transform=t, color=np.array((0.0, 0.8, 0.8, 0.2)))
humanoid.add_link(body)
humanoid.add_link(right_arm)
humanoid.add_link(left_arm)
humanoid.add_link(right_leg)
humanoid.add_link(left_leg)
humanoid.add_link(head)
humanoid.add_joint(left_leg_joint)
humanoid.add_link(wall)
```
#### Robot Appearance

### Transform Operations
```python
from linkmotion import MoveManager
mm = MoveManager(humanoid)
mm.move(joint_name="left_leg_joint", value=-np.pi / 6.0)
```
#### Robot Appearance

### Collision Detection
```python
from linkmotion import CollisionManager
cm = CollisionManager(mm)
cm.distance({"wall"}, {"body", "left_leg", "right_leg"})
```
#### Robot Appearance

### URDF Import/Export
```python
robot = Robot.from_urdf_file("../../models/toy_model/toy_model.urdf")
```
#### Robot Appearance

### Range Calculations
```python
import numpy as np
from scipy.spatial.transform import Rotation as R
from linkmotion import Robot, Link, Joint, JointType, Transform
robot = Robot()
base_link = Link.from_sphere(
name="base_link", radius=0.1, center=np.array([0, 0, 0])
)
arm_link = Link.from_cylinder(
name="arm_link",
radius=0.1,
height=1.0,
default_transform=Transform(translate=np.array([0, 0, 0.5])),
)
hand_link = Link.from_box(
name="hand_link",
extents=np.array([0.1, 0.1, 0.1]),
default_transform=Transform(translate=np.array([0, 0, 1.0])),
color=np.array([0, 1, 0, 1]),
)
finger_link = Link.from_box(
name="finger_link",
extents=np.array([0.05, 0.05, 0.1]),
default_transform=Transform(translate=np.array([0, 0, 1.1])),
color=np.array([1, 0, 0, 1]),
)
obstacle_link = Link.from_box(
name="obstacle_link",
extents=np.array([10, 10, 0.1]),
default_transform=Transform(translate=np.array([0, 0, 1.5])),
)
revolute_joint = Joint(
name="revolute_joint",
type=JointType.REVOLUTE,
parent_link_name="base_link",
child_link_name="arm_link",
direction=np.array([1, 0, 0]),
center=np.array([0, 0, 0.0]),
min_=-np.pi / 2,
max_=np.pi / 2,
)
prismatic_joint = Joint(
name="prismatic_joint",
type=JointType.PRISMATIC,
parent_link_name="arm_link",
child_link_name="hand_link",
direction=np.array([0, 1, 0]),
center=np.array([0, 0, 1.0]),
min_=-10,
max_=10,
)
prismatic_joint2 = Joint(
name="prismatic_joint2",
type=JointType.PRISMATIC,
parent_link_name="hand_link",
child_link_name="finger_link",
direction=np.array([0, 0, 1]),
center=np.array([0, 0, 1.1]),
min_=-10,
max_=10,
)
robot.add_link(base_link)
robot.add_link(arm_link)
robot.add_link(hand_link)
robot.add_link(finger_link)
robot.add_link(obstacle_link)
robot.add_joint(revolute_joint)
robot.add_joint(prismatic_joint)
robot.add_joint(prismatic_joint2)
```
#### Robot Appearance

```python
from linkmotion.range.range import RangeCalculator
calculator = RangeCalculator(
robot, {"hand_link", "finger_link"}, {"obstacle_link"}
)
calculator.add_axis("revolute_joint", np.linspace(-np.pi / 2, np.pi / 2, 100))
calculator.add_axis("prismatic_joint", np.linspace(-3, 3, 200))
calculator.execute()
```
#### Range Appearance
- 1 means collided
- 0 means collision-free

## Examples
The `examples/` directory contains comprehensive examples organized by functionality:
## Interactive Notebooks
Explore the library through interactive Jupyter notebooks:
### Visualization Notebooks
- `notebooks/visual/01.base.ipynb` - Basic visualization concepts
- `notebooks/visual/02.mesh.ipynb` - Mesh visualization
- `notebooks/visual/03.robot.ipynb` - Robot visualization
- `notebooks/visual/04.move.ipynb` - Motion visualization
- `notebooks/visual/05.collision.ipynb` - Collision visualization
- `notebooks/visual/06.range_2axes.ipynb` - 2D workspace analysis
- `notebooks/visual/07.range_3axes.ipynb` - 3D workspace analysis
### URDF Notebooks
- `notebooks/urdf/01.import_export.ipynb` - URDF import/export demonstration
## Future Works
- More URDF compatibility such as dae
- Inverse Kinematics
- Path planning using OMPL
## Development
### Code Quality
```bash
# Format code
uv run ruff format
# Check code quality
uv run ruff check
# Auto-fix issues
uv run ruff check --fix
```
### Testing
```bash
# Run all tests
uv run pytest
# Run specific test file
uv run pytest tests/test_robot/test_robot.py
# Run with coverage
uv run pytest --cov
# Verbose output
uv run pytest -v
```
### Development Scripts
```bash
# Format, lint, and test in sequence
./scripts/format_lint_test.sh
# Run all examples
./scripts/run_all_examples.sh
```
## Project Structure
```
linkmotion/
├── src/linkmotion/ # Main source code
│ ├── robot/ # Robot modeling and manipulation
│ ├── transform/ # Spatial transformations
│ ├── move/ # Robot joint control and movement
│ ├── collision/ # Collision detection
│ ├── range/ # Workspace analysis
│ ├── modeling/ # Advanced geometric modeling
│ ├── urdf/ # URDF import/export
│ ├── visual/ # 3D visualization
│ ├── typing/ # Type definitions
│ └── const/ # Constants and configuration
├── tests/ # Comprehensive test suite
├── examples/ # Usage examples by functionality
├── notebooks/ # Interactive Jupyter notebooks
├── models/ # Sample robot models and meshes
├── docs/ # Auto-generated documentation
└── scripts/ # Development automation scripts
```
## API Reference
Here is [API Reference](https://hshrg-kw.github.io/linkmotion/).
### Core Classes
- **`Robot`** - Main robot class for building and manipulating robot models
- **`Link`** - Robot link with geometric shapes and properties
- **`Joint`** - Robot joint with motion constraints and types
- **`Transform`** - 3D transformation operations and calculations
- **`MoveManager`** - Robot joint control and state management interface
- **`CollisionManager`** - Collision detection and safety checking
### Shape Classes
- **`Box`**, **`Sphere`**, **`Cylinder`**, **`Cone`**, **`Capsule`** - Primitive shapes
- **`Mesh`** - Complex mesh geometry
- **`Convex`** - Convex hull shapes
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes following the coding guidelines in `CLAUDE.md`
4. Run tests and quality checks
5. Submit a pull request
### Coding Standards
- Follow Google-style docstrings
- Use type hints for all functions
- Implement `__repr__` for custom classes
- Use logging instead of print statements
- Follow PEP 8 style guide (enforced by Ruff)
## License
MIT License
Raw data
{
"_id": null,
"home_page": null,
"name": "linkmotion",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": "hshrg-kw <232059135+hshrg-kw@users.noreply.github.com>",
"keywords": "automation, collision detection, kinematics, robotics, simulation, urdf, visualization",
"author": null,
"author_email": "hshrg-kw <232059135+hshrg-kw@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/a3/2d/5f3926b3bd1686cb83bc6746f03f6f51b02837ab57f0c003882b6f17dc8c/linkmotion-0.1.14.tar.gz",
"platform": null,
"description": "# LinkMotion\n\nA comprehensive Python library for robotics applications, providing tools for robot modeling, joint control, collision detection, visualization, and URDF import/export functionality.\n\n## Features\n\n### \ud83e\udd16 Robot Modeling\n- **Flexible Robot Construction**: Build complex robot models from primitive shapes (box, sphere, cylinder, cone, capsule, mesh)\n- **Joint System**: Support for revolute, prismatic, and fixed joints with configurable constraints\n- **Hierarchical Structure**: Tree-based robot structure with parent-child relationships\n- **Custom Robots**: Advanced robot construction utilities and custom modeling tools\n\n### \ud83d\udd04 Transform System\n- **Spatial Transformations**: Comprehensive 3D transformation calculations\n- **Coordinate Frames**: Hierarchical coordinate frame management\n- **Transform Manager**: Advanced transform hierarchy handling and operations\n\n### \ud83c\udfaf Robot Movement\n- **Joint Control**: Precise control of robot joint positions and states\n- **State Management**: Real-time management of robot configuration\n- **Transform Updates**: Automatic update of link transformations based on joint movements\n\n### \ud83d\udca5 Collision Detection\n- **Real-time Collision Checking**: Fast collision detection using FCL (Flexible Collision Library)\n- **Safety Verification**: Comprehensive collision checking for robot configurations\n- **Collision Manager**: High-level collision detection interface\n\n### \ud83d\udcd0 Workspace Analysis\n- **Reachability Analysis**: Calculate robot workspace and reachable areas, which is called `range` in this project\n- **Range Calculations**: Joint and workspace limit analysis\n- **Multi-axis Analysis**: 2D and 3D workspace visualization\n\n### \ud83c\udfa8 3D Visualization\n- **Interactive Visualization**: 3D robot visualization using K3D\n- **Motion Animation**: Real-time motion visualization and animation\n- **Collision Visualization**: Visual collision detection and safety checking\n\n### \ud83d\udcc4 URDF Support\n- **URDF Import**: Parse and import URDF (Unified Robot Description Format) files\n- **URDF Export**: Generate URDF files from robot models\n- **Mesh Support**: Handle complex mesh geometries in URDF files\n\n### \u2699\ufe0f Advanced Modeling\n- **Sweep Operations**: Complex geometry generation through sweep operations\n- **Geometry Modification**: Advanced geometry removal and modification tools\n\n## Installation\n\n### Prerequisites\n\n- Python 3.12 or higher\n\n### Basic Installation\n\n```bash\npip install linkmotion\n```\n\n### With Jupyter Support\n\nFor interactive notebooks and visualization:\n\n```bash\npip install linkmotion[jup]\n```\n\n### Dependencies\n\n**Core Dependencies:**\n- `joblib` - Parallel computing utilities\n- `manifold3d` - 3D geometry processing\n- `python-fcl` - Collision detection library\n- `scipy` - Scientific computing\n- `shapely` - Geometric operations\n- `trimesh` - 3D mesh processing\n\n**Optional Dependencies (with `--extra jup`):**\n- `jupyter` - Interactive notebooks\n- `k3d` - 3D visualization in Jupyter\n- `plotly` - Interactive plotting\n\n## Quick Start\n\n### Basic Robot Construction\n\n```python\nimport numpy as np\nfrom scipy.spatial.transform import Rotation as R\n\nfrom linkmotion import Robot, Link, Joint, JointType, Transform\n\nhumanoid = Robot()\n\nbody = Link.from_box(\"body\", extents=np.array((3, 2, 10)))\n\nt = Transform(rotate=R.from_rotvec(90.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((4, 0, 3)))\nright_arm = Link.from_cylinder(\"right_arm\", radius=0.5, height=5, default_transform=t)\n\nt = Transform(rotate=R.from_rotvec(90.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((-4, 0, 3)))\nleft_arm = Link.from_cylinder(\"left_arm\", radius=0.5, height=5, default_transform=t)\n\nt = Transform(rotate=R.from_rotvec(180.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((1, 0, -8)))\nright_leg = Link.from_cone(\"right_leg\", radius=0.5, height=6, default_transform=t)\n\nt = Transform(rotate=R.from_rotvec(180.0 * np.array((0, 1, 0)), degrees=True), translate=np.array((-1, 0, -8)))\nleft_leg = Link.from_cone(\"left_leg\", radius=0.5, height=6, default_transform=t)\n\nt = Transform(translate=np.array((0, 0, -5)))\nhead = Link.from_sphere(\"head\", 3, center=np.array((0, 0, 8)))\n\nleft_leg_joint = Joint(\n \"left_leg_joint\",\n JointType.REVOLUTE,\n child_link_name=\"left_leg\",\n parent_link_name=\"body\",\n center=np.array((-1, 0, -5)),\n direction=np.array((1, 0, 0)),\n min_=-np.pi / 2.0,\n max_=np.pi / 4.0,\n)\n\nt = Transform(translate=np.array((0, -5, 0)))\nwall = Link.from_box(\"wall\", extents=np.array((20, 1, 20)), default_transform=t, color=np.array((0.0, 0.8, 0.8, 0.2)))\n\nhumanoid.add_link(body)\nhumanoid.add_link(right_arm)\nhumanoid.add_link(left_arm)\nhumanoid.add_link(right_leg)\nhumanoid.add_link(left_leg)\nhumanoid.add_link(head)\nhumanoid.add_joint(left_leg_joint)\nhumanoid.add_link(wall)\n```\n\n#### Robot Appearance\n\n\n### Transform Operations\n```python\nfrom linkmotion import MoveManager\n\nmm = MoveManager(humanoid)\nmm.move(joint_name=\"left_leg_joint\", value=-np.pi / 6.0)\n```\n#### Robot Appearance\n\n\n### Collision Detection\n\n```python\nfrom linkmotion import CollisionManager\n\ncm = CollisionManager(mm)\ncm.distance({\"wall\"}, {\"body\", \"left_leg\", \"right_leg\"})\n```\n#### Robot Appearance\n\n\n### URDF Import/Export\n\n```python\nrobot = Robot.from_urdf_file(\"../../models/toy_model/toy_model.urdf\")\n```\n#### Robot Appearance\n\n\n### Range Calculations\n```python\nimport numpy as np\nfrom scipy.spatial.transform import Rotation as R\n\nfrom linkmotion import Robot, Link, Joint, JointType, Transform\n\nrobot = Robot()\n\nbase_link = Link.from_sphere(\n name=\"base_link\", radius=0.1, center=np.array([0, 0, 0])\n)\narm_link = Link.from_cylinder(\n name=\"arm_link\",\n radius=0.1,\n height=1.0,\n default_transform=Transform(translate=np.array([0, 0, 0.5])),\n)\nhand_link = Link.from_box(\n name=\"hand_link\",\n extents=np.array([0.1, 0.1, 0.1]),\n default_transform=Transform(translate=np.array([0, 0, 1.0])),\n color=np.array([0, 1, 0, 1]),\n)\nfinger_link = Link.from_box(\n name=\"finger_link\",\n extents=np.array([0.05, 0.05, 0.1]),\n default_transform=Transform(translate=np.array([0, 0, 1.1])),\n color=np.array([1, 0, 0, 1]),\n)\nobstacle_link = Link.from_box(\n name=\"obstacle_link\",\n extents=np.array([10, 10, 0.1]),\n default_transform=Transform(translate=np.array([0, 0, 1.5])),\n)\n\nrevolute_joint = Joint(\n name=\"revolute_joint\",\n type=JointType.REVOLUTE,\n parent_link_name=\"base_link\",\n child_link_name=\"arm_link\",\n direction=np.array([1, 0, 0]),\n center=np.array([0, 0, 0.0]),\n min_=-np.pi / 2,\n max_=np.pi / 2,\n)\n\nprismatic_joint = Joint(\n name=\"prismatic_joint\",\n type=JointType.PRISMATIC,\n parent_link_name=\"arm_link\",\n child_link_name=\"hand_link\",\n direction=np.array([0, 1, 0]),\n center=np.array([0, 0, 1.0]),\n min_=-10,\n max_=10,\n)\n\nprismatic_joint2 = Joint(\n name=\"prismatic_joint2\",\n type=JointType.PRISMATIC,\n parent_link_name=\"hand_link\",\n child_link_name=\"finger_link\",\n direction=np.array([0, 0, 1]),\n center=np.array([0, 0, 1.1]),\n min_=-10,\n max_=10,\n)\n\nrobot.add_link(base_link)\nrobot.add_link(arm_link)\nrobot.add_link(hand_link)\nrobot.add_link(finger_link)\nrobot.add_link(obstacle_link)\nrobot.add_joint(revolute_joint)\nrobot.add_joint(prismatic_joint)\nrobot.add_joint(prismatic_joint2)\n```\n\n#### Robot Appearance\n\n\n```python\nfrom linkmotion.range.range import RangeCalculator\n\ncalculator = RangeCalculator(\n robot, {\"hand_link\", \"finger_link\"}, {\"obstacle_link\"}\n)\ncalculator.add_axis(\"revolute_joint\", np.linspace(-np.pi / 2, np.pi / 2, 100))\ncalculator.add_axis(\"prismatic_joint\", np.linspace(-3, 3, 200))\ncalculator.execute()\n```\n\n#### Range Appearance\n- 1 means collided\n- 0 means collision-free\n\n\n\n## Examples\n\nThe `examples/` directory contains comprehensive examples organized by functionality:\n\n## Interactive Notebooks\n\nExplore the library through interactive Jupyter notebooks:\n\n### Visualization Notebooks\n- `notebooks/visual/01.base.ipynb` - Basic visualization concepts\n- `notebooks/visual/02.mesh.ipynb` - Mesh visualization\n- `notebooks/visual/03.robot.ipynb` - Robot visualization\n- `notebooks/visual/04.move.ipynb` - Motion visualization\n- `notebooks/visual/05.collision.ipynb` - Collision visualization\n- `notebooks/visual/06.range_2axes.ipynb` - 2D workspace analysis\n- `notebooks/visual/07.range_3axes.ipynb` - 3D workspace analysis\n\n### URDF Notebooks\n- `notebooks/urdf/01.import_export.ipynb` - URDF import/export demonstration\n\n## Future Works\n\n- More URDF compatibility such as dae\n- Inverse Kinematics\n- Path planning using OMPL\n\n## Development\n\n### Code Quality\n\n```bash\n# Format code\nuv run ruff format\n\n# Check code quality\nuv run ruff check\n\n# Auto-fix issues\nuv run ruff check --fix\n```\n\n### Testing\n\n```bash\n# Run all tests\nuv run pytest\n\n# Run specific test file\nuv run pytest tests/test_robot/test_robot.py\n\n# Run with coverage\nuv run pytest --cov\n\n# Verbose output\nuv run pytest -v\n```\n\n### Development Scripts\n\n```bash\n# Format, lint, and test in sequence\n./scripts/format_lint_test.sh\n\n# Run all examples\n./scripts/run_all_examples.sh\n```\n\n## Project Structure\n\n```\nlinkmotion/\n\u251c\u2500\u2500 src/linkmotion/ # Main source code\n\u2502 \u251c\u2500\u2500 robot/ # Robot modeling and manipulation\n\u2502 \u251c\u2500\u2500 transform/ # Spatial transformations\n\u2502 \u251c\u2500\u2500 move/ # Robot joint control and movement\n\u2502 \u251c\u2500\u2500 collision/ # Collision detection\n\u2502 \u251c\u2500\u2500 range/ # Workspace analysis\n\u2502 \u251c\u2500\u2500 modeling/ # Advanced geometric modeling\n\u2502 \u251c\u2500\u2500 urdf/ # URDF import/export\n\u2502 \u251c\u2500\u2500 visual/ # 3D visualization\n\u2502 \u251c\u2500\u2500 typing/ # Type definitions\n\u2502 \u2514\u2500\u2500 const/ # Constants and configuration\n\u251c\u2500\u2500 tests/ # Comprehensive test suite\n\u251c\u2500\u2500 examples/ # Usage examples by functionality\n\u251c\u2500\u2500 notebooks/ # Interactive Jupyter notebooks\n\u251c\u2500\u2500 models/ # Sample robot models and meshes\n\u251c\u2500\u2500 docs/ # Auto-generated documentation\n\u2514\u2500\u2500 scripts/ # Development automation scripts\n```\n\n## API Reference\n\nHere is [API Reference](https://hshrg-kw.github.io/linkmotion/).\n\n### Core Classes\n\n- **`Robot`** - Main robot class for building and manipulating robot models\n- **`Link`** - Robot link with geometric shapes and properties\n- **`Joint`** - Robot joint with motion constraints and types\n- **`Transform`** - 3D transformation operations and calculations\n- **`MoveManager`** - Robot joint control and state management interface\n- **`CollisionManager`** - Collision detection and safety checking\n\n### Shape Classes\n\n- **`Box`**, **`Sphere`**, **`Cylinder`**, **`Cone`**, **`Capsule`** - Primitive shapes\n- **`Mesh`** - Complex mesh geometry\n- **`Convex`** - Convex hull shapes\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes following the coding guidelines in `CLAUDE.md`\n4. Run tests and quality checks\n5. Submit a pull request\n\n### Coding Standards\n\n- Follow Google-style docstrings\n- Use type hints for all functions\n- Implement `__repr__` for custom classes\n- Use logging instead of print statements\n- Follow PEP 8 style guide (enforced by Ruff)\n\n## License\n\nMIT License\n",
"bugtrack_url": null,
"license": null,
"summary": "LinkMotion is a comprehensive robotics library that provides tools for robot modeling, joint control, collision detection, visualization, and URDF import/export functionality.",
"version": "0.1.14",
"project_urls": {
"Documentation": "https://hshrg-kw.github.io/linkmotion/",
"Homepage": "https://github.com/hshrg-kw/linkmotion",
"Issues": "https://github.com/hshrg-kw/linkmotion/issues",
"Repository": "https://github.com/hshrg-kw/linkmotion"
},
"split_keywords": [
"automation",
" collision detection",
" kinematics",
" robotics",
" simulation",
" urdf",
" visualization"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f11576ab483773712dbd9cfc9d66ae926019ea46dfc4029d3f403115bc6badbe",
"md5": "f890d04a9f6a07bda474f22e4a19507e",
"sha256": "bac9f0ded4da717eeadd7551f8db5d1c80d5a2e71ba05653c55a2bae0d61ed6c"
},
"downloads": -1,
"filename": "linkmotion-0.1.14-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f890d04a9f6a07bda474f22e4a19507e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.12",
"size": 71223,
"upload_time": "2025-10-07T11:19:15",
"upload_time_iso_8601": "2025-10-07T11:19:15.728013Z",
"url": "https://files.pythonhosted.org/packages/f1/15/76ab483773712dbd9cfc9d66ae926019ea46dfc4029d3f403115bc6badbe/linkmotion-0.1.14-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a32d5f3926b3bd1686cb83bc6746f03f6f51b02837ab57f0c003882b6f17dc8c",
"md5": "0f6f51eeb8f07e8846fe7728064e3feb",
"sha256": "44aac32a50d7a7d21fe5596923e71c16dad2fe236bf7b13502212a9fc1b8e15e"
},
"downloads": -1,
"filename": "linkmotion-0.1.14.tar.gz",
"has_sig": false,
"md5_digest": "0f6f51eeb8f07e8846fe7728064e3feb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 1530223,
"upload_time": "2025-10-07T11:19:16",
"upload_time_iso_8601": "2025-10-07T11:19:16.917624Z",
"url": "https://files.pythonhosted.org/packages/a3/2d/5f3926b3bd1686cb83bc6746f03f6f51b02837ab57f0c003882b6f17dc8c/linkmotion-0.1.14.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-07 11:19:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "hshrg-kw",
"github_project": "linkmotion",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "linkmotion"
}