AprilTagTestUtility.cc
Go to the documentation of this file.
1 
37 #ifdef WIN32
38 #ifndef WIN32_LEAN_AND_MEAN
39 #define WIN32_LEAN_AND_MEAN 1
40 #endif
41 
42 #include <windows.h>
43 #include <winsock2.h>
44 #else
45 #include <unistd.h>
46 #endif
47 
48 #include <stdio.h>
49 #include <stdlib.h>
50 #include <signal.h>
51 #include <string.h>
52 #include <errno.h>
53 #include <iostream>
54 #include <iomanip>
55 #include <algorithm>
56 
58 #include <MultiSense/MultiSenseChannel.hh>
59 
60 #include <getopt/getopt.h>
61 
62 using namespace crl::multisense;
63 
64 namespace { // anonymous
65 
66 volatile bool doneG = false;
67 
68 void usage(const char *programNameP)
69 {
70  std::cerr << "USAGE: " << programNameP << " [<options>]" << std::endl;
71  std::cerr << "Where <options> are:" << std::endl;
72  std::cerr << "\t-a <ip_address> : IPV4 address (default=10.66.171.21)" << std::endl;
73  std::cerr << "\t-m <mtu> : default=1500" << std::endl;
74  std::cerr << "\t-f <log_file> : FILE to log IMU data (stdout by default)" << std::endl;
75 
76  exit(1);
77 }
78 
79 #ifdef WIN32
80 BOOL WINAPI signalHandler(DWORD dwCtrlType)
81 {
82  CRL_UNUSED (dwCtrlType);
83  std::cerr << "Shutting down on signal: CTRL-C" << std::endl;
84  doneG = true;
85  return TRUE;
86 }
87 #else
88 void signalHandler(int sig)
89 {
90  std::cerr << "Shutting down on signal: " << strsignal(sig) << std::endl;
91  doneG = true;
92 }
93 #endif
94 
95 void apriltagCallback(const apriltag::Header& header, void* userDataP)
96 {
97  (void) userDataP;
98 
99  std::cout << "----------------------------" << std::endl;
100  std::cout << "frameId: " << header.frameId << std::endl;
101  std::cout << "timestamp: " << header.timestamp << std::endl;
102  std::cout << "imageSource: " << header.imageSource << std::endl;
103  std::cout << "success: " << (header.success ? "true" : "false") << std::endl;
104  std::cout << "numDetections: " << header.numDetections << std::endl;
105 
106  for (auto &d : header.detections)
107  {
108  std::cout << "tag ID: " << d.id << ", family ID: " << d.family << std::endl;
109  std::cout << "\thamming: " << (int)d.hamming << std::endl;
110  std::cout << "\tdecisionMargin: " << d.decisionMargin << std::endl;
111 
112  std::cout << "\ttagToImageHomography: " << std::endl;
113  for (unsigned int col = 0; col < 3; col++)
114  {
115  std::cout << "\t\t";
116  for (unsigned int row = 0; row < 3; row++)
117  {
118  std::cout << d.tagToImageHomography[row][col] << " ";
119  }
120  std::cout << std::endl;
121  }
122 
123  std::cout << "\tcenter: " << std::endl;
124  for (unsigned int i = 0; i < 2; i++)
125  std::cout << "\t\t" << d.center[i] << std::endl;
126 
127  std::cout << "\tcorners: " << std::endl;
128  for (unsigned int i = 0; i < 4; i++)
129  std::cout << "\t\t" << d.corners[i][0] << " " << d.corners[i][1] << std::endl;
130  }
131 }
132 
133 } // anonymous
134 
135 int main(int argc,
136  char **argvPP)
137 {
138  std::string currentAddress = "10.66.171.21";
139  uint32_t mtu = 0;
140 
143  bool apriltag_supported = false;
144  std::vector<system::DeviceMode> deviceModes;
145  image::Config cfg;
146 
147 #if WIN32
148  SetConsoleCtrlHandler (signalHandler, TRUE);
149 #else
150  signal(SIGINT, signalHandler);
151 #endif
152 
153  //
154  // Parse args
155 
156  int c;
157 
158  while(-1 != (c = getopt(argc, argvPP, "a:m:v")))
159  switch(c) {
160  case 'a': currentAddress = std::string(optarg); break;
161  case 'm': mtu = atoi(optarg); break;
162  default: usage(*argvPP); break;
163  }
164 
165  //
166  // Initialize communications.
167 
168  Channel *channelP = Channel::Create(currentAddress);
169  if (NULL == channelP) {
170  std::cerr << "Failed to establish communications with \"" << currentAddress << "\"" << std::endl;
171  return -1;
172  }
173 
174  //
175  // Query firmware version
176 
178 
179  Status status = channelP->getVersionInfo(v);
180  if (Status_Ok != status) {
181  std::cerr << "Failed to query sensor version: " << Channel::statusString(status) << std::endl;
182  goto clean_out;
183  }
184 
185  //
186  // Make sure firmware supports AprilTag detections
187 
188  status = channelP->getDeviceModes(deviceModes);
189  if (Status_Ok != status) {
190  std::cerr << "Failed to query device modes: " << Channel::statusString(status) << std::endl;
191  goto clean_out;
192  }
193 
194  apriltag_supported =
195  std::any_of(deviceModes.begin(), deviceModes.end(), [](const auto &mode) {
196  return mode.supportedDataSources & Source_AprilTag_Detections; });
197 
198  if (!apriltag_supported) {
199  std::cerr << "AprilTag detector not supported with this firmware" << std::endl;
200  goto clean_out;
201  }
202 
203  //
204  // Turn off all streams by default
205 
206  status = channelP->stopStreams(Source_All);
207  if (Status_Ok != status) {
208  std::cerr << "Failed to stop streams: " << Channel::statusString(status) << std::endl;
209  goto clean_out;
210  }
211 
212  //
213  // Change MTU
214  if (mtu >= 1500)
215  status = channelP->setMtu(mtu);
216  else
217  status = channelP->setBestMtu();
218  if (Status_Ok != status) {
219  std::cerr << "Failed to set MTU: " << Channel::statusString(status) << std::endl;
220  goto clean_out;
221  }
222 
223  //
224  // Enable apriltag profile
225 
226  status = channelP->getImageConfig(cfg);
227  if (Status_Ok != status) {
228  std::cerr << "Reconfigure: failed to query image config: " << Channel::statusString(status) << std::endl;
229  goto clean_out;
230  }
231 
232  profile |= crl::multisense::AprilTag;
233  cfg.setCameraProfile(profile);
234 
235  status = channelP->setImageConfig(cfg);
236  if (Status_Ok != status) {
237  std::cerr << "Reconfigure: failed to set image config: " << Channel::statusString(status) << std::endl;
238  goto clean_out;
239  }
240 
241  //
242  // Send default parameters
243 
244  status = channelP->setApriltagParams(params);
245  if (Status_Ok != status) {
246  std::cerr << "Failed to set apriltag params: " << Channel::statusString(status) << std::endl;
247  goto clean_out;
248  }
249 
250  //
251  // Add callbacks
252 
253  channelP->addIsolatedCallback(apriltagCallback);
254 
255  //
256  // Start streaming
257 
258  status = channelP->startStreams(Source_AprilTag_Detections);
259  if (Status_Ok != status) {
260  std::cerr << "Failed to start streams: " << Channel::statusString(status) << std::endl;
261  goto clean_out;
262  }
263 
264  while(!doneG)
265  usleep(100000);
266 
267  //
268  // Stop streaming
269 
270  status = channelP->stopStreams(Source_All);
271  if (Status_Ok != status) {
272  std::cerr << "Failed to stop streams: " << Channel::statusString(status) << std::endl;
273  }
274 
275  //
276  // Report simple stats
277 
278 
279 clean_out:
280 
281  Channel::Destroy(channelP);
282  return 0;
283 }
usage
static void usage()
Definition: FirmwareUpdateUtility.cc:51
crl::multisense::Status_Ok
static CRL_CONSTEXPR Status Status_Ok
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:99
crl::multisense::Source_AprilTag_Detections
static CRL_CONSTEXPR DataSource Source_AprilTag_Detections
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:136
getopt.h
device_info_utility.int
int
Definition: device_info_utility.py:61
getopt
int getopt(int argc, char **argv, char *opts)
Definition: getopt.c:31
crl::multisense::Channel::Destroy
static void Destroy(Channel *instanceP)
Definition: Legacy/details/channel.cc:863
CRL_UNUSED
#define CRL_UNUSED(var)
Definition: Legacy/include/MultiSense/details/utility/Portability.hh:44
crl::multisense::Channel::setApriltagParams
virtual Status setApriltagParams(const system::ApriltagParams &params)=0
main
int main(int argc, char **argvPP)
Definition: AprilTagTestUtility.cc:135
Portability.hh
crl::multisense::Channel::startStreams
virtual Status startStreams(DataSource mask)=0
crl::multisense::Channel::setMtu
virtual Status setMtu(int32_t mtu)=0
crl::multisense::User_Control
static CRL_CONSTEXPR CameraProfile User_Control
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:176
crl::multisense::apriltag::Header
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:2972
crl::multisense::image::Config
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:797
crl::multisense::AprilTag
static CRL_CONSTEXPR CameraProfile AprilTag
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:189
crl::multisense::Channel::statusString
static const char * statusString(Status status)
Definition: Legacy/details/channel.cc:876
crl::multisense::Source_All
static CRL_CONSTEXPR DataSource Source_All
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:118
crl::multisense::Channel::setBestMtu
virtual Status setBestMtu()=0
d
d
crl::multisense::Channel::Create
static Channel * Create(const std::string &sensorAddress)
Definition: Legacy/details/channel.cc:817
crl::multisense::Channel::getImageConfig
virtual Status getImageConfig(image::Config &c)=0
crl::multisense::Channel::getVersionInfo
virtual Status getVersionInfo(system::VersionInfo &v)=0
crl::multisense::Status
int32_t Status
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:94
header
std_msgs::Header const * header(const M &m)
crl::multisense::system::VersionInfo
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3159
crl::multisense::Channel
Definition: Legacy/include/MultiSense/MultiSenseChannel.hh:69
crl::multisense
Definition: Legacy/details/channel.cc:62
crl::multisense::Channel::getDeviceModes
virtual Status getDeviceModes(std::vector< system::DeviceMode > &m)=0
crl::multisense::Channel::addIsolatedCallback
virtual Status addIsolatedCallback(image::Callback callback, DataSource imageSourceMask, void *userDataP=NULL)=0
crl::multisense::Channel::stopStreams
virtual Status stopStreams(DataSource mask)=0
crl::multisense::image::Config::setCameraProfile
void setCameraProfile(const CameraProfile &profile)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:997
optarg
char * optarg
Definition: getopt.c:29
crl::multisense::CameraProfile
uint32_t CameraProfile
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:173
crl::multisense::system::ApriltagParams
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3880
crl::multisense::Channel::setImageConfig
virtual Status setImageConfig(const image::Config &c)=0


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:08