def METHOD_NAME(self, rate_hz=10, max_loop_count=None, verbose=False):
    """
    Start vehicle's main drive loop.
    This is the main thread of the vehicle. It starts all the new
    threads for the threaded parts then starts an infinite loop
    that runs each part and updates the memory.
    Parameters
    ----------
    rate_hz : int
        The max frequency that the drive loop should run. The actual
        frequency may be less than this if there are many blocking parts.
    max_loop_count : int
        Maximum number of loops the drive loop should execute. This is
        used for testing that all the parts of the vehicle work.
    verbose: bool
        If debug output should be printed into shell
    """
    try:
        self.on = True
        for entry in self.parts:
            if entry.get('thread'):
                # start the update thread
                entry.get('thread').METHOD_NAME()
        # wait until the parts warm up.
        logger.info('Starting vehicle at {} Hz'.format(rate_hz))
        loop_start_time = time.time()
        loop_count = 0
        while self.on:
            start_time = time.time()
            loop_count += 1
            self.update_parts()
            # stop drive loop if loop_count exceeds max_loopcount
            if max_loop_count and loop_count >= max_loop_count:
                self.on = False
            else:
                sleep_time = 1.0 / rate_hz - (time.time() - start_time)
                if sleep_time > 0.0:
                    time.sleep(sleep_time)
                else:
                    # print a message when could not maintain loop rate.
                    if verbose:
                        logger.info('WARN::Vehicle: jitter violation in vehicle loop '
                              'with {0:4.0f}ms'.format(abs(1000 * sleep_time)))
                if verbose and loop_count % 200 == 0:
                    self.profiler.report()
        loop_total_time = time.time() - loop_start_time
        logger.info(f"Vehicle executed {loop_count} steps in {loop_total_time} seconds.")
        return loop_count, loop_total_time
    except KeyboardInterrupt:
        pass
    except Exception as e:
        traceback.print_exc()
    finally:
        self.stop()