40 std::shared_ptr<ros::Publisher>
const& pub,
42 : camera_name_(name), serial_number_(serial), diagnostics_pub_(pub), nh_(nh)
59 template void DiagnosticsManager::addDiagnostic<int>(
const Spinnaker::GenICam::gcstring name);
61 template void DiagnosticsManager::addDiagnostic<float>(
const Spinnaker::GenICam::gcstring name);
64 std::pair<int, int> operational,
int lower_bound,
int upper_bound)
71 std::pair<float, float> operational,
float lower_bound,
float upper_bound)
82 std::string node_prefix =
"";
83 std::string node_path;
84 std::string node_id = node_name;
87 if (node_namespace ==
"/")
94 size_t pos = node_id.find(
"/");
95 while (pos != std::string::npos)
97 node_id.replace(pos, 1,
"_");
98 pos = node_id.find(
"/");
103 pos = node_path.find(
"_");
104 while (pos != std::string::npos)
106 node_path.replace(pos, 1,
" ");
107 pos = node_path.find(
"_");
113 ros::param::set(node_prefix +
"analyzers/spinnaker/path",
"Spinnaker");
114 ros::param::set(node_prefix +
"analyzers/spinnaker/type",
"diagnostic_aggregator/AnalyzerGroup");
118 std::string analyzerPath = node_prefix +
"analyzers/spinnaker/analyzers/" + node_id;
122 ros::param::set(analyzerPath +
"/type",
"diagnostic_aggregator/GenericAnalyzer");
128 if (
bond_ ==
nullptr)
130 bond_ = std::shared_ptr<bond::Bond>(
new bond::Bond(
"/diagnostics_agg/bond" + node_namespace, node_namespace));
132 else if (!
bond_->isBroken())
136 bond_->setConnectTimeout(120);
139 diagnostic_msgs::AddDiagnostics srv;
140 srv.request.load_namespace = node_namespace;
149 template <
typename T>
153 diagnostic_msgs::KeyValue kv;
154 kv.key =
param.parameter_name;
155 kv.value = std::to_string(value);
157 diagnostic_msgs::DiagnosticStatus diag_status;
158 diag_status.values.push_back(kv);
159 diag_status.name = node_name +
":" + std::string(
param.parameter_name.c_str());
163 if (!
param.check_ranges || (value >
param.operational_range.first && value <=
param.operational_range.second))
165 diag_status.level = 0;
166 diag_status.message =
"OK: " + std::string(
param.parameter_name)
167 +
" performing in expected operational range.";
169 else if (value >=
param.warn_range_lower && value <=
param.warn_range_upper)
171 diag_status.level = 1;
172 diag_status.message =
"WARNING: " + std::string(
param.parameter_name.c_str())
173 +
" is not in expected operational range.";
177 diag_status.level = 2;
178 diag_status.message =
"ERROR: " + std::string(
param.parameter_name.c_str())
179 +
" is in critical operation range.";
182 kv.key =
"Warning Range";
183 kv.value =
"[" + std::to_string(
param.warn_range_lower) +
", "
184 + std::to_string(
param.warn_range_upper) +
"]";
185 diag_status.values.push_back(kv);
188 kv.key =
"Operational Range";
189 kv.value =
"[" + std::to_string(
param.operational_range.first) +
", "
190 + std::to_string(
param.operational_range.second) +
"]";
191 diag_status.values.push_back(kv);
199 diagnostic_msgs::DiagnosticArray diag_array;
202 diagnostic_msgs::DiagnosticStatus diag_manufacture_info;
203 diag_manufacture_info.name = node_name +
": Manufacture Info";
211 diagnostic_msgs::KeyValue kv;
213 kv.value =
"Property not Available and Readable";
214 diag_manufacture_info.values.push_back(kv);
219 Spinnaker::GenApi::CStringPtr string_ptr =
static_cast<Spinnaker::GenApi::CStringPtr
>(
222 diagnostic_msgs::KeyValue kv;
224 kv.value = string_ptr->GetValue(
true);
225 diag_manufacture_info.values.push_back(kv);
228 diag_array.status.push_back(diag_manufacture_info);
236 diagnostic_msgs::KeyValue kv;
237 kv.key =
param.parameter_name;
238 kv.value =
"Property not Available and Readable";
239 diag_manufacture_info.values.push_back(kv);
243 Spinnaker::GenApi::CFloatPtr float_ptr =
244 static_cast<Spinnaker::GenApi::CFloatPtr
>(spinnaker->
readProperty(
param.parameter_name));
246 float float_value = float_ptr->GetValue(
true);
249 diag_array.status.push_back(diag_status);
258 diagnostic_msgs::KeyValue kv;
259 kv.key =
param.parameter_name;
260 kv.value =
"Property not Available and Readable";
261 diag_manufacture_info.values.push_back(kv);
265 Spinnaker::GenApi::CIntegerPtr integer_ptr =
266 static_cast<Spinnaker::GenApi::CIntegerPtr
>(spinnaker->
readProperty(
param.parameter_name));
268 int int_value = integer_ptr->GetValue(
true);
270 diag_array.status.push_back(diag_status);