/home-robot

Low-level API for controlling various home robots

Primary LanguageJupyter NotebookMIT LicenseMIT

Home Robot

CircleCI Code style: black Imports: isort GitHub license Python 3.8 pre-commit

Mostly Hello Stretch infrastructure

Installation & Usage

This project contains numerous packages. See individual package docs for corresponding details & instructions.

Resource Description
home_robot Core package
home_robot_hw ROS package containing hardware drivers for the Hello Stretch Robot
home_robot_sim Simulation
home_robot_client Minimal remote client

Getting Started on the Hello Stretch

Make sure you update all submodules by running:

git submodule update --recursive --init
  1. SSH into the onboard computer on the Hello Stretch.
  2. Install home_robot_hw.
  3. Install home_robot.
  4. Launch the ROS hardware stack:
    conda deactivate
    roslaunch home_robot startup_stretch_hector_slam.launch
  5. In a separate shell, launch home-robot helper nodes:
    conda activate home_robot
    python -m home_robot.nodes.state_estimator &
    python -m home_robot.nodes.goto_controller &
  6. Launch interactive client: python -m home_robot.client.local_hello_robot

You should then be able to command the robot using the following commands:

# Query states
robot.get_base_state()  # returns base location in the form of [x, y, rz]

# Mode switching
robot.switch_to_velocity_mode()  # enables base velocity control
robot.switch_to_navigation_mode()  # enables continuous navigation
robot.switch_to_manipulation_mode()  # enables gripper control

# Velocity mode
robot.set_velocity(v: float, w: float)  # directly sets the linear and angular velocity of robot base

# Navigation mode
robot.navigate_to(xyt: list, relative: bool = False, position_only: bool = False)

# Manipulation mode
robot.set_arm_joint_positions(joint_positions: list)  # joint positions: [BASE_TRANSLATION, ARM_LIFT, ARM_EXTENTION, WRIST_YAW, WRIST_PITCH, WRIST_ROLL]
robot.set_ee_pose(pos: list, quat: list, relative: bool = False)

Basic example:

robot.get_base_state()  # Shows the robot's SE2 coordinates (should be [0, 0, 0])

robot.switch_to_navigation_mode()
robot.navigate_to([0.3, 0.3, 0.0])  # Sets SE2 target
robot.get_base_state()  # Shows the robot's SE2 coordinates (should be close to [0.3, 0.3, 0])

robot.switch_to_manipulation_mode()
robot.set_ee_pose([0.5, 0.6, 0.5], [0, 0, 0, 1])

Launching Grasping Demo (outdated)

You need to create a catkin workspace on your server in order to run this demo, as this is where we will run Contact Graspnet.

Contact graspnet is downloaded under third_party/, but there is a CATKIN_IGNORE file in this directory. You want to symlink this file out into your workspace:

ROSWS=/path/to/ros_ws
ln -s `rospack find home_robot`/third_party/contact_graspnet $ROSWS/src/contact_graspnet

... but it actually shouldn't be necessary. What is necessary is to build the grasp service defined in home_robot by placing it into $ROSWS.

Put the robot in its initial position, e.g. so the arm is facing cups you can pick up. On the robot side:

roslaunch home_robot startup_stretch_hector_slam.launch

Note: Contact GraspNet

Contact graspnet is supported as a way of generating candidate grasps for the Stretch to use on various objects. We have our own fork of Contact Graspnet which has been modified with a ROS interface.

Follow the installation instructions as normal and start it with:

conda activate contact_graspnet_env
~/src/contact_graspnet$ python contact_graspnet/graspnet_ros_server.py  --local_regions --filter_grasps

Troubleshooting

  • ImportError: cannot import name 'gcd' from 'fractions': Launch ros nodes from an env with Python 3.8 instead of 3.9

Syncing code between Robot and Server

Let ROBOT_IP store the robot's IP and let SERVER_IP store the server's IP. If your local network doesn't have access to internet we recommend using rsync with --update flag to sync your code changes across the machines. Usage:

rsync -rvu /abs/path/to/local/home-robot $ROBOT_USER@$ROBOT_IP:/abs/path/to/remote/home-robot

The above command will do a recursive updating of changed files while echoing a verbose output.

Code Contribution

We enforce linters for our code. The lint test will not pass if your code does not conform.

Install the git pre-commit hooks by running

pip install pre-commit
pre-commit install

To format manually, run: pre-commit run --show-diff-on-failure --all-files

License

Home Robot is MIT licensed. See the LICENSE for details.

References (temp)