linkmotion


Namelinkmotion JSON
Version 0.1.14 PyPI version JSON
download
home_pageNone
SummaryLinkMotion is a comprehensive robotics library that provides tools for robot modeling, joint control, collision detection, visualization, and URDF import/export functionality.
upload_time2025-10-07 11:19:16
maintainerNone
docs_urlNone
authorNone
requires_python>=3.12
licenseNone
keywords automation collision detection kinematics robotics simulation urdf visualization
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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
![OutputExample](imgs/readme1.png)

### Transform Operations
```python
from linkmotion import MoveManager

mm = MoveManager(humanoid)
mm.move(joint_name="left_leg_joint", value=-np.pi / 6.0)
```
#### Robot Appearance
![OutputExample](imgs/readme2.png)

### Collision Detection

```python
from linkmotion import CollisionManager

cm = CollisionManager(mm)
cm.distance({"wall"}, {"body", "left_leg", "right_leg"})
```
#### Robot Appearance
![OutputExample](imgs/readme3.png)

### URDF Import/Export

```python
robot = Robot.from_urdf_file("../../models/toy_model/toy_model.urdf")
```
#### Robot Appearance
![OutputExample](notebooks/urdf/img/import_export/import_export1.png)

### 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
![OutputExample](notebooks/visual/img/range_2axes/range_2axes2.png)

```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

![OutputExample](notebooks/visual/img/range_2axes/range_2axes3.png)

## 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![OutputExample](imgs/readme1.png)\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![OutputExample](imgs/readme2.png)\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![OutputExample](imgs/readme3.png)\n\n### URDF Import/Export\n\n```python\nrobot = Robot.from_urdf_file(\"../../models/toy_model/toy_model.urdf\")\n```\n#### Robot Appearance\n![OutputExample](notebooks/urdf/img/import_export/import_export1.png)\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![OutputExample](notebooks/visual/img/range_2axes/range_2axes2.png)\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![OutputExample](notebooks/visual/img/range_2axes/range_2axes3.png)\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"
}
        
Elapsed time: 0.77120s