-
Notifications
You must be signed in to change notification settings - Fork 0
Modular manipulation stack #1079
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: dev
Are you sure you want to change the base?
Conversation
Greptile Summary
Important Files Changed
Confidence score: 4/5
Sequence DiagramsequenceDiagram
participant User
participant ManipulationModule
participant WorldMonitor
participant DrakeWorld
participant RRTPlanner
participant JacobianIK
participant Orchestrator
User->>ManipulationModule: "plan_to_joints([0.1, 0.2, 0.3])"
ManipulationModule->>WorldMonitor: "get_current_positions()"
WorldMonitor->>DrakeWorld: "get_positions(ctx, robot_id)"
DrakeWorld-->>WorldMonitor: "current_joints"
WorldMonitor-->>ManipulationModule: "current_joints"
ManipulationModule->>RRTPlanner: "plan_joint_path(world, robot_id, start, goal)"
RRTPlanner->>DrakeWorld: "check_config_collision_free(robot_id, q)"
DrakeWorld-->>RRTPlanner: "collision_free"
RRTPlanner-->>ManipulationModule: "PlanningResult(path)"
ManipulationModule->>ManipulationModule: "generate_trajectory(path)"
ManipulationModule-->>User: "plan_success"
User->>ManipulationModule: "execute()"
ManipulationModule->>ManipulationModule: "translate_trajectory_to_orchestrator()"
ManipulationModule->>Orchestrator: "execute_trajectory(task_name, trajectory)"
Orchestrator-->>ManipulationModule: "execution_accepted"
ManipulationModule-->>User: "execution_started"
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
33 files reviewed, 14 comments
2b839fb to
21a0403
Compare
…manipulation scenes
…cene and owns the scene graph
…ith real world. manages obstacle lifecycle and more
…anner and interfaces with other modules
… implementation, split kinematics into JacobianIK and DrakeOptimizationIK
manipulation_blueprint - Added optional add_gripper: bool = True to make xarm6 ans xarm7 config consistent. world_obstacle_monitor - Added warning log when obstacle not found during cleanup manipulation_client - Removed unused numpy impor path_utils - Added explicit tolerances atol=1e-6, rtol=0 to np.allclose() for stricter joint-space duplicate detection jacobian_ik - Added division-by-zero protection for velocity limits using nonzero_mask to skip zero-valued limits drake_world.py - added more specific exception handling (avoids hiding bugs) mesh_utils - regex fixes
ec17f02 to
8d2020a
Compare
| # ============================================================================= | ||
|
|
||
|
|
||
| def _get_xarm_urdf_path() -> str: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ideally you can use Path objects for paths, they are super convinient, so no need for str conversion
|
|
||
| def _get_xarm_urdf_path() -> str: | ||
| """Get path to xarm URDF.""" | ||
| return str(get_data("xarm_description") / "urdf/xarm_device.urdf.xacro") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
get_data("xarm_description/urdf/xarm_device.urdf.xacro") is now supported - returns full Path
| return RobotModelConfig( | ||
| name=name, | ||
| urdf_path=_get_xarm_urdf_path(), | ||
| base_pose=np.array( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
a bit suspicious, why not Pose
| Attributes: | ||
| name: Unique name for the obstacle | ||
| obstacle_type: Type of geometry (BOX, SPHERE, CYLINDER, MESH) | ||
| pose: 4x4 homogeneous transform |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
you have Pose :)
| def solve( | ||
| self, | ||
| world: WorldSpec, | ||
| robot_id: str, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm never sure if we should use robot_ids or actual instances/classes, it's more easy to not maintain ID -> something layer if you can use something directly
(world.robot1) ?
| self, | ||
| world: WorldSpec, | ||
| robot_id: str, | ||
| target_pose: NDArray[np.float64], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PoseStamped?
| q_start: NDArray[np.float64], | ||
| q_goal: NDArray[np.float64], | ||
| timeout: float = 10.0, | ||
| ) -> PlanningResult: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this be a full joint space "path" so that it can be fed into a controller immediately?
because we might want to use planners that plan in full joint space for difficult situations
Summary