isaac-sim / IsaacLab

Unified framework for robot learning built on NVIDIA Isaac Sim
https://isaac-sim.github.io/IsaacLab
Other
2.33k stars 966 forks source link

[Question] is there any examples for using mobile manipulators ? #79

Closed nikepupu closed 1 month ago

nikepupu commented 1 year ago

Question

I have a usd file for my dualarm mobile robot. I want to run some RL with it. Is there any examples or descriptions on how I can get started?

prajapatisarvesh commented 1 year ago

@nikepupu I had the same question, I have a mobile manipulator (differential), and I modified the configuration file for my robot, but couldn't find any examples for differential base robots. Were you able to find something? Thanks

nikepupu commented 1 year ago

yes, I am able to get my robot to work through modifying the Franka example in the code base. However, I need to modify the USD file quite a lot to get it to work. Somehow there are some issues with joints when changing URDF to USD.

prajapatisarvesh commented 1 year ago

That's amazing, what mobile robot are you using? Also, is it holonomic or differential? Thanks

nikepupu commented 1 year ago

It's a ridgeback with 2 UR5s

prajapatisarvesh commented 1 year ago

Oh okay, that's a holonomic drive. I doubt if orbit supports differential or Ackerman drive for now, will have to dig more into documentation I guess. Thanks for the response though!

nikepupu commented 1 year ago

I don't think orbit or isaac sim really has the concept of holonomic drive or differential drive. It's actually implemented through two prismatic joint in x and y direction and a revolute joint in x-y plane for holonomic drive. It not really simulating a wheel rotating. I don't really think the simulator is complex enough to handle actually wheel movement for a very complicated base. For differential, you need to come up with different constraints or equivalents.

prajapatisarvesh commented 1 year ago

Yes you are right. I suppose with prismatic x, y and revolute z we can model almost every holonomic drives but won't be the same for differential. Well that solves my problem. I have a mobile manipulator to I'm not sure if I'll be able to use underlying or it's feature even after modelling the constraints. Thanks though for the clarification!

JChunX commented 1 year ago

Not sure if this helps, but I was able to get the Nvidia Carter robot working with differential control commanding wheel velocities independently by simply remapping the dofs:

from omni.isaac.orbit.robots.mobile_manipulator import MobileManipulatorCfg
from omni.isaac.orbit.actuators.group import ActuatorControlCfg, ActuatorGroupCfg
from omni.isaac.orbit.actuators.model import ImplicitActuatorCfg

ROBOT_USD = "robot_usd_path"

ROBOT_CFG = MobileManipulatorCfg(
    meta_info=MobileManipulatorCfg.MetaInfoCfg(
        usd_path=ROBOT_USD,
        base_num_dof=2,
        tool_num_dof=0,
        arm_num_dof=0,
    ),
    init_state=MobileManipulatorCfg.InitialStateCfg(
        dof_pos={
            'left_wheel': 0.0,
            'right_wheel': 0.0,
        },
        dof_vel={
            'left_wheel': 0.0,
            'right_wheel': 0.0,
        },
    ),
    ee_info=MobileManipulatorCfg.EndEffectorFrameCfg(
        body_name="chassis_link", pos_offset=(0.0, 0.0, 0.1034), rot_offset=(1.0, 0.0, 0.0, 0.0)
    ),
    actuator_groups={
        "base": ActuatorGroupCfg(
            dof_names=["left_wheel", "right_wheel"],
            model_cfg=ImplicitActuatorCfg(velocity_limit=100.0, torque_limit=1000.0),
            control_cfg=ActuatorControlCfg(
                command_types=["v_abs"], 
                stiffness={".*": 0.0}, 
                damping={".*": 1e5}),
        ),
    },
)

The robot can then be operated using:

...

actions = torch.tensor([[left_vel, right_vel] for _ in range(robot.count)], device=robot.device)
robot.apply_action(actions)

...