DRIVE is an open-source uncrewed ground vehicle (UGV) training dataset gathering protocol. This protocol automates the task of driving the UGV to gather a training dataset, then used to train a motion model. The resulting model can then be used for controllers.
If you use DRIVE in an academic context, please cite our preprint:
@misc{baril2023drive,
title={DRIVE: Data-driven Robot Input Vector Exploration},
author={Dominic Baril and Simon-Pierre Deschênes and Luc Coupal and Cyril Goffin and Julien Lépine and Philippe Giguère and François Pomerleau},
year={2023},
eprint={2309.10718},
archivePrefix={arXiv},
primaryClass={cs.RO}
}
The datasets used in our paper are publicly available. Follow this link to download them in Pandas Dataframe format.
DRIVE works as a standard ROS 2 package. You simply need to clone this repository in your ROS 2 workspace and compile it. The package has dependencies to the following standard Python libraries and custom message package :
git clone [email protected]:norlab-ulaval/DRIVE.git && git clone [email protected]:norlab-ulaval/norlab_controllers_msgs.git
cd ..
rosdep install --from-paths src -y --ignore-src
colcon build
To execute the protocol, the first step is to create a YAML configuration file.
Examples are located in the /config
folder.
The table below provides parameter description:
Parameter name | Type | Default | Note |
---|---|---|---|
command_model | String | 'Differential_drive' | Vehicle command model (currently only Differential Drive is implemented, more to come soon) |
auto_max_speed_characterization | Boolean | True | Automatic UGV max speed characterization. If set to 'False', will use user-defined maximum linear speed to estimate limits. |
auto_cmd_model_characterization | Boolean | True | Automatic UGV command model characterization. If set to 'False', will use command model parameters. For differential-drive, these are set to wheel_radius and wheel_baseline. |
max_lin_speed | Double | 2.0 | Vehicle maximum linear speed |
max_ang_speed | Double | 2.0 | Vehicle maximum angular speed |
wheel_radius | Double | 1.0 | Vehicle wheel radius |
wheel_baseline | Double | 1.0 | Vehicle wheel baseline |
cmd_rate | Integer | 20 | Vehicle command rate (in Hz) |
encoder_rate | Integer | 4 | Vehicle wheel encoders measurement rate (in Hz) |
step_len | Double | 6.0 | Calibration interval step (in seconds) |
n_calib_steps | Integer | 20 | Number of calibration steps. In our paper, we show that 10 6-second steps are enough for our model to converge. |
dead_man_button | Boolean | True | Is the dead man switch on the controller set as a button in the joy message? If set to "False", it will be looking in the "axes". |
dead_man_threshold | Double | 0.5 | Dead man switch activation threshold |
calib_trigger_button | Boolean | True | Is the calibration trigger on the controller set as a button in the joy message? If set to "False", it will be looking in the "axes". |
calib_trigger_threshold | Double | 0.5 | Calibration trigger activation threshold |
Then, make sure that the DRIVE launch file is adapted to your configuration and proper topics.
It is possible to record a rosbag of the experiment by uncommenting this line : <!-- <executable cmd="ros2 bag record -a -o /media/robot/ssd-2nd/rosbag/doughnut" />-->
.
You can then launch the characterization procedure with :
ros2 launch drive drive.launch.xml
Make sure an operator is present during the characretization. The dead man switch allows to stop the UGV and pause the characterization protocol. The operator can move and re-orient the UGV to allow it to execute the following commands. When done, you can use the following command to save the raw data in a Pandas Dataframe :
ros2 service call /logger_node/export_data norlab_controllers_msgs/srv/ExportData "export_path: data: '<EXPORT_DATAFRAME_PATH>'"