![]() |
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 and interfaces with the most common USB cameras and features. It is designed in such a way that multiple other classes/threads can safely call any method of an object of this class withing resource corruption or slowdown of the camera. More...
#include <BasicCam.h>
Public Member Functions | |
BasicCam (const std::string szCameraPath, const int nPropResolutionX, const int nPropResolutionY, const int nPropFramesPerSecond, const PIXEL_FORMATS ePropPixelFormat, const double dPropHorizontalFOV, const double dPropVerticalFOV, const bool bEnableRecordingFlag, const int nNumFrameRetrievalThreads=10) | |
Construct a new Basic Cam:: Basic Cam object. | |
BasicCam (const int nCameraIndex, const int nPropResolutionX, const int nPropResolutionY, const int nPropFramesPerSecond, const PIXEL_FORMATS ePropPixelFormat, const double dPropHorizontalFOV, const double dPropVerticalFOV, const bool bEnableRecordingFlag, const int nNumFrameRetrievalThreads=10) | |
Construct a new Basic Cam:: Basic Cam object. Overloaded for dev/video indexes. | |
~BasicCam () | |
Destroy the Basic Cam:: Basic Cam object. | |
std::future< bool > | RequestFrameCopy (cv::Mat &cvFrame) override |
Puts a frame pointer into a queue so a copy of a frame from the camera can be written to it. Remember, this code will be ran in whatever, class/thread calls it. | |
bool | GetCameraIsOpen () override |
Accessor for the camera open status. | |
std::string | GetCameraLocation () const override |
Accessor for the cameras path or video index. | |
![]() | |
BasicCamera (const std::string szCameraPath, const int nPropResolutionX, const int nPropResolutionY, const int nPropFramesPerSecond, const PIXEL_FORMATS ePropPixelFormat, const double dPropHorizontalFOV, const double dPropVerticalFOV, const bool bEnableRecordingFlag, const int nNumFrameRetrievalThreads) | |
Construct a new Basic Camera object. | |
BasicCamera (const int nCameraIndex, const int nPropResolutionX, const int nPropResolutionY, const int nPropFramesPerSecond, const PIXEL_FORMATS ePropPixelFormat, const double dPropHorizontalFOV, const double dPropVerticalFOV, const bool bEnableRecordingFlag, const int nNumFrameRetrievalThreads) | |
Construct a new Basic Camera object. Overloaded for dev/video indexes. | |
virtual | ~BasicCamera () |
Destroy the Basic Camera object. | |
![]() | |
Camera (const int nPropResolutionX, const int nPropResolutionY, const int nPropFramesPerSecond, const PIXEL_FORMATS ePropPixelFormat, const double dPropHorizontalFOV, const double dPropVerticalFOV, const bool bEnableRecordingFlag, const int nNumFrameRetrievalThreads=5) | |
Construct a new Camera object. | |
virtual | ~Camera () |
Destroy the Camera object. | |
cv::Size | GetPropResolution () const |
Accessor for the Prop Resolution private member. | |
int | GetPropFramesPerSecond () const |
Accessor for the Prop Frames Per Second private member. | |
PIXEL_FORMATS | GetPropPixelFormat () const |
Accessor for the Prop Pixel Format private member. | |
double | GetPropHorizontalFOV () const |
Accessor for the Prop Horizontal F O V private member. | |
double | GetPropVerticalFOV () const |
Accessor for the Prop Vertical F O V private member. | |
bool | GetEnableRecordingFlag () const |
Accessor for the Enable Recording Flag private member. | |
void | SetEnableRecordingFlag (const bool bEnableRecordingFlag) |
Mutator for the Enable Recording Flag private member. | |
![]() | |
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 |
The code inside this private method runs in a separate thread, but still has access to this*. This method continuously get new frames from the OpenCV VideoCapture object and stores it in a member variable. Then a thread pool is started and joined once per iteration to mass copy the frames and/or measure to any other thread waiting in the queues. | |
void | PooledLinearCode () override |
This method holds the code that is ran in the thread pool started by the ThreadedLinearCode() method. It copies the data from the different data objects to references of the same type stored in a vector queued up by the Grab methods. | |
Private Attributes | |
cv::VideoCapture | m_cvCamera |
cv::Mat | m_cvFrame |
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. | |
![]() | |
int | m_nCameraIndex |
std::string | m_szCameraPath |
bool | m_bCameraIsConnectedOnVideoIndex |
![]() | |
int | m_nPropResolutionX |
int | m_nPropResolutionY |
int | m_nPropFramesPerSecond |
int | m_nNumFrameRetrievalThreads |
PIXEL_FORMATS | m_ePropPixelFormat |
double | m_dPropHorizontalFOV |
double | m_dPropVerticalFOV |
std::atomic_bool | m_bEnableRecordingFlag |
std::queue< containers::FrameFetchContainer< cv::Mat > > | m_qFrameCopySchedule |
std::shared_mutex | m_muPoolScheduleMutex |
std::shared_mutex | m_muFrameCopyMutex |
![]() | |
IPS | m_IPS |
This class implements and interfaces with the most common USB cameras and features. It is designed in such a way that multiple other classes/threads can safely call any method of an object of this class withing resource corruption or slowdown of the camera.
BasicCam::BasicCam | ( | const std::string | szCameraPath, |
const int | nPropResolutionX, | ||
const int | nPropResolutionY, | ||
const int | nPropFramesPerSecond, | ||
const PIXEL_FORMATS | ePropPixelFormat, | ||
const double | dPropHorizontalFOV, | ||
const double | dPropVerticalFOV, | ||
const bool | bEnableRecordingFlag, | ||
const int | nNumFrameRetrievalThreads = 10 |
||
) |
Construct a new Basic Cam:: Basic Cam object.
szCameraPath | - The file path to the camera hardware. |
nPropResolutionX | - X res of camera. |
nPropResolutionY | - Y res of camera. |
nPropFramesPerSecond | - FPS camera is running at. |
ePropPixelFormat | - The pixel layout/format of the image. |
dPropHorizontalFOV | - The horizontal field of view. |
dPropVerticalFOV | - The vertical field of view. |
bEnableRecordingFlag | - Whether or not this camera should be recorded. |
nNumFrameRetrievalThreads | - The number of threads to use for frame queueing and copying. |
BasicCam::BasicCam | ( | const int | nCameraIndex, |
const int | nPropResolutionX, | ||
const int | nPropResolutionY, | ||
const int | nPropFramesPerSecond, | ||
const PIXEL_FORMATS | ePropPixelFormat, | ||
const double | dPropHorizontalFOV, | ||
const double | dPropVerticalFOV, | ||
const bool | bEnableRecordingFlag, | ||
const int | nNumFrameRetrievalThreads = 10 |
||
) |
Construct a new Basic Cam:: Basic Cam object. Overloaded for dev/video indexes.
nCameraIndex | - The video index that the camera is connected on. |
nPropResolutionX | - X res of camera. |
nPropResolutionY | - Y res of camera. |
nPropFramesPerSecond | - FPS camera is running at. |
ePropPixelFormat | - The pixel layout/format of the image. |
dPropHorizontalFOV | - The horizontal field of view. |
dPropVerticalFOV | - The vertical field of view. |
bEnableRecordingFlag | - Whether or not this camera should be recorded. |
nNumFrameRetrievalThreads | - The number of threads to use for frame queueing and copying. |
BasicCam::~BasicCam | ( | ) |
Destroy the Basic Cam:: Basic Cam object.
|
overridevirtual |
Puts a frame pointer into a queue so a copy of a frame from the camera can be written to it. Remember, this code will be ran in whatever, class/thread calls it.
cvFrame | - A reference to the cv::Mat to store the frame in. |
Implements BasicCamera.
|
overridevirtual |
Accessor for the camera open status.
Implements Camera< cv::Mat >.
|
overridevirtual |
Accessor for the cameras path or video index.
Reimplemented from BasicCamera.
|
overrideprivatevirtual |
The code inside this private method runs in a separate thread, but still has access to this*. This method continuously get new frames from the OpenCV VideoCapture object and stores it in a member variable. Then a thread pool is started and joined once per iteration to mass copy the frames and/or measure to any other thread waiting in the queues.
Reimplemented from BasicCamera.
|
overrideprivatevirtual |
This method holds the code that is ran in the thread pool started by the ThreadedLinearCode() method. It copies the data from the different data objects to references of the same type stored in a vector queued up by the Grab methods.
Reimplemented from BasicCamera.