Note: development for this project was haulted in November 2020 to respect my NDA with my employer.
Spot Mini Mini OpenAI Gym Environment
Featured in Robotics Weekly and Mithi's Robotics Coursework!
Motivation
As part of the Spot Micro community, I saw the need for a reliable and versatile simulator for those who wanted to try things out without risking damage to their robots. To that end, I developed my own in Pybullet which can also be used as a Gym environment for Reinforcement Learning tasks.
You'll notice that there are gifs of the original SpotMicro as well a new version designed for added real world fidelity. The default branch simulates the new version, but you can work with SpotMicro in the spotmicroai branch of this repo. The new version also has a more reliable URDF, with more accurate inertial calculations.
If you don't need a Gym environment, that's okay too! env_tester.py works without RL or Gym, it is designed to accept any gait implementation, and provides a GUI for testing it out! In my case, I've implemented a 12-point Bezier gait.
Read the docs!
Table of Contents
- Motivation
- Kinematics
- D^2 Gait Modulation with Bezier Curves
- Training
- Real World Validation
- Gait
- How To Run
- Dependencies
- Joystick Control with ROS
- Testing Environment (Non-Joystick)
- Reinforcement Learning Agent Training
- Reinforcement Learning Agent Evaluation
- Using Different Terrain
- Hardware
- Citing Spot Mini Mini
- Credits
Kinematics
Body manipulation with leg IK and body IK descriptions.
D^2 Gait Modulation with Bezier Curves
I'm using this platform to validate a novel Reinforcement Learning method for locomotion by myself and my co-authors Matthew L. Elwin, Ian Abraham, and Todd D. Murphey. Instead of learning a gait from scratch, we propose using an existing scheme as a baseline over which we optimize via training. The method is called D^2 Gait Modulation with Bezier Curves. To learn more, visit our website
Training
During training, simple Proportional controller was employed to deliver yaw correction as would be the case if the robot were teleoperated or able to localize itself. For increased policy robustness, the terrain, link masses and foot frictions are randomized on each environment reset.
Here, the action space is 14-dimensional, consisting of Clearance Height (1), Body Height (1), and Foot XYZ Residual modulations (12). Clearance Height is treated through an exponential filter (alpha = 0.7), but all other actions are processed directly. These results were trained with only 149 epochs.
Before training, the robot falls almost immediately:
After training, the robot successfully navigates the terrain:
What's even better, is that the same agent #149 is able to adapt to unseen commands, making high-level system integration straightforward. Here it is being teleoperated using Forward, Lateral, and Yaw commands.
Here's an example of the new URDF being teleoperated with a trained agent on 2x higher terrain:
Real World Validation
Here are some experimental results where the agent is on the right.
Gait
Open-Loop Gait using 12-Point Bezier Curves based on MIT Cheetah Paper with modifications for low step velocity discontinuity.
Forward and Lateral Motion:
Yaw logic based on 4-wheel steering car:
How To Run
Dependencies
- ROS Melodic
- Gazebo
- Pytorch
- Pybullet
- Gym
- OpenCV
- Scipy
- Numpy
Joystick Control with ROS
First, you're going to need a joystick (okay, not really, but it's more fun if you have one).
Setting Up The Joystick:
- Get Number (you will see something like jsX):
ls /dev/input/ - Make available to ROS:
sudo chmod a+rw /dev/input/jsX - Make sure
matches your setup in the launchfile
Then simply: roslaunch mini_ros spot_move.launch
You can ignore this msg: [ERROR] [1591631380.406690714]: Couldn't open joystick force feedback! It just means your controller is missing some functionality, but this package doesn't use it.
Controls:
Assuming you have a Logitech Gamepad F310:
A: switch between stepping and RPY
X: E-STOP (engage and disengage)
Stepping Mode:
Right Stick Up/Down: Step LengthRight Stick Left/Right: Lateral FractionLeft Stick Up/Down: Robot HeightLeft Stick Left/Right: Yaw RateArrow Pad Up/Down(DISCRETE): Step HeightArrow Pad Left/Right(DISCRETE): Step DepthBottom Right/Left Bumpers: Step Velocity (modulate)Top Right/Left Bumpers: reset all to default
Viewing Mode:
Right Stick Up/Down: PitchRight Stick Left/Right: RollLeft Stick Up/Down: Robot HeightLeft Stick Left/Right: Yaw
Changing Step Velocity while moving forward:
Changing Step Length while moving forward:
Yaw In Place: Slightly push the Right Stick forward while pushing the Left Stick maximally in either direction:
Testing Environment (Non-Joystick)
If you don't have a joystick, go to spot_bullet/src and do ./env_tester.py. A Pybullet sim will open up for you with the same controls you would have on the joystick, except each is on its own scrollbar. You may also use the following optional arguments:
-h, --help show this help message and exit
-hf, --HeightField Use HeightField
-r, --DebugRack Put Spot on an Elevated Rack
-p, --DebugPath Draw Spot's Foot Path
-ay, --AutoYaw Automatically Adjust Spot's Yaw
-ar, --AutoReset Automatically Reset Environment When Spot Falls