Spinnaker SDK C++
4.2.0.21
 
 

 
Loading...
Searching...
No Matches
StereoGPIO.cpp

StereoGPIO.cpp shows how to set the GPIO of the stereo camera.

StereoGPIO.cpp shows how to set the GPIO of the stereo camera.This example demonstrates how to set the GPIO of the camera. After setting the GPIO controls, images are grabbed pending on a signal in the GPIO line

Please leave us feedback at: https://www.surveymonkey.com/r/TDYMVAPI More source code examples at: https://github.com/Teledyne-MV/Spinnaker-Examples Need help? Check out our forum at: https://teledynevisionsolutions.zendesk.com/hc/en-us/community/topics

//=============================================================================
// Copyright (c) 2024 FLIR Integrated Imaging Solutions, Inc. All Rights
// Reserved
//
// This software is the confidential and proprietary information of FLIR
// Integrated Imaging Solutions, Inc. ("Confidential Information"). You
// shall not disclose such Confidential Information and shall use it only in
// accordance with the terms of the non-disclosure or license agreement you
// entered into with FLIR Integrated Imaging Solutions, Inc. (FLIR).
//
// FLIR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
// SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE, OR NON-INFRINGEMENT. FLIR SHALL NOT BE LIABLE FOR ANY DAMAGES
// SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
// THIS SOFTWARE OR ITS DERIVATIVES.
//=============================================================================
//=============================================================================
// System Includes
//=============================================================================
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <sstream>
#include <filesystem>
//=============================================================================
// Examples Includes
//=============================================================================
#include "StereoGPIO.h"
#include "Spinnaker.h"
#include "SpinStereoHelper.h"
#include "StereoParameters.h"
#include "Getopt.h"
using namespace Spinnaker;
using namespace Spinnaker::GenApi;
using namespace Spinnaker::GenICam;
using namespace SpinStereo;
using namespace std;
bool ProcessArgs(int argc, char* argv[], StereoGPIOParams& params)
{
string executionPath = string(argv[0]);
size_t found = executionPath.find_last_of("/\\");
string programName = executionPath.substr(found + 1);
int iOpt;
const char* currentParamPosition;
// If no arguments run with standard parameters.
if (argc == 1)
{
params.numImageGroups = 3;
return true;
}
const char* paramMatchPattern = "h?";
while ((iOpt = GetOption(argc, argv, paramMatchPattern, &currentParamPosition)) != 0)
{
switch (iOpt)
{
case '?':
case 'h':
{
DisplayHelp(programName, params);
return false;
}
default:
cerr << "Invalid option provided: " << currentParamPosition << endl;
DisplayHelp(programName, params);
return false;
}
}
return true;
}
void DisplayHelp(const string& pszProgramName, const StereoGPIOParams& params)
{
cout << "Usage: ";
cout << pszProgramName << " [OPTIONS]" << endl << endl;
cout << "OPTIONS" << endl << endl << "EXAMPLE" << endl << endl << " " << pszProgramName << endl << endl;
}
{
bool result = true;
INodeMap& nodeMapCamera = pCam->GetNodeMap();
// Set up Trigger mode
result = result && SpinStereo::SetEnumAsStringValueToNode(nodeMapCamera, "TriggerMode", "On");
// Set up trigger in on line 0
result = result && SpinStereo::SetEnumAsStringValueToNode(nodeMapCamera, "TriggerSource", "Line0");
result = result && SpinStereo::SetEnumAsStringValueToNode(nodeMapCamera, "TriggerSelector", "FrameStart");
// Set up trigger out on line 1
result = result && SpinStereo::SetEnumAsStringValueToNode(nodeMapCamera, "LineSelector", "Line1");
result = result && SpinStereo::SetEnumAsStringValueToNode(nodeMapCamera, "LineSource", "ExposureActive");
return result;
}
bool AcquireImages(CameraPtr pCam, const StreamTransmitFlags& streamTransmitFlags, unsigned int numImageSets)
{
bool result = true;
cout << endl << endl << "*** IMAGE ACQUISITION ***" << endl << endl;
try
{
// Begin acquiring images
pCam->BeginAcquisition();
gcstring serialNumber = pCam->TLDevice.DeviceSerialNumber.GetValue();
uint64_t timeoutInMilliSecs = 5000;
// Indication of infinite (defined in GenTL spec v1.3)
#define INFINITE_TIMEOUT 0xFFFFFFFFFFFFFFFF
cout << "Acquiring " << numImageSets << " image sets pending on GPIO signal,";
if (timeoutInMilliSecs == INFINITE_TIMEOUT)
{
cout << " within an infinite time limit." << endl;
}
else
{
cout << " within a time limit of " << timeoutInMilliSecs / 1000 << " secs." << endl;
}
for (unsigned int counter = 0; counter < numImageSets; counter++)
{
try
{
cout << endl << "Acquiring stereo image set: " << counter << ", pending on GPIO signal." << endl;
ImageList imageList;
imageList = pCam->GetNextImageSync(timeoutInMilliSecs);
if (!SpinStereo::ValidateImageList(streamTransmitFlags, imageList))
{
cout << "Failed to get next image list." << endl;
continue;
}
}
{
cout << "Error: " << e.what() << endl;
result = false;
}
}
//
// End acquisition
//
// *** NOTES ***
// Ending acquisition appropriately helps ensure that devices clean up
// properly and do not need to be power-cycled to maintain integrity.
//
pCam->EndAcquisition();
}
{
cout << "Error: " << e.what() << endl;
result = false;
}
return result;
}
// This function acts as the body of the example; please see NodeMapInfo example
// for more in-depth comments on setting up cameras.
bool RunSingleCamera(CameraPtr pCam, StereoParameters& stereoParameters, unsigned int numImageSets)
{
bool result = true;
try
{
// Retrieve TL device nodemap and print device information
INodeMap& nodeMapTLDevice = pCam->GetTLDeviceNodeMap();
result = PrintDeviceInfo(nodeMapTLDevice);
// Initialize camera
pCam->Init();
// Retrieve GenICam nodemap
INodeMap& nodeMap = pCam->GetNodeMap();
// Check to make sure camera supports stereo vision
cout << endl << "Checking camera stereo support..." << endl;
if (!ImageUtilityStereo::IsStereoCamera(pCam))
{
cout << "Device serial number " << pCam->TLDevice.DeviceSerialNumber.GetValue()
<< " is not a valid BX camera. Skipping..." << endl;
return true;
}
// Configure heartbeat for GEV camera
#ifdef _DEBUG
result = result && DisableGVCPHeartbeat(pCam);
#else
result = result && ResetGVCPHeartbeat(pCam);
#endif
cout << endl << "Configuring camera..." << endl;
result = result && SpinStereo::ConfigureAcquisition(pCam, stereoParameters.streamTransmitFlags);
cout << endl << "Configuring GPIO..." << endl;
result = result && ConfigureGPIO(pCam);
cout << endl << "*** STEREO PARAMETERS *** " << endl << stereoParameters.ToString() << endl;
#if _DEBUG
cout << endl << "*** CAMERA CALIBRATION PARAMETERS ***" << endl;
{
cerr << "Failed to get camera calibration parameters." << endl;
return false;
}
#endif
// Acquire images
cout << endl << "Acquiring images..." << endl;
result = result && AcquireImages(pCam, stereoParameters.streamTransmitFlags, numImageSets);
#ifdef _DEBUG
// Reset heartbeat for GEV camera
result = result && ResetGVCPHeartbeat(pCam);
#endif
// Deinitialize camera
pCam->DeInit();
}
{
cout << "Error: " << e.what() << endl;
result = false;
}
return result;
}
int main(int argc, char** argv)
{
// determine cmd line arguments
string programName = argv[0];
StereoGPIOParams stereoGPIOParams;
if (!ProcessArgs(argc, argv, stereoGPIOParams))
{
return -1;
}
StereoParameters stereoParameters;
StreamTransmitFlags& streamTransmitFlags = stereoParameters.streamTransmitFlags;
streamTransmitFlags.rectSensor1TransmitEnabled = stereoGPIOParams.doEnableRectSensor1Transmit;
streamTransmitFlags.disparityTransmitEnabled = stereoGPIOParams.doEnableDisparityTransmit;
// Print application build information
cout << "Application build date: " << __DATE__ << " " << __TIME__ << endl << endl;
// Retrieve singleton reference to system object
SystemPtr system = System::GetInstance();
// Print out current library version
const LibraryVersion spinnakerLibraryVersion = system->GetLibraryVersion();
cout << "Spinnaker library version: " << spinnakerLibraryVersion.major << "." << spinnakerLibraryVersion.minor
<< "." << spinnakerLibraryVersion.type << "." << spinnakerLibraryVersion.build << endl
<< endl;
// Retrieve list of cameras from the system
CameraList camList = system->GetCameras();
const unsigned int numCameras = camList.GetSize();
cout << "Number of cameras detected: " << numCameras << endl << endl;
// Finish if there are no cameras
if (numCameras == 0)
{
// Clear camera list before releasing system
camList.Clear();
// Release system
system->ReleaseInstance();
cout << "Not enough cameras!" << endl;
cout << "Done! Press Enter to exit..." << endl;
getchar();
return -1;
}
//
// Create shared pointer to camera
//
// *** NOTES ***
// The CameraPtr object is a shared pointer, and will generally clean itself
// up upon exiting its scope. However, if a shared pointer is created in the
// same scope that a system object is explicitly released (i.e. this scope),
// the reference to the shared point must be broken manually.
//
// *** LATER ***
// Shared pointers can be terminated manually by assigning them to nullptr.
// This keeps releasing the system from throwing an exception.
//
CameraPtr pCam = nullptr;
bool result = true;
// Run example on each camera
for (unsigned int i = 0; i < numCameras; i++)
{
// Select camera
pCam = camList.GetByIndex(i);
cout << endl << "Running example for camera " << i << "..." << endl;
// Run example
result = result && RunSingleCamera(pCam, stereoParameters, stereoGPIOParams.numImageGroups);
cout << "Camera " << i << " example complete..." << endl << endl;
}
//
// Release reference to the camera
//
// *** NOTES ***
// Had the CameraPtr object been created within the for-loop, it would not
// be necessary to manually break the reference because the shared pointer
// would have automatically cleaned itself up upon exiting the loop.
//
pCam = nullptr;
// Clear camera list before releasing system
camList.Clear();
// Release system
system->ReleaseInstance();
cout << endl << "Done! Press Enter to exit..." << endl;
getchar();
return (result == true) ? 0 : -1;
}
int AcquireImages(CameraPtr pCam, INodeMap &nodeMap, INodeMap &nodeMapTLDevice)
Definition Acquisition.cpp:199
int main(int, char **)
Definition Acquisition.cpp:527
int ResetGVCPHeartbeat(CameraPtr pCam)
Definition Acquisition.cpp:138
int RunSingleCamera(CameraPtr pCam)
Definition Acquisition.cpp:479
int PrintDeviceInfo(INodeMap &nodeMap)
Definition Acquisition.cpp:441
int DisableGVCPHeartbeat(CameraPtr pCam)
Definition Acquisition.cpp:143
int GetOption(int argc, char **argv, const char *pszValidOpts, const char **ppszParam)
Definition Getopt.c:96
bool ProcessArgs(int argc, char *argv[], StereoAcquisitionParams &params)
ProcessArgs.
Definition StereoAcquisition.cpp:75
void DisplayHelp(const string &pszProgramName, const StereoAcquisitionParams &params)
DisplayHelp.
Definition StereoAcquisition.cpp:201
#define INFINITE_TIMEOUT
bool ConfigureGPIO(CameraPtr pCam)
Definition StereoGPIO.cpp:108
Class for handling parameters of the S3D camera.
Definition StereoParameters.h:66
std::string ToString() const
Converts the parameters to a string representation.
Definition StereoParameters.cpp:48
StreamTransmitFlags streamTransmitFlags
Flags to enable streams image transmission.
Definition StereoParameters.h:84
Used to hold a list of camera objects.
Definition CameraList.h:42
void Clear()
Clears the list of cameras and destroys their corresponding reference counted objects.
CameraPtr GetByIndex(unsigned int index) const
Returns a pointer to a camera object at the "index".
unsigned int GetSize() const
Returns the size of the camera list.
A reference tracked pointer to a camera object.
Definition CameraPtr.h:44
The Exception object represents an error that is returned from the library.
Definition Exception.h:51
virtual const char * what() const
virtual override for what().
Definition GCString.h:43
Used to hold a list of image objects.
Definition ImageList.h:42
A reference tracked pointer to a system object.
Definition SystemPtr.h:44
interface SPINNAKER_API_ABSTRACT INodeMap
Interface to access the node map.
Definition INodeMap.h:54
bool SetEnumAsStringValueToNode(INodeMap &nodeMap, const gcstring &nodeName, gcstring nodeEnumValAsStr)
Sets an enumerated string value to a specified node.
Definition SpinStereoHelper.cpp:723
bool PrintCameraCalibrationParams(INodeMap &nodeMap)
Prints the camera calibration parameters.
Definition SpinStereoHelper.cpp:958
Definition SpinStereoHelper.cpp:34
bool ValidateImageList(const StreamTransmitFlags &streamTransmitFlags, ImageList &imageList)
Definition SpinStereoHelper.cpp:763
bool ConfigureAcquisition(CameraPtr pCam, StreamTransmitFlags &streamTransmitFlags)
Definition SpinStereoHelper.cpp:247
Definition Autovector.h:36
Definition GCString.h:31
Definition BasePtr.h:24
Definition StereoParameters.h:40
bool rectSensor1TransmitEnabled
Flag to enable rectified sensor1 image transmission.
Definition StereoParameters.h:43
bool disparityTransmitEnabled
Flag to enable disparity image transmission.
Definition StereoParameters.h:45
Provides easier access to the current version of Spinnaker.
Definition SpinnakerDefs.h:657
unsigned int minor
Minor version of the library.
Definition SpinnakerDefs.h:662
unsigned int major
Major version of the library.
Definition SpinnakerDefs.h:659
unsigned int type
Version type of the library.
Definition SpinnakerDefs.h:665
unsigned int build
Build number of the library.
Definition SpinnakerDefs.h:668
Definition StereoGPIO.h:32
bool doEnableDisparityTransmit
Definition StereoGPIO.h:35
bool doEnableRectSensor1Transmit
Definition StereoGPIO.h:34
int numImageGroups
Definition StereoGPIO.h:33