![]() |
Autonomy Software C++ 24.5.1
Welcome to the Autonomy Software repository of the Mars Rover Design Team (MRDT) at Missouri University of Science and Technology (Missouri S&T)! API reference contains the source code and other resources for the development of the autonomy software for our Mars rover. The Autonomy Software project aims to compete in the University Rover Challenge (URC) by demonstrating advanced autonomous capabilities and robust navigation algorithms.
|
This class implements a modular and easy to use object detector for a single camera. Given a camera name, this class will detect objects using the depth measure from a ZED camera and/or inferenced objects from a custom trained model. This class and it's detections are ran in a different thread. More...
#include <ObjectDetector.h>
Public Member Functions | |
ObjectDetector (std::shared_ptr< BasicCamera > pBasicCam, const bool bEnableTracking=false, const int nDetectorMaxFPS=30, const bool bEnableRecordingFlag=false, const int nNumDetectedObjectsRetrievalThreads=5, const bool bUsingGpuMats=false) | |
Construct a new Object Detector:: Object Detector object. | |
ObjectDetector (std::shared_ptr< ZEDCamera > pZEDCam, const bool bEnableTracking=false, const int nDetectorMaxFPS=30, const bool bEnableRecordingFlag=false, const int nNumDetectedObjectsRetrievalThreads=5, const bool bUsingGpuMats=false) | |
Construct a new Object Detector:: Object Detector object. | |
~ObjectDetector () | |
Destroy the Object Detector:: Object Detector object. | |
std::future< bool > | RequestDetectionOverlayFrame (cv::Mat &cvFrame) |
Request a copy of the frame containing the detected objects from all detection methods drawn onto the frame. | |
std::future< bool > | RequestDetectedObjects (std::vector< objectdetectutils::Object > &vObjects) |
Request a copy of the most update to date vector of the detected objects from all detection methods. | |
bool | InitTorchDetection (const std::string &szModelPath, yolomodel::pytorch::PyTorchInterpreter::HardwareDevices eDevice=yolomodel::pytorch::PyTorchInterpreter::HardwareDevices::eCUDA) |
Initialize the PyTorch interpreter for object detection. | |
void | EnableTorchDetection (const float fMinObjectConfidence=0.4f, const float fNMSThreshold=0.6f) |
Enable the PyTorch detection method for this ObjectDetector. | |
void | DisableTorchDetection () |
Set the flag to enable or disable object detection with the torch model. | |
void | SetDetectorMaxFPS (const int nRecordingFPS) |
Set the max FPS of the detector. | |
void | SetEnableRecordingFlag (const bool bEnableRecordingFlag) |
Set the flag to enable or disable recording of the overlay output. | |
bool | GetIsReady () |
Check if the ObjectDetector is ready to be used. | |
int | GetDetectorMaxFPS () const |
Get the max FPS of the detector. | |
bool | GetEnableRecordingFlag () const |
Get the flag to enable or disable recording of the overlay output. | |
std::string | GetCameraName () |
Get the camera name. | |
cv::Size | GetProcessFrameResolution () const |
Get the process frame resolution. | |
![]() | |
AutonomyThread () | |
Construct a new Autonomy Thread object. | |
virtual | ~AutonomyThread () |
Destroy the Autonomy Thread object. If the parent object or main thread is destroyed or exited while this thread is still running, a race condition will occur. Stopping and joining the thread here insures that the main program can't exit if the user forgot to stop and join the thread. | |
void | Start () |
When this method is called, it starts a new thread that runs the code within the ThreadedContinuousCode method. This is the users main code that will run the important and continuous code for the class. | |
void | RequestStop () |
Signals threads to stop executing user code, terminate. DOES NOT JOIN. This method will not force the thread to exit, if the user code is not written properly and contains WHILE statement or any other long-executing or blocking code, then the thread will not exit until the next iteration. | |
void | Join () |
Waits for thread to finish executing and then closes thread. This method will block the calling code until thread is finished. | |
bool | Joinable () const |
Check if the code within the thread and all pools created by it are finished executing and the thread is ready to be closed. | |
AutonomyThreadState | GetThreadState () const |
Accessor for the Threads State private member. | |
IPS & | GetIPS () |
Accessor for the Frame I P S private member. | |
Private Member Functions | |
void | ThreadedContinuousCode () override |
This method will run continuously in a separate thread. New frames from the given camera are grabbed and the objects for the camera image are detected using the PyTorch interpreter. The detected objects are then filtered and stored. Then any requests for the current objects are fulfilled via a call and join of the thread pooled code. | |
void | PooledLinearCode () override |
This method will run in a thread pool. It will be called by the main thread and will run the code within the PooledLinearCode() method. This is meant to be used as an internal utility of the child class to further improve parallelization. | |
void | UpdateDetectedObjects (std::vector< objectdetectutils::Object > &vNewlyDetectedObjects) |
Update the detected objects with the newly detected objects. | |
Private Attributes | |
std::shared_ptr< Camera< cv::Mat > > | m_pCamera |
std::shared_ptr< yolomodel::pytorch::PyTorchInterpreter > | m_pTorchDetector |
std::atomic< float > | m_fTorchMinObjectConfidence |
std::atomic< float > | m_fTorchNMSThreshold |
std::atomic_bool | m_bTorchInitialized |
std::atomic_bool | m_bTorchEnabled |
std::shared_ptr< tracking::MultiTracker > | m_pMultiTracker |
bool | m_bUsingZedCamera |
bool | m_bUsingGpuMats |
bool | m_bCameraIsOpened |
bool | m_bEnableTracking |
int | m_nNumDetectedObjectsRetrievalThreads |
std::string | m_szCameraName |
std::atomic_bool | m_bEnableRecordingFlag |
std::vector< objectdetectutils::Object > | m_vNewlyDetectedObjects |
std::vector< objectdetectutils::Object > | m_vDetectedObjects |
geoops::RoverPose | m_stRoverPose |
cv::Mat | m_cvFrame |
cv::cuda::GpuMat | m_cvGPUFrame |
cv::Mat | m_cvTorchOverlayFrame |
cv::Mat | m_cvTorchProcFrame |
cv::Mat | m_cvPointCloud |
cv::cuda::GpuMat | m_cvGPUPointCloud |
std::queue< containers::FrameFetchContainer< cv::Mat > > | m_qDetectedObjectDrawnOverlayFramesCopySchedule |
std::queue< containers::DataFetchContainer< std::vector< objectdetectutils::Object > > > | m_qDetectedObjectCopySchedule |
std::shared_mutex | m_muPoolScheduleMutex |
std::shared_mutex | m_muFrameCopyMutex |
std::shared_mutex | m_muArucoDataCopyMutex |
Additional Inherited Members | |
![]() | |
enum | AutonomyThreadState |
![]() | |
void | RunPool (const unsigned int nNumTasksToQueue, const unsigned int nNumThreads=2, const bool bForceStopCurrentThreads=false) |
When this method is called, it starts/adds tasks to a thread pool that runs nNumTasksToQueue copies of the code within the PooledLinearCode() method using nNumThreads number of threads. This is meant to be used as an internal utility of the child class to further improve parallelization. Default value for nNumThreads is 2. | |
void | RunDetachedPool (const unsigned int nNumTasksToQueue, const unsigned int nNumThreads=2, const bool bForceStopCurrentThreads=false) |
When this method is called, it starts a thread pool full of threads that don't return std::futures (like a placeholder for the thread return type). This means the thread will not have a return type and there is no way to determine if the thread has finished other than calling the Join() method. Only use this if you want to 'set and forget'. It will be faster as it doesn't return futures. Runs PooledLinearCode() method code. This is meant to be used as an internal utility of the child class to further improve parallelization. | |
void | ParallelizeLoop (const int nNumThreads, const N tTotalIterations, F &&tLoopFunction) |
Given a ref-qualified looping function and an arbitrary number of iterations, this method will divide up the loop and run each section in a thread pool. This function must not return anything. This method will block until the loop has completed. | |
void | ClearPoolQueue () |
Clears any tasks waiting to be ran in the queue, tasks currently running will remain running. | |
void | JoinPool () |
Waits for pool to finish executing tasks. This method will block the calling code until thread is finished. | |
bool | PoolJoinable () const |
Check if the internal pool threads are done executing code and the queue is empty. | |
void | SetMainThreadIPSLimit (int nMaxIterationsPerSecond=0) |
Mutator for the Main Thread Max I P S private member. | |
int | GetPoolNumOfThreads () |
Accessor for the Pool Num Of Threads private member. | |
int | GetPoolQueueLength () |
Accessor for the Pool Queue Size private member. | |
std::vector< void > | GetPoolResults () |
Accessor for the Pool Results private member. The action of getting results will destroy and remove them from this object. This method blocks if the thread is not finished, so no need to call JoinPool() before getting results. | |
int | GetMainThreadMaxIPS () const |
Accessor for the Main Thread Max I P S private member. | |
![]() | |
IPS | m_IPS |
This class implements a modular and easy to use object detector for a single camera. Given a camera name, this class will detect objects using the depth measure from a ZED camera and/or inferenced objects from a custom trained model. This class and it's detections are ran in a different thread.
ObjectDetector::ObjectDetector | ( | std::shared_ptr< BasicCamera > | pBasicCam, |
const bool | bEnableTracking = false , |
||
const int | nDetectorMaxFPS = 30 , |
||
const bool | bEnableRecordingFlag = false , |
||
const int | nNumDetectedObjectsRetrievalThreads = 5 , |
||
const bool | bUsingGpuMats = false |
||
) |
Construct a new Object Detector:: Object Detector object.
pBasicCam | - A pointer to the BasicCam to use for detection. |
bEnableTracking | - Whether or not to enable tracking of detected objects. |
nDetectorMaxFPS | - The max FPS limit the detector can run at. |
bEnableRecordingFlag | - Whether or not this ObjectDetector's overlay output should be recorded. |
nNumDetectedObjectsRetrievalThreads | - The number of threads to use when fulfilling requests for the detected objects. Default is 5. |
bUsingGpuMats | - Whether or not the given camera name will be using GpuMats. |
ObjectDetector::ObjectDetector | ( | std::shared_ptr< ZEDCamera > | pZEDCam, |
const bool | bEnableTracking = false , |
||
const int | nDetectorMaxFPS = 30 , |
||
const bool | bEnableRecordingFlag = false , |
||
const int | nNumDetectedObjectsRetrievalThreads = 5 , |
||
const bool | bUsingGpuMats = false |
||
) |
Construct a new Object Detector:: Object Detector object.
pZEDCam | - A pointer to the ZEDCamera to use for detection. |
bEnableTracking | - Whether or not to enable tracking of detected objects. |
nDetectorMaxFPS | - The max FPS limit the detector can run at. |
bEnableRecordingFlag | - Whether or not this ObjectDetector's overlay output should be recorded. |
nNumDetectedObjectsRetrievalThreads | - The number of threads to use when fulfilling requests for the detected objects. Default is 5. |
bUsingGpuMats | - Whether or not the given camera name will be using GpuMats. |
ObjectDetector::~ObjectDetector | ( | ) |
Destroy the Object Detector:: Object Detector object.
std::future< bool > ObjectDetector::RequestDetectionOverlayFrame | ( | cv::Mat & | cvFrame | ) |
Request a copy of the frame containing the detected objects from all detection methods drawn onto the frame.
cvFrame | - The cv::Mat frame to copy the detection overlay image to. |
std::future< bool > ObjectDetector::RequestDetectedObjects | ( | std::vector< objectdetectutils::Object > & | vObjects | ) |
Request a copy of the most update to date vector of the detected objects from all detection methods.
vObjects | - The vector of detected objects to copy the detected objects to. |
bool ObjectDetector::InitTorchDetection | ( | const std::string & | szModelPath, |
yolomodel::pytorch::PyTorchInterpreter::HardwareDevices | eDevice = yolomodel::pytorch::PyTorchInterpreter::HardwareDevices::eCUDA |
||
) |
Initialize the PyTorch interpreter for object detection.
szModelPath | - The path to the PyTorch model file. |
eDevice | - The hardware device to use for inference (e.g., CPU or GPU). |
void ObjectDetector::EnableTorchDetection | ( | const float | fMinObjectConfidence = 0.4f , |
const float | fNMSThreshold = 0.6f |
||
) |
Enable the PyTorch detection method for this ObjectDetector.
fMinObjectConfidence | - The minimum confidence threshold for detected objects. |
fNMSThreshold | - The non-maximum suppression threshold for filtering overlapping detections. |
void ObjectDetector::DisableTorchDetection | ( | ) |
Set the flag to enable or disable object detection with the torch model.
void ObjectDetector::SetDetectorMaxFPS | ( | const int | nRecordingFPS | ) |
Set the max FPS of the detector.
nRecordingFPS | - The max FPS of the detector. |
void ObjectDetector::SetEnableRecordingFlag | ( | const bool | bEnableRecordingFlag | ) |
Set the flag to enable or disable recording of the overlay output.
bEnableRecordingFlag | - The flag to enable or disable recording of the overlay output. |
bool ObjectDetector::GetIsReady | ( | ) |
Check if the ObjectDetector is ready to be used.
int ObjectDetector::GetDetectorMaxFPS | ( | ) | const |
Get the max FPS of the detector.
bool ObjectDetector::GetEnableRecordingFlag | ( | ) | const |
Get the flag to enable or disable recording of the overlay output.
std::string ObjectDetector::GetCameraName | ( | ) |
Get the camera name.
cv::Size ObjectDetector::GetProcessFrameResolution | ( | ) | const |
Get the process frame resolution.
|
overrideprivatevirtual |
This method will run continuously in a separate thread. New frames from the given camera are grabbed and the objects for the camera image are detected using the PyTorch interpreter. The detected objects are then filtered and stored. Then any requests for the current objects are fulfilled via a call and join of the thread pooled code.
Implements AutonomyThread< void >.
|
overrideprivatevirtual |
This method will run in a thread pool. It will be called by the main thread and will run the code within the PooledLinearCode() method. This is meant to be used as an internal utility of the child class to further improve parallelization.
Implements AutonomyThread< void >.
|
private |
Update the detected objects with the newly detected objects.
vNewlyDetectedObjects | - The vector of newly detected objects to update the detected objects with. |