Mech-Eye API 2.4.0
API reference documentation for Mech-Eye Industrial 3D Camera
Loading...
Searching...
No Matches
api_util.h
1/*******************************************************************************
2 *BSD 3-Clause License
3 *
4 *Copyright (c) 2016-2024, Mech-Mind Robotics
5 *All rights reserved.
6 *
7 *Redistribution and use in source and binary forms, with or without
8 *modification, are permitted provided that the following conditions are met:
9 *
10 *1. Redistributions of source code must retain the above copyright notice, this
11 * list of conditions and the following disclaimer.
12 *
13 *2. Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
16 *
17 *3. Neither the name of the copyright holder nor the names of its
18 * contributors may be used to endorse or promote products derived from
19 * this software without specific prior written permission.
20 *
21 *THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 *AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 *IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 *DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 *DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 *SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 *CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 *OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 *OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 ******************************************************************************/
32
33#pragma once
34#include <iostream>
35#include <set>
36#include <utility>
37#include <regex>
38#include "CameraProperties.h"
39#include "ErrorStatus.h"
40#include "CommonTypes.h"
41#include "Camera.h"
42
43inline void printCameraInfo(const mmind::eye::CameraInfo& cameraInfo)
44{
45 std::cout << "............................." << std::endl;
46 std::cout << "Model: " << cameraInfo.model << std::endl;
47 std::cout << "Serial number: " << cameraInfo.serialNumber << std::endl;
48 std::cout << "IP address: " << cameraInfo.ipAddress << std::endl;
49 std::cout << "Subnet mask: " << cameraInfo.subnetMask << std::endl;
50 std::cout << "IP address assignment method: "
51 << mmind::eye::ipAssignmentMethodToString(cameraInfo.ipAssignmentMethod) << std::endl;
52 std::cout << "Hardware version: "
53 << "V" << cameraInfo.hardwareVersion.toString() << std::endl;
54 std::cout << "Firmware version: "
55 << "V" << cameraInfo.firmwareVersion.toString() << std::endl;
56 std::cout << "............................." << std::endl;
57 std::cout << std::endl;
58}
59
60inline void printCameraStatus(const mmind::eye::CameraStatus& cameraStatus)
61{
62 std::cout << ".....Camera temperatures....." << std::endl;
63 std::cout << "CPU: " << cameraStatus.temperature.cpuTemperature << "°C" << std::endl;
64 std::cout << "Projector: " << cameraStatus.temperature.projectorTemperature << "°C"
65 << std::endl;
66 std::cout << "............................" << std::endl;
67
68 std::cout << std::endl;
69}
70
71inline void printCameraResolutions(const mmind::eye::CameraResolutions& cameraResolutions)
72
73{
74 std::cout << ".....Image resolutions....." << std::endl;
75 std::cout << "2D image (texture): " << cameraResolutions.texture.width << " (width) × "
76 << cameraResolutions.texture.height << " (height)" << std::endl;
77 std::cout << "Depth map: " << cameraResolutions.depth.width << " (width) × "
78 << cameraResolutions.depth.height << " (height)" << std::endl;
79}
80
81inline void printCameraMatrix(const std::string& title,
82 const mmind::eye::CameraMatrix& cameraMatrix)
83{
84 std::cout << title << ": " << std::endl
85 << " [" << cameraMatrix.fx << ", " << 0 << ", " << cameraMatrix.cx << "]"
86
87 << std::endl
88 << " [" << 0 << ", " << cameraMatrix.fy << ", " << cameraMatrix.cy << "]"
89
90 << std::endl
91 << " [" << 0 << ", " << 0 << ", " << 1 << "]" << std::endl;
92 std::cout << std::endl;
93}
94
95inline void printCameraDistCoeffs(const std::string& title,
96 const mmind::eye::CameraDistortion& distCoeffs)
97{
98 std::cout << title << ": " << std::endl
99 << " k1: " << distCoeffs.k1 << ", k2: " << distCoeffs.k2
100 << ", p1: " << distCoeffs.p1 << ", p2: " << distCoeffs.p2 << ", k3: " << distCoeffs.k3
101 << std::endl;
102 std::cout << std::endl;
103}
104
105inline void printTransform(const std::string& title, const mmind::eye::Transformation& transform)
106{
107 std::cout << "Rotation: " << title << ": " << std::endl;
108 for (int i = 0; i < 3; i++) {
109 std::cout << " [";
110 for (int j = 0; j < 3; j++) {
111 std::cout << transform.rotation[i][j];
112 if (j != 2)
113 std::cout << ", ";
114 }
115 std::cout << "]" << std::endl;
116 }
117 std::cout << std::endl;
118 std::cout << "Translation " << title << ": " << std::endl;
119 std::cout << " X: " << transform.translation[0] << "mm, Y: " << transform.translation[1]
120 << "mm, Z: " << transform.translation[2] << "mm" << std::endl;
121 std::cout << std::endl;
122}
123
124inline void printCameraIntrinsics(const mmind::eye::CameraIntrinsics& intrinsics)
125{
126 printCameraMatrix("Texture 2D camera matrix", intrinsics.texture.cameraMatrix);
127 printCameraDistCoeffs("Texture 2D camera distortion coefficients",
128 intrinsics.texture.cameraDistortion);
129
130 printCameraMatrix("Depth 2D camera matrix", intrinsics.depth.cameraMatrix);
131 printCameraDistCoeffs("Depth 2D camera distortion doefficients",
132 intrinsics.depth.cameraDistortion);
133
134 printTransform("Transformation from depth 2D camera to texture 2D camera",
135 intrinsics.depthToTexture);
136}
137
138inline bool findAndConnect(mmind::eye::Camera& device)
139{
140 std::cout << "Looking for available cameras..." << std::endl;
141 std::vector<mmind::eye::CameraInfo> deviceInfoList = mmind::eye::Camera::discoverCameras();
142
143 if (deviceInfoList.empty()) {
144 std::cout << "No cameras are available." << std::endl;
145 return false;
146 }
147
148 for (int i = 0; i < deviceInfoList.size(); i++) {
149 std::cout << "Mech-Eye device index: " << i << std::endl;
150 printCameraInfo(deviceInfoList[i]);
151 }
152
153 std::cout << "Enter the index of the device to which you want to connect: ";
154 unsigned inputIndex = 0;
155
156 while (true) {
157 std::string str;
158 std::cin >> str;
159 if (std::regex_match(str.begin(), str.end(), std::regex{"[0-9]+"}) &&
160 atoi(str.c_str()) < deviceInfoList.size()) {
161 inputIndex = atoi(str.c_str());
162 break;
163 }
164 std::cout << "The entered index is invalid. Please enter the device index again: ";
165 }
166
168 status = device.connect(deviceInfoList[inputIndex]);
169
170 if (!status.isOK()) {
171 showError(status);
172 return false;
173 }
174
175 std::cout << "Successfully connected to the camera." << std::endl;
176 return true;
177}
178
179inline std::vector<mmind::eye::Camera> findAndConnectMultiCamera()
180{
181 std::cout << "Looking for available cameras..." << std::endl;
182 std::vector<mmind::eye::CameraInfo> cameraInfoList = mmind::eye::Camera::discoverCameras();
183
184 if (cameraInfoList.empty()) {
185 std::cout << "No cameras are avaialble." << std::endl;
186 return {};
187 }
188
189 for (int i = 0; i < cameraInfoList.size(); i++) {
190 std::cout << "Mech-Eye device index: " << i << std::endl;
191 printCameraInfo(cameraInfoList[i]);
192 }
193
194 std::string str;
195 std::set<unsigned> indices;
196
197 while (true) {
198 std::cout << "Enter the indices of the devices to which you want to connect: " << std::endl;
199 std::cout << "Enter the character \"c\" at the end of all the indices" << std::endl;
200
201 std::cin >> str;
202 if (str == "c")
203 break;
204 if (std::regex_match(str.begin(), str.end(), std::regex{"[0-9]+"}) &&
205 atoi(str.c_str()) < cameraInfoList.size())
206 indices.insert(atoi(str.c_str()));
207 else
208 std::cout << "The entered indices are invalid. Please enter the device indices again: ";
209 }
210
211 std::vector<mmind::eye::Camera> cameraList{};
212
213 auto iter = indices.cbegin();
214 for (int i = 0; i < indices.size(); ++i, ++iter) {
215 mmind::eye::Camera camera;
216 auto status = camera.connect(cameraInfoList[*iter]);
217 if (status.isOK())
218 cameraList.push_back(camera);
219 else
220 showError(status);
221 }
222
223 return cameraList;
224}
225
226inline bool confirmCapture3D()
227{
228 std::cout
229 << "Do you want the camera to capture 3D data? Enter \"y\" to confirm or \"n\" to cancel: "
230 << std::endl;
231 while (true) {
232 std::string confirmStr;
233 std::cin >> confirmStr;
234 if (confirmStr == "y") {
235 return true;
236 } else if (confirmStr == "n") {
237 std::cout << "The capture command was canceled." << std::endl;
238 return false;
239 } else {
240 std::cout << "The entered character was invalid. Please enter \"y\" to confirm or "
241 "\"n\" to cancel:"
242 << std::endl;
243 }
244 }
245}
Operates the camera. Use Camera::connect to connect an available camera, and then call the correspond...
Definition Camera.h:55
static std::vector< CameraInfo > discoverCameras()
Discovers all available cameras and returns the list of information of all available cameras....
ErrorStatus connect(const CameraInfo &info, unsigned int timeoutMs=5000)
Connects to a camera using CameraInfo.
std::string toString() const
Converts a Version object to a string.
Definition Version.h:71
Describes the distortion parameters.
double k1
Radial distortion coefficients.
double k3
Radial distortion coefficients.
double p2
Tangential distortion coefficients.
double k2
Radial distortion coefficients.
double p1
Tangential distortion coefficients.
Defines the camera information.
IpAssignmentMethod ipAssignmentMethod
The IP address assignment method of the device.
std::string serialNumber
The serial number of the device.
Version hardwareVersion
The version of the hardware (pre-determined in the factory).
std::string model
The device model, such as Mech-Eye NANO.
Version firmwareVersion
The version of the firmware (upgradable).
std::string subnetMask
The subnet mask of the device.
std::string ipAddress
The IP address of the device.
Defines the 3D camera intrinsic parameters, including the intrinsic parameters of the texture 2D came...
Intrinsics2DCamera depth
The intrinsic parameters of the depth 2D camera(s) for capturing the depth map.
Describes the camera intrinsic parameter matrix.
double cx
Principal point.
double fy
Focal lengths.
double cy
Principal point.
double fx
Focal lengths.
Defines the camera image resolutions, including the resolutions of the 2D image (texture) and depth m...
Describes the camera's statuses.
float projectorTemperature
The temperature (in °C) of the camera projector.
float cpuTemperature
The temperature (in °C) of the camera CPU.
Describes the types of errors.
Definition ErrorStatus.h:12
bool isOK() const
Returns true if the operation succeeded.
Definition ErrorStatus.h:84
Defines the rigid body transformations, including rotation matrix and translation vector.
double rotation[3][3]
3*3 rotation matrix.
double translation[3]
3*1 translation vector in [x(mm), y(mm), z(mm)].