Cartesian Goals Example

Cartesian Goals Example#

This example demonstrates how to use CartesianPose goals to move a robot to a specific pose. We will use the PR2 robot for this demonstration.

import os
from cramph.context import StatechartContext
from cramph.executor import SimulationPacer, StatechartExecutor
from giskardpy.motion_control import MotionControl
from giskardpy.motion_statechart.graph_node import EndMotion
from cramph.statechart import Statechart
from giskardpy.motion_statechart.tasks.cartesian_tasks import CartesianPose
from giskardpy.qp.qp_controller_config import QPControllerConfig
from semantic_digital_twin.world import World
from krrood_spatial_math.spatial_types import Pose, Vector3, Quaternion
from semantic_digital_twin.adapters.urdf import URDFParser
from semantic_digital_twin.robots.pr2 import PR2
from semantic_digital_twin.world_description.world_entity import Body
from semantic_digital_twin.datastructures.prefixed_name import PrefixedName
from semantic_digital_twin.world_description.connections import Connection6DoF, OmniDrive

# 1. Load the PR2 robot into the world
# We use the same configuration as in pr2_world_setup
urdf_path = "package://iai_pr2_description/robots/pr2_with_ft2_cableguide.xacro"
urdf_parser = URDFParser.from_file(file_path=urdf_path)
world = urdf_parser.create_world()

# Initialize PR2 semantic annotation
try:
    pr2 = PR2.from_world(world)
except Exception as e:
    print(f"Warning: Could not fully initialize PR2 semantic annotation: {e}")

# Replicate the world structure from world_with_urdf_factory:
# map -> odom_combined -> base_footprint (robot root)
with world.modify_world():
    map_body = Body(name=PrefixedName("map"))
    localization_body = Body(name=PrefixedName("odom_combined"))

    map_C_localization = Connection6DoF.create_with_dofs(
        world, map_body, localization_body
    )
    world.add_connection(map_C_localization)

    c_root_bf = OmniDrive.create_with_dofs(
        parent=localization_body,
        child=world.root,
        world=world,
    )
    world.add_connection(c_root_bf)
    c_root_bf.has_hardware_interface = True

# 2. Set up the executor with motion control, and create a Motion Statechart in its context
executor = StatechartExecutor(
    context=StatechartContext(world=world),
    pacer=SimulationPacer(real_time_factor=None), # None for fastest execution in docs
    extensions=[
        MotionControl(
            qp_controller_config=QPControllerConfig.create_with_simulation_defaults()
        )
    ],
)
statechart = Statechart(context=executor.context)

# 3. Define a Cartesian Pose Goal
# We want to move the left gripper to a specific pose relative to the world root
root_link = world.root
tip_link = world.get_body_by_name("l_gripper_tool_frame")

goal_pose = Pose(
    position=Vector3(0.5, 0.5, 1.2), 
    orientation=Quaternion(0, 0, 0, 1), 
    reference_frame=root_link
)
goal = CartesianPose(
    name="move_to_goal", 
    root_link=root_link, 
    tip_link=tip_link, 
    goal_pose=goal_pose
)

statechart.add_node(goal)
statechart.add_node(EndMotion.when_true(goal))

# 4. Compile and run the statechart
executor.compile(statechart)
executor.tick_until_end(timeout=100)
print(f"Motion finished after {executor.tick_count} cycles.")
---------------------------------------------------------------------------
PathResolutionError                       Traceback (most recent call last)
Cell In[1], line 20
     16 
     17 # 1. Load the PR2 robot into the world
     18 # We use the same configuration as in pr2_world_setup
     19 urdf_path = "package://iai_pr2_description/robots/pr2_with_ft2_cableguide.xacro"
---> 20 urdf_parser = URDFParser.from_file(file_path=urdf_path)
     21 world = urdf_parser.create_world()
     22 
     23 # Initialize PR2 semantic annotation

File ~/work/cognitive_robot_abstract_machine/cognitive_robot_abstract_machine/semantic_digital_twin/src/semantic_digital_twin/adapters/urdf.py:170, in URDFParser.from_file(cls, file_path, prefix, path_resolver, use_visual_as_collision_backup)
    161 @classmethod
    162 def from_file(
    163     cls,
   (...)    167     use_visual_as_collision_backup: bool = False,
    168 ) -> URDFParser:
    169     if file_path.endswith(".xacro"):
--> 170         return cls.from_xacro(
    171             file_path,
    172             prefix,
    173             use_visual_as_collision_backup=use_visual_as_collision_backup,
    174         )
    176     path_resolver = path_resolver or CompositePathResolver()
    178     file_path = path_resolver.resolve(file_path)

File ~/work/cognitive_robot_abstract_machine/cognitive_robot_abstract_machine/semantic_digital_twin/src/semantic_digital_twin/adapters/urdf.py:214, in URDFParser.from_xacro(cls, xacro_path, prefix, mappings, use_visual_as_collision_backup)
    192 @classmethod
    193 def from_xacro(
    194     cls,
   (...)    198     use_visual_as_collision_backup: bool = False,
    199 ) -> URDFParser:
    200     """
    201     Creates a parser from a xacro file by expanding it to URDF.
    202 
   (...)    212     :return: A parser for the world described by the expanded xacro file.
    213     """
--> 214     xacro_path = CompositePathResolver().resolve(xacro_path)
    215     urdf = process_file(xacro_path, mappings=mappings).toxml()
    216     return URDFParser(
    217         urdf=urdf,
    218         prefix=prefix,
    219         use_visual_as_collision_backup=use_visual_as_collision_backup,
    220     )

File ~/work/cognitive_robot_abstract_machine/cognitive_robot_abstract_machine/semantic_digital_twin/src/semantic_digital_twin/adapters/package_resolver.py:330, in CompositePathResolver.resolve(self, uri)
    327     except ParsingError as error:
    328         errors.append(str(error))
--> 330 raise PathResolutionError(uri=uri, details="; ".join(errors))

PathResolutionError: Could not resolve path 'package://iai_pr2_description/robots/pr2_with_ft2_cableguide.xacro'. Details: Could not resolve package 'iai_pr2_description'. Details: Could not resolve package 'iai_pr2_description'. Details: ament: No module named 'ament_index_python'; Could not resolve package 'iai_pr2_description'. Details: not found in ROS_PACKAGE_PATH; Could not resolve package 'iai_pr2_description'. Details: not found in any of 0 install prefixes