Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
921 kinematics pose estimation (#1089)
* Add tachometer, odometer and kinematics part - tachometer takes an encoder and returns revolutions - odometer coverts revolutions to distance and velocity - kinematics converts odometry to pose estimates - BicyclePose part implements the pose estimation pipeline for a car-like vehicle (fixed back wheels, turnable front wheels) - UnicyclePose part implements the pose estimation pipeline for differential drive vehicles. * refactor pose estimation into a single part - UnicyclePose handles encoder/tachometer/odometer/kinematics for differential drive. - BicyclePose handles encoder/tachometer/odomter/kinematics for car-like vehicle - add a mock encoder that is driven by throttle and steering input. This allows use to simulate the vehicle without a full-on simulator. - Fix the drawing of the path so that it handles the fact that Y increases going north. * comment out logging of pose to quiet the console * add arduino encoder sketches * remove unicode characters that prevent compilation of arduino sketch * clean up comments a little * Add more documentation to the quadrature_encoder.ino sketch * Add interrupt mode to the mono encoder - Interrupts mode can handle much higher tick rates, but does a poor job of debouncing. It is appropriate for high resolution optical encoders. * Remove spurious unicode beta character It was at the end of `#define ENCODER_OPTIMIZE_INTERRUPTS` and so could have been causing the #define to be unrecognized. * removed digital write high in mono encoder * Fix syntax error if only using one channel in int mode - there was a syntax error if only one pin was defined and it was being used in interrupt mode; that is fixed. - Add more documentation to the mono_encoder.ino sketch * Added a quadrature encoder sketch with no libraries - The sketch counts ticks on a quadrature encoder without using 3rd party libraries. - This is done 1) to make is simpler to compile and download the sketch; the user does not need to figure out what library to use. 2) the library that was in use only worked on AVR hardware and causes compilation errors on other hardware. - if USE_ENCODER_INTERRUPTS is defined when the sketch is compiled, then the interrupt driven tick counting will be used. This has no debounce logic, so it is not suitable for mechanical encoder, but is appropriate for optical or hall effect encoders. - if USE_ENCODER_INTERRUPTS is NOT defined, then this used polling mode with debouncing, which is suitable for mechanical encoders, but may be to slow for high resolution optical or hall effect encoders. * Fix bug in mono encoder sketch - it had literal 2 for size of encoders array, so when there was only one encoder we got memory overwrites. * Fix bug in quadrature nolib sketch - I used the wrong symbol for adding the #2 isr * minor change to quadrature nolib - use array rather than pointer in readEncoders() argument. * Updated quadrature_encoder.ino to not require library - the library we used was only for AVR microcontrollers, so the code could not work on RPi Pico for instance. - I reimplemented the sketch to have explicit polling mode logic that is suitable for noisy mechanical encoders. - To that I added an interrupt driven mode that works if there is one interrupt capable pin available for each encoder. This is suitable for optical or hall effect encoders that do not need to be debounced. * fix merge error in path_follow.py * Fix RPi_GPIO_Servo part so it does not need GPIO in constructor - the constructor has a default for pin_scheme based on the GPIO object. The GPIO object will not be defined on a PC. - this change use None as a default and then checks for it and set the GPIO default if it is None. - This fixes a bug in the actuator unit test. * added non-threaded run() to UnicyclePose and BicyclePose for testing * Improved accuracy of MockEncoder by propagating fractional ticks * Updated add_odometry() so we could add as non-threaded for testing. * Vehicle loop prints out number of iterations and total time - The vehicle loop now counts frames accurately; prior to this change the counter would be one more than the actual number of executed frames - When the vehicle loop terminates the number of executed iterations and the total time are printed and returned to the caller. - This was used for the kinematics tests because we needed to know how long the vehicle drive loop executed so we could calculate the expected distance that the mock vehicle drove. * Rewrite of the kinematics unit tests - We dramatically changed how a mock drivetrain handles odometry. Now is uses a velocity based on encoder ticks per second scaled by throttle. This is a more realistic mock, but it is harder to test. - The tests setup a vehicle with a mock encoder, then run the vehicle loop for a set number of iterations. The vehicle loop now returns how long the loop ran and this is used along with the configuration for ticks_per_second from the mock encoder to calculate how far the vehicle travelled. Then the kinematics model is applied to see if the resulting ending pose matches the expected pose. * Adjust bicycle kinematics to use front wheel reference - the code now uses the front wheels as the reference point for the calculations - this fixes the unit test, which were using the front wheels while the code used the back wheels. * relax orientation test to 3% accuracy * updated based on PR feedback * removed hard-coded logging level * Update vehicle.py - change print statement to a log * Update setup.py version="4.4.dev5" version="4.4.dev5"
- Loading branch information