Inspiration
Give the (robot) driver maximum freedom while enhancing the safety of a high performance RC race car.
We often crash the car when tuning different autonomous driving algorithms. We would like to test algorithms safely in the real world.
What it does
Control node for copilot is a ROS node below the driver/autonomous algorithm node, which relays control signals during safe driving, but stop the car with maximum braking power when on a dangerous trajectory. Under safe circumstances, it should simply relay all controls signals from algorithm/driver to the electric speed controller and steering servo. It should override controls given by algorithm/driver during unsafe conditions, and visually notify us of override decision.
How we built it
Copilot is built upon MIT racecar (https://github.com/mit-racecar) platform. It is a ROS node that sends Ackermann driving messages to the Ackermann node, which controls the speed and steering of the car. This node subscribes to LIDAR signal, and "driver node". The driver node can be an algorithm or the teleop node, which sends all the driving commands. Control node for copilot subscribes the driving command, and calculates trajectory based on driving commands. If trajectory intersects with obstacle detected by LIDAR, Control node would override the driving command to brake or steer away from obstacle. If there's no collision hazard, Control node relays all driving signal to Ackermann node.
To notify developer of control node action, as opposed to "driver node" action, control node sends its mode to a sender node, which sends UDP packets of driving mode and parameters to a second computer in the network. On that computer, we open a GUI dashboard (dashboard.py), which visualize the current mode. Therefore, we know when our driver algorithm is working correctly, and when copilot avoids a crash.
Challenges we ran into
How to quantitatively determine the performance of our algorithm. Eventually, we wrote dummy controls than drive the car at 2, 4, 6, 8 m/s into a wall at a certain angle, and see if copilot can stop the car or turn away from the wall.
Determine criterion for collision forecast and overriding driver commands. Basically, when should we override driver controls. We testing braking distance and steering radius, and determined a set of criterion from distance and angle to nearest colliding object, steering angle and approach speed.
Steer away from obstacle at high speed. The car even starts drifting. Using approach speed into obstacle, we don't really need to consider the case of sliding and drifting. We just keep braking hard if distance to obstacle is still decreasing.
Accomplishments that we're proud of
Stopping the car in front of wall at 8 m/s. Copilot node stops override as soon as car steers away from obstacle.
What we learned
Trajectory and steering envelop of Ackermann steering vehicle Different motion planning methods for collision avoidance
What's next for Copilot
Code it into the package of racecar, and make it usable by all algorithms. Start the node from starting racecar.
Log in or sign up for Devpost to join the conversation.