44 arv_stream_set_emit_signals(
p_streams_[i], FALSE);
74 guint64 n_completed_buffers = 0;
75 guint64 n_failures = 0;
76 guint64 n_underruns = 0;
77 arv_stream_get_statistics(
p_streams_[i], &n_completed_buffers, &n_failures, &n_underruns);
78 ROS_INFO(
"Completed buffers = %Lu", (
unsigned long long)n_completed_buffers);
79 ROS_INFO(
"Failures = %Lu", (
unsigned long long)n_failures);
80 ROS_INFO(
"Underruns = %Lu", (
unsigned long long)n_underruns);
85 arv_gv_stream_get_statistics(
reinterpret_cast<ArvGvStream*
>(
p_streams_[i]), &n_resent, &n_missing);
86 ROS_INFO(
"Resent buffers = %Lu", (
unsigned long long)n_resent);
87 ROS_INFO(
"Missing = %Lu", (
unsigned long long)n_missing);
93 arv_device_execute_command(
p_device_,
"AcquisitionStop");
117 bool init_params_from_reconfig = pnh.
param<
bool>(
"init_params_from_dyn_reconfigure",
true);
119 std::string awb_mode = pnh.
param<std::string>(
"BalanceWhiteAuto",
"Continuous");
120 std::string wb_ratio_selector_feature = pnh.
param<std::string>(
"wb_ratio_selector_feature",
"");
121 std::string wb_ratio_feature = pnh.
param<std::string>(
"wb_ratio_feature",
"");
123 std::string wb_ratio_selector_args = pnh.
param<std::string>(
"wb_ratio_selectors",
"");
124 std::vector<std::string> wb_ratio_selector_values;
127 std::string wb_ratio_args = pnh.
param<std::string>(
"wb_ratios",
"");
128 std::vector<std::string> wb_ratio_str_values;
131 if (wb_ratio_selector_values.size() != wb_ratio_str_values.size())
133 ROS_WARN(
"Lists of 'wb_ratio_selector' and 'wb_ratio' have different sizes. "
134 "Only setting values which exist in both lists.");
140 std::string stream_channel_args;
141 if (pnh.
getParam(
"channel_names", stream_channel_args))
150 std::string pixel_format_args;
151 std::vector<std::string> pixel_formats;
152 pnh.
param(
"PixelFormat", pixel_format_args, pixel_format_args);
155 std::string calib_url_args;
156 std::vector<std::string> calib_urls;
157 pnh.
param(
"camera_info_url", calib_url_args, calib_url_args);
162 std::max(0.0, pnh.
param<
double>(
"diagnostic_publish_rate", 0.1));
170 arv_update_device_list();
171 uint n_interfaces = arv_get_n_interfaces();
172 ROS_INFO(
"# Interfaces: %d", n_interfaces);
174 uint n_devices = arv_get_n_devices();
175 ROS_INFO(
"# Devices: %d", n_devices);
176 for (uint i = 0; i < n_devices; i++)
177 ROS_INFO(
"Device%d: %s", i, arv_get_device_id(i));
202 const char* vendor_name = arv_camera_get_vendor_name(
p_camera_);
203 const char* model_name = arv_camera_get_model_name(
p_camera_);
204 const char* device_id = arv_camera_get_device_id(
p_camera_);
205 const char* device_sn = arv_device_get_string_feature_value(
p_device_,
"DeviceSerialNumber");
206 ROS_INFO(
"Successfully Opened: %s-%s-%s", vendor_name, model_name,
207 (device_sn) ? device_sn : device_id);
228 ROS_WARN(
"Unable to detect number of supported stream channels.");
258 arv_camera_gv_select_stream_channel(
p_camera_, i);
266 gint64 focus_min64, focus_max64;
267 arv_device_get_integer_feature_bounds(
p_device_,
"FocusPos", &focus_min64, &focus_max64);
279 arv_camera_gv_select_stream_channel(
p_camera_, i);
281 if (init_params_from_reconfig)
287 arv_device_set_float_feature_value(
p_device_,
"ExposureTimeAbs",
config_.ExposureTime);
291 arv_device_set_integer_feature_value(
p_device_,
"AcquisitionFrameRateEnable", 1);
301 arv_device_set_string_feature_value(
p_device_,
"TriggerSelector",
"FrameStart");
302 arv_device_set_string_feature_value(
p_device_,
"TriggerMode",
"Off");
311 for (
int l = 0; l < std::min(wb_ratio_selector_values.size(), wb_ratio_str_values.size());
314 arv_device_set_string_feature_value(
p_device_, wb_ratio_selector_feature.c_str(),
315 wb_ratio_selector_values[l].c_str());
316 arv_device_set_float_feature_value(
p_device_, wb_ratio_feature.c_str(),
317 std::stof(wb_ratio_str_values[l]));
344 arv_camera_gv_select_stream_channel(
p_camera_, i);
345 std::string source_selector =
"Source" + std::to_string(i);
346 arv_device_set_string_feature_value(
p_device_,
"SourceSelector", source_selector.c_str());
347 arv_device_set_string_feature_value(
p_device_,
"PixelFormat", pixel_formats[i].c_str());
348 sensors_[i]->pixel_format = std::string(arv_device_get_string_feature_value(
p_device_,
"PixelFormat"));
356 ROS_WARN_STREAM(
"There is no known conversion from " <<
sensors_[i]->pixel_format <<
" to a usual ROS image encoding. Likely you need to implement one.");
359 sensors_[i]->n_bits_pixel = ARV_PIXEL_FORMAT_BIT_PER_PIXEL(
360 arv_device_get_integer_feature_value(
p_device_,
"PixelFormat"));
366 pnh.
param<
double>(
"softwaretriggerrate",
config_.softwaretriggerrate,
config_.softwaretriggerrate);
386 double tf_publish_rate;
387 pnh.
param<
double>(
"tf_publish_rate", tf_publish_rate, 0);
388 if (tf_publish_rate > 0.)
410 catch (
const YAML::BadFile& e)
412 ROS_WARN(
"YAML file cannot be loaded: %s", e.what());
413 ROS_WARN(
"Camera diagnostics will not be published.");
415 catch (
const YAML::ParserException& e)
417 ROS_WARN(
"YAML file is malformed: %s", e.what());
418 ROS_WARN(
"Camera diagnostics will not be published.");
432 ROS_WARN(
"No diagnostic features specified.");
433 ROS_WARN(
"Camera diagnostics will not be published.");
438 ROS_WARN(
"diagnostic_publish_rate is <= 0.0");
439 ROS_WARN(
"Camera diagnostics will not be published.");
443 ArvGcNode* p_gc_node;
444 GError* error = NULL;
446 p_gc_node = arv_device_get_feature(
p_device_,
"DeviceSerialNumber");
448 if (calib_urls[0].empty())
450 if (arv_gc_feature_node_is_implemented(ARV_GC_FEATURE_NODE(p_gc_node), &error))
452 GType device_serial_return_type = arv_gc_feature_node_get_value_type(ARV_GC_FEATURE_NODE(p_gc_node));
456 if (device_serial_return_type == G_TYPE_STRING)
458 calib_urls[0] = arv_device_get_string_feature_value(
p_device_,
"DeviceSerialNumber");
459 calib_urls[0] +=
".yaml";
461 else if (device_serial_return_type == G_TYPE_INT64)
463 calib_urls[0] = arv_device_get_string_feature_value(
p_device_,
"DeviceID");
464 calib_urls[0] +=
".yaml";
472 std::string camera_info_frame_id =
config_.frame_id;
502 ROS_INFO(
" Using Camera Configuration:");
503 ROS_INFO(
" ---------------------------");
504 ROS_INFO(
" Vendor name = %s", arv_device_get_string_feature_value(
p_device_,
"DeviceVendorName"));
505 ROS_INFO(
" Model name = %s", arv_device_get_string_feature_value(
p_device_,
"DeviceModelName"));
506 ROS_INFO(
" Device id = %s", arv_device_get_string_feature_value(
p_device_,
"DeviceUserID"));
507 ROS_INFO(
" Serial number = %s", arv_device_get_string_feature_value(
p_device_,
"DeviceSerialNumber"));
510 arv_camera_is_uv_device(
p_camera_) ?
"USB3Vision" : (arv_camera_is_gv_device(
p_camera_) ?
"GigEVision" :
"Other"));
513 ROS_INFO(
" ROI x,y,w,h = %d, %d, %d, %d",
roi_.x,
roi_.y,
roi_.width,
roi_.height);
525 ROS_INFO(
" AcquisitionFrameRate = %g hz",
config_.AcquisitionFrameRate);
530 ROS_INFO(
" BalanceWhiteAuto = %s", awb_mode.c_str());
533 for (
int l = 0; l < std::min(wb_ratio_selector_values.size(), wb_ratio_str_values.size());
536 arv_device_set_string_feature_value(
p_device_, wb_ratio_selector_feature.c_str(),
537 wb_ratio_selector_values[l].c_str());
538 float wb_ratio_val = arv_device_get_float_feature_value(
p_device_, wb_ratio_feature.c_str());
539 ROS_INFO(
" BalanceRatio %s = %f", wb_ratio_selector_values[l].c_str(), wb_ratio_val);
562 ROS_INFO(
" Network mtu = %lu", arv_device_get_integer_feature_value(
p_device_,
"GevSCPSPacketSize"));
564 ROS_INFO(
" ---------------------------");
578 ROS_WARN(
"PTP Error: ptp_set_cmd_feature_ '%s' is not available on the device.",
597 arv_camera_gv_select_stream_channel(
p_camera_, i);
603 arv_camera_gv_select_stream_channel(
p_camera_, i);
604 const gint n_bytes_payload_stream_ = arv_camera_get_payload(
p_camera_);
616 ROS_WARN(
"Stream %i: Could not create image stream for %s. Retrying...", i,
guid_.c_str());
624 std::vector<image_transport::SubscriberStatusCallback> image_cbs_;
625 std::vector<ros::SubscriberStatusCallback> info_cbs_;
636 std::string topic_name = this->
getName();
645 1, image_cb, image_cb, info_cb, info_cb);
651 StreamIdData* data =
new StreamIdData();
660 arv_stream_set_emit_signals(
p_streams_[i], TRUE);
665 { return pub.getNumSubscribers() > 0; }))
680 ROS_INFO(
"Done initializing camera_aravis.");
685 const char* feature_name = request.feature.c_str();
686 response.response = arv_device_get_integer_feature_value(this->
p_device_, feature_name);
692 const char* feature_name = request.feature.c_str();
693 guint64 value = request.value;
694 arv_device_set_integer_feature_value(this->
p_device_, feature_name, value);
695 if (arv_device_get_status(this->
p_device_) == ARV_DEVICE_STATUS_SUCCESS)
708 const char* feature_name = request.feature.c_str();
709 response.response = arv_device_get_float_feature_value(this->
p_device_, feature_name);
715 const char* feature_name = request.feature.c_str();
716 const double value = request.value;
717 arv_device_set_float_feature_value(this->
p_device_, feature_name, value);
718 if (arv_device_get_status(this->
p_device_) == ARV_DEVICE_STATUS_SUCCESS)
731 const char* feature_name = request.feature.c_str();
732 response.response = arv_device_get_string_feature_value(this->
p_device_, feature_name);
738 const char* feature_name = request.feature.c_str();
739 const char* value = request.value.c_str();
740 arv_device_set_string_feature_value(this->
p_device_, feature_name, value);
741 if (arv_device_get_status(this->
p_device_) == ARV_DEVICE_STATUS_SUCCESS)
754 const char* feature_name = request.feature.c_str();
755 response.response = arv_device_get_boolean_feature_value(this->
p_device_, feature_name);
761 const char* feature_name = request.feature.c_str();
762 const bool value = request.value;
763 arv_device_set_boolean_feature_value(this->
p_device_, feature_name, value);
764 if (arv_device_get_status(this->
p_device_) == ARV_DEVICE_STATUS_SUCCESS)
779 ROS_WARN(
"PTP Error: ptp_status_feature_name and/or ptp_enable_feature_name are empty.");
786 ROS_WARN(
"PTP Error: ptp_status_feature_name '%s' is not available on the device.",
789 ROS_WARN(
"PTP Error: ptp_enable_feature_name '%s' is not available on the device.",
795 const char* ptpS_satus_char_ptr =
797 std::string ptp_status_str = (ptpS_satus_char_ptr) ? std::string(ptpS_satus_char_ptr) :
"Faulty";
799 if (ptp_status_str ==
"Faulty" ||
800 ptp_status_str ==
"Disabled" ||
801 ptp_status_str ==
"Initializing" ||
804 ROS_INFO(
"Resetting ptp clock (was set to %s)", ptp_status_str.c_str());
818 arv_device_set_float_feature_value(
p_device_,
"ExposureTime", msg_ptr->exposure_time);
827 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"All");
829 arv_device_set_float_feature_value(
p_device_,
"Gain", msg_ptr->gain);
836 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"Red");
837 arv_device_set_float_feature_value(
p_device_,
"Gain", msg_ptr->gain_red);
842 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"Green");
843 arv_device_set_float_feature_value(
p_device_,
"Gain", msg_ptr->gain_green);
848 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"Blue");
849 arv_device_set_float_feature_value(
p_device_,
"Gain", msg_ptr->gain_blue);
860 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"All");
862 arv_device_set_float_feature_value(
p_device_,
"BlackLevel", msg_ptr->black_level);
869 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"Red");
870 arv_device_set_float_feature_value(
p_device_,
"BlackLevel", msg_ptr->bl_red);
875 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"Green");
876 arv_device_set_float_feature_value(
p_device_,
"BlackLevel", msg_ptr->bl_green);
881 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"Blue");
882 arv_device_set_float_feature_value(
p_device_,
"BlackLevel", msg_ptr->bl_blue);
888 if (strcmp(
"The Imaging Source Europe GmbH", arv_camera_get_vendor_name(
p_camera_)) == 0)
890 arv_device_set_integer_feature_value(
p_device_,
"WhiteBalanceRedRegister", (
int)(
auto_params_.wb_red * 255.));
891 arv_device_set_integer_feature_value(
p_device_,
"WhiteBalanceGreenRegister", (
int)(
auto_params_.wb_green * 255.));
892 arv_device_set_integer_feature_value(
p_device_,
"WhiteBalanceBlueRegister", (
int)(
auto_params_.wb_blue * 255.));
898 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Red");
899 arv_device_set_float_feature_value(
p_device_,
"BalanceRatio", msg_ptr->wb_red);
904 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Green");
905 arv_device_set_float_feature_value(
p_device_,
"BalanceRatio", msg_ptr->wb_green);
910 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Blue");
911 arv_device_set_float_feature_value(
p_device_,
"BalanceRatio", msg_ptr->wb_blue);
924 std::numeric_limits<double>::quiet_NaN();
937 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"All");
942 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"Red");
944 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"Green");
946 arv_device_set_string_feature_value(
p_device_,
"GainSelector",
"Blue");
955 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"All");
960 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"Red");
962 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"Green");
964 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"Blue");
970 if (strcmp(
"The Imaging Source Europe GmbH", arv_camera_get_vendor_name(
p_camera_)) == 0)
972 auto_params_.wb_red = arv_device_get_integer_feature_value(
p_device_,
"WhiteBalanceRedRegister") / 255.;
973 auto_params_.wb_green = arv_device_get_integer_feature_value(
p_device_,
"WhiteBalanceGreenRegister") / 255.;
974 auto_params_.wb_blue = arv_device_get_integer_feature_value(
p_device_,
"WhiteBalanceBlueRegister") / 255.;
979 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Red");
981 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Green");
983 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Blue");
1009 arv_device_set_string_feature_value(
p_device_,
"ExposureAuto",
"Off");
1013 arv_device_set_string_feature_value(
p_device_,
"GainAuto",
"Off");
1017 arv_device_set_string_feature_value(
p_device_,
"GainAutoBalance",
"Off");
1021 arv_device_set_string_feature_value(
p_device_,
"BlackLevelAuto",
"Off");
1025 arv_device_set_string_feature_value(
p_device_,
"BlackLevelAutoBalance",
"Off");
1029 arv_device_set_string_feature_value(
p_device_,
"BalanceWhiteAuto",
"Off");
1045 if (channel_name.empty())
1063 gboolean b_auto_buffer = FALSE;
1064 gboolean b_packet_resend = TRUE;
1065 unsigned int timeout_packet = 40;
1066 unsigned int timeout_frame_retention = 200;
1070 if (!ARV_IS_GV_STREAM(p_stream))
1072 ROS_WARN(
"Stream is not a GV_STREAM");
1077 g_object_set(p_stream,
"socket-buffer", ARV_GV_STREAM_SOCKET_BUFFER_AUTO,
"socket-buffer-size", 0,
1079 if (!b_packet_resend)
1080 g_object_set(p_stream,
"packet-resend",
1081 b_packet_resend ? ARV_GV_STREAM_PACKET_RESEND_ALWAYS : ARV_GV_STREAM_PACKET_RESEND_NEVER,
1083 g_object_set(p_stream,
"packet-timeout", timeout_packet * 1000,
"frame-retention", timeout_frame_retention * 1000,
1094 if (config.frame_id ==
"")
1095 config.frame_id = this->
getName();
1098 config.AcquisitionFrameRate = CLAMP(config.AcquisitionFrameRate,
config_min_.AcquisitionFrameRate,
1103 config.frame_id =
tf::resolve(tf_prefix, config.frame_id);
1109 if (config.AutoSlave)
1111 config.ExposureAuto =
"Off";
1112 config.GainAuto =
"Off";
1117 if (config.ExposureAuto.compare(
"Off") != 0)
1119 config.ExposureTime =
config_.ExposureTime;
1120 ROS_WARN(
"ExposureAuto is active. Cannot manually set ExposureTime.");
1122 if (config.GainAuto.compare(
"Off") != 0)
1125 ROS_WARN(
"GainAuto is active. Cannot manually set Gain.");
1129 if (config.TriggerMode.compare(
"Off") != 0)
1131 config.AcquisitionFrameRate =
config_.AcquisitionFrameRate;
1132 ROS_WARN(
"TriggerMode is active (Trigger Source: %s). Cannot manually set AcquisitionFrameRate.",
config_.TriggerSource.c_str());
1136 const bool changed_auto_master = (
config_.AutoMaster != config.AutoMaster);
1137 const bool changed_auto_slave = (
config_.AutoSlave != config.AutoSlave);
1138 const bool changed_acquisition_frame_rate = (
config_.AcquisitionFrameRate != config.AcquisitionFrameRate);
1139 const bool changed_exposure_auto = (
config_.ExposureAuto != config.ExposureAuto);
1140 const bool changed_exposure_time = (
config_.ExposureTime != config.ExposureTime);
1141 const bool changed_gain_auto = (
config_.GainAuto != config.GainAuto);
1142 const bool changed_gain = (
config_.Gain != config.Gain);
1143 const bool changed_acquisition_mode = (
config_.AcquisitionMode != config.AcquisitionMode);
1144 const bool changed_trigger_mode = (
config_.TriggerMode != config.TriggerMode);
1145 const bool changed_trigger_source = (
config_.TriggerSource != config.TriggerSource) || changed_trigger_mode;
1146 const bool changed_focus_pos = (
config_.FocusPos != config.FocusPos);
1147 const bool changed_mtu = (
config_.mtu != config.mtu);
1149 if (changed_auto_master)
1154 if (changed_auto_slave)
1160 if (changed_exposure_time)
1164 ROS_INFO(
"Set ExposureTime = %f us", config.ExposureTime);
1165 arv_camera_set_exposure_time(
p_camera_, config.ExposureTime);
1168 ROS_INFO(
"Camera does not support ExposureTime.");
1175 ROS_INFO(
"Set gain = %f", config.Gain);
1176 arv_camera_set_gain(
p_camera_, config.Gain);
1179 ROS_INFO(
"Camera does not support Gain or GainRaw.");
1182 if (changed_exposure_auto)
1186 ROS_INFO(
"Set ExposureAuto = %s", config.ExposureAuto.c_str());
1187 arv_device_set_string_feature_value(
p_device_,
"ExposureAuto", config.ExposureAuto.c_str());
1188 if (config.ExposureAuto.compare(
"Once") == 0)
1191 config.ExposureTime = arv_camera_get_exposure_time(
p_camera_);
1192 ROS_INFO(
"Get ExposureTime = %f us", config.ExposureTime);
1193 config.ExposureAuto =
"Off";
1197 ROS_INFO(
"Camera does not support ExposureAuto.");
1199 if (changed_gain_auto)
1203 ROS_INFO(
"Set GainAuto = %s", config.GainAuto.c_str());
1204 arv_device_set_string_feature_value(
p_device_,
"GainAuto", config.GainAuto.c_str());
1205 if (config.GainAuto.compare(
"Once") == 0)
1208 config.Gain = arv_camera_get_gain(
p_camera_);
1209 ROS_INFO(
"Get Gain = %f", config.Gain);
1210 config.GainAuto =
"Off";
1214 ROS_INFO(
"Camera does not support GainAuto.");
1217 if (changed_acquisition_frame_rate)
1221 ROS_INFO(
"Set frame rate = %f Hz", config.AcquisitionFrameRate);
1222 arv_camera_set_frame_rate(
p_camera_, config.AcquisitionFrameRate);
1225 ROS_INFO(
"Camera does not support AcquisitionFrameRate.");
1228 if (changed_trigger_mode)
1232 ROS_INFO(
"Set TriggerMode = %s", config.TriggerMode.c_str());
1233 arv_device_set_string_feature_value(
p_device_,
"TriggerMode", config.TriggerMode.c_str());
1236 ROS_INFO(
"Camera does not support TriggerMode.");
1239 if (changed_trigger_source)
1250 ROS_INFO(
"Set TriggerSource = %s", config.TriggerSource.c_str());
1251 arv_device_set_string_feature_value(
p_device_,
"TriggerSource", config.TriggerSource.c_str());
1255 ROS_INFO(
"Camera does not support TriggerSource.");
1259 if (config.TriggerMode.compare(
"On") == 0 && config.TriggerSource.compare(
"Software") == 0)
1263 config_.softwaretriggerrate = config.softwaretriggerrate;
1264 ROS_INFO(
"Set softwaretriggerrate = %f", 1000.0 / ceil(1000.0 / config.softwaretriggerrate));
1271 ROS_INFO(
"Camera does not support TriggerSoftware command.");
1276 if (changed_focus_pos)
1280 ROS_INFO(
"Set FocusPos = %d", config.FocusPos);
1281 arv_device_set_integer_feature_value(
p_device_,
"FocusPos", config.FocusPos);
1283 config.FocusPos = arv_device_get_integer_feature_value(
p_device_,
"FocusPos");
1284 ROS_INFO(
"Get FocusPos = %d", config.FocusPos);
1287 ROS_INFO(
"Camera does not support FocusPos.");
1294 ROS_INFO(
"Set mtu = %d", config.mtu);
1295 arv_device_set_integer_feature_value(
p_device_,
"GevSCPSPacketSize", config.mtu);
1297 config.mtu = arv_device_get_integer_feature_value(
p_device_,
"GevSCPSPacketSize");
1298 ROS_INFO(
"Get mtu = %d", config.mtu);
1301 ROS_INFO(
"Camera does not support mtu (i.e. GevSCPSPacketSize).");
1304 if (changed_acquisition_mode)
1308 ROS_INFO(
"Set AcquisitionMode = %s", config.AcquisitionMode.c_str());
1309 arv_device_set_string_feature_value(
p_device_,
"AcquisitionMode", config.AcquisitionMode.c_str());
1312 arv_device_execute_command(
p_device_,
"AcquisitionStop");
1314 arv_device_execute_command(
p_device_,
"AcquisitionStart");
1317 ROS_INFO(
"Camera does not support AcquisitionMode.");
1331 { return pub.getNumSubscribers() == 0; }))
1333 arv_device_execute_command(
p_device_,
"AcquisitionStop");
1337 arv_device_execute_command(
p_device_,
"AcquisitionStart");
1357 const std::string stream_frame_id = p_can->
config_.frame_id +
"/" + p_can->
stream_names_[stream_id];
1364 ArvBuffer* p_buffer = arv_stream_try_pop_buffer(p_stream);
1367 gint n_available_buffers;
1368 arv_stream_get_n_buffers(p_stream, &n_available_buffers, NULL);
1369 if (n_available_buffers == 0)
1371 p_can->p_buffer_pools_[stream_id]->allocateBuffers(1);
1374 if (p_buffer != NULL)
1376 if (arv_buffer_get_status(p_buffer) == ARV_BUFFER_STATUS_SUCCESS && p_can->p_buffer_pools_[stream_id] && p_can->cam_pubs_[stream_id].getNumSubscribers())
1378 (p_can->n_buffers_)++;
1380 sensor_msgs::ImagePtr msg_ptr = (*(p_can->p_buffer_pools_[stream_id]))[p_buffer];
1384 if (p_can->use_ptp_stamp_)
1385 t = arv_buffer_get_timestamp(p_buffer);
1387 t = arv_buffer_get_system_timestamp(p_buffer);
1388 msg_ptr->header.stamp.fromNSec(t);
1390 msg_ptr->header.seq = arv_buffer_get_frame_id(p_buffer);
1392 msg_ptr->header.frame_id = frame_id;
1393 msg_ptr->width = p_can->roi_.width;
1394 msg_ptr->height = p_can->roi_.height;
1395 msg_ptr->encoding = p_can->sensors_[stream_id]->pixel_format;
1396 msg_ptr->step = (msg_ptr->width * p_can->sensors_[stream_id]->n_bits_pixel) / 8;
1399 if (p_can->convert_formats[stream_id])
1401 sensor_msgs::ImagePtr cvt_msg_ptr = p_can->p_buffer_pools_[stream_id]->getRecyclableImg();
1402 p_can->convert_formats[stream_id](msg_ptr, cvt_msg_ptr);
1403 msg_ptr = cvt_msg_ptr;
1407 if (!p_can->camera_infos_[stream_id])
1409 p_can->camera_infos_[stream_id].reset(
new sensor_msgs::CameraInfo);
1411 (*p_can->camera_infos_[stream_id]) = p_can->p_camera_info_managers_[stream_id]->getCameraInfo();
1412 p_can->camera_infos_[stream_id]->header = msg_ptr->header;
1413 if (p_can->camera_infos_[stream_id]->width == 0 || p_can->camera_infos_[stream_id]->height == 0)
1416 "The fields image_width and image_height seem not to be set in "
1417 "the YAML specified by 'camera_info_url' parameter. Please set "
1418 "them there, because actual image size and specified image size "
1419 "can be different due to the region of interest (ROI) feature. In "
1420 "the YAML the image size should be the one on which the camera was "
1421 "calibrated. See CameraInfo.msg specification!");
1422 p_can->camera_infos_[stream_id]->width = p_can->roi_.width;
1423 p_can->camera_infos_[stream_id]->height = p_can->roi_.height;
1426 p_can->cam_pubs_[stream_id].publish(msg_ptr, p_can->camera_infos_[stream_id]);
1428 if (p_can->pub_ext_camera_info_)
1430 ExtendedCameraInfo extended_camera_info_msg;
1431 p_can->extended_camera_info_mutex_.lock();
1432 arv_camera_gv_select_stream_channel(p_can->p_camera_, stream_id);
1433 extended_camera_info_msg.camera_info = *(p_can->camera_infos_[stream_id]);
1434 p_can->fillExtendedCameraInfoMessage(extended_camera_info_msg);
1435 p_can->extended_camera_info_mutex_.unlock();
1436 p_can->extended_camera_info_pubs_[stream_id].publish(extended_camera_info_msg);
1440 if (p_can->use_ptp_stamp_)
1441 p_can->resetPtpClock();
1445 if (arv_buffer_get_status(p_buffer) != ARV_BUFFER_STATUS_SUCCESS)
1449 arv_stream_push_buffer(p_stream, p_buffer);
1454 if (p_can->config_.AutoMaster)
1456 p_can->syncAutoParameters();
1457 p_can->auto_pub_.publish(p_can->auto_params_);
1463 const char* vendor_name = arv_camera_get_vendor_name(
p_camera_);
1465 if (strcmp(
"Basler", vendor_name) == 0)
1467 msg.exposure_time = arv_device_get_float_feature_value(
p_device_,
"ExposureTimeAbs");
1471 msg.exposure_time = arv_device_get_float_feature_value(
p_device_,
"ExposureTime");
1474 if (strcmp(
"Basler", vendor_name) == 0)
1476 msg.gain =
static_cast<float>(arv_device_get_integer_feature_value(
p_device_,
"GainRaw"));
1480 msg.gain = arv_device_get_float_feature_value(
p_device_,
"Gain");
1482 if (strcmp(
"Basler", vendor_name) == 0)
1484 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"All");
1485 msg.black_level =
static_cast<float>(arv_device_get_integer_feature_value(
p_device_,
"BlackLevelRaw"));
1487 else if (strcmp(
"JAI Corporation", vendor_name) == 0)
1491 msg.black_level = 0;
1495 arv_device_set_string_feature_value(
p_device_,
"BlackLevelSelector",
"All");
1496 msg.black_level = arv_device_get_float_feature_value(
p_device_,
"BlackLevel");
1500 if (strcmp(
"The Imaging Source Europe GmbH", vendor_name) == 0)
1502 msg.white_balance_red = arv_device_get_integer_feature_value(
p_device_,
"WhiteBalanceRedRegister") / 255.;
1503 msg.white_balance_green = arv_device_get_integer_feature_value(
p_device_,
"WhiteBalanceGreenRegister") / 255.;
1504 msg.white_balance_blue = arv_device_get_integer_feature_value(
p_device_,
"WhiteBalanceBlueRegister") / 255.;
1508 else if (strcmp(
"JAI Corporation", vendor_name) == 0)
1510 msg.white_balance_red = 1.0;
1511 msg.white_balance_green = 1.0;
1512 msg.white_balance_blue = 1.0;
1515 else if (strcmp(
"Basler", vendor_name) == 0)
1517 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Red");
1518 msg.white_balance_red = arv_device_get_float_feature_value(
p_device_,
"BalanceRatioAbs");
1519 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Green");
1520 msg.white_balance_green = arv_device_get_float_feature_value(
p_device_,
"BalanceRatioAbs");
1521 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Blue");
1522 msg.white_balance_blue = arv_device_get_float_feature_value(
p_device_,
"BalanceRatioAbs");
1527 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Red");
1528 msg.white_balance_red = arv_device_get_float_feature_value(
p_device_,
"BalanceRatio");
1529 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Green");
1530 msg.white_balance_green = arv_device_get_float_feature_value(
p_device_,
"BalanceRatio");
1531 arv_device_set_string_feature_value(
p_device_,
"BalanceRatioSelector",
"Blue");
1532 msg.white_balance_blue = arv_device_get_float_feature_value(
p_device_,
"BalanceRatio");
1535 if (strcmp(
"Basler", vendor_name) == 0)
1537 msg.temperature =
static_cast<float>(arv_device_get_float_feature_value(
p_device_,
"TemperatureAbs"));
1541 msg.temperature = arv_device_get_float_feature_value(
p_device_,
"DeviceTemperature");
1558 ROS_INFO(
"Software trigger started.");
1559 std::chrono::system_clock::time_point next_time = std::chrono::system_clock::now();
1562 next_time += std::chrono::milliseconds(
size_t(std::round(1000.0 /
config_.softwaretriggerrate)));
1565 { return pub.getNumSubscribers() > 0; }))
1567 arv_device_execute_command(
p_device_,
"TriggerSoftware");
1569 if (next_time > std::chrono::system_clock::now())
1571 std::this_thread::sleep_until(next_time);
1575 ROS_WARN(
"Camera Aravis: Missed a software trigger event.");
1576 next_time = std::chrono::system_clock::now();
1579 ROS_INFO(
"Software trigger stopped.");
1585 ROS_WARN(
"Publishing dynamic camera transforms (/tf) at %g Hz", rate);
1604 ROS_INFO(
"Publishing camera diagnostics at %g Hz", rate);
1608 CameraDiagnostics camDiagnosticMsg;
1609 camDiagnosticMsg.header.frame_id =
config_.frame_id;
1612 auto getFeatureValueAsStrFn = [&](
const std::string& name,
const std::string& type)
1615 std::string valueStr =
"";
1617 if (type ==
"float")
1619 valueStr = std::to_string(arv_device_get_float_feature_value(
p_device_, name.c_str()));
1621 else if (type ==
"int")
1623 valueStr = std::to_string(arv_device_get_integer_feature_value(
p_device_, name.c_str()));
1625 else if (type ==
"bool")
1627 valueStr = arv_device_get_boolean_feature_value(
p_device_, name.c_str()) ?
"true" :
"false";
1631 const char* retFeatVal = arv_device_get_string_feature_value(
p_device_, name.c_str());
1632 valueStr = (retFeatVal) ? std::string(retFeatVal) :
"";
1639 auto setFeatureValueFromStrFn = [&](
const std::string& name,
const std::string& type,
1640 const std::string& valueStr)
1642 if (type ==
"float")
1643 arv_device_set_float_feature_value(
p_device_, name.c_str(), std::stod(valueStr));
1644 else if (type ==
"int")
1645 arv_device_set_integer_feature_value(
p_device_, name.c_str(), std::stoi(valueStr));
1646 else if (type ==
"bool")
1647 arv_device_set_boolean_feature_value(
p_device_, name.c_str(),
1648 (valueStr ==
"true" || valueStr ==
"True" || valueStr ==
"TRUE"));
1650 arv_device_set_string_feature_value(
p_device_, name.c_str(), valueStr.c_str());
1656 ++camDiagnosticMsg.header.seq;
1658 camDiagnosticMsg.data.clear();
1663 std::string featureName = featureDict[
"FeatureName"].IsDefined()
1664 ? featureDict[
"FeatureName"].as<std::string>()
1666 std::string featureType = featureDict[
"Type"].IsDefined()
1667 ? featureDict[
"Type"].as<std::string>()
1670 if (featureName.empty() || featureType.empty())
1673 "Diagnostic feature at index %i does not have a field 'FeatureName' or 'Type'.",
1680 std::transform(featureType.begin(), featureType.end(), featureType.begin(),
1682 { return std::tolower(c); });
1688 diagnostic_msgs::KeyValue kvPair;
1691 if (featureDict[
"Selectors"].IsDefined() && featureDict[
"Selectors"].size() > 0)
1693 int selectorIdx = 1;
1694 for (
auto selectorDict : featureDict[
"Selectors"])
1696 std::string selectorFeatureName = selectorDict[
"FeatureName"].IsDefined()
1697 ? selectorDict[
"FeatureName"].as<std::string>()
1699 std::string selectorType = selectorDict[
"Type"].IsDefined()
1700 ? selectorDict[
"Type"].as<std::string>()
1702 std::string selectorValue = selectorDict[
"Value"].IsDefined()
1703 ? selectorDict[
"Value"].as<std::string>()
1706 if (selectorFeatureName.empty() || selectorType.empty() || selectorValue.empty())
1709 "Diagnostic feature selector at index %i of feature at index %i does not have a "
1710 "field 'FeatureName', 'Type' or 'Value'.",
1711 selectorIdx, featureIdx);
1719 setFeatureValueFromStrFn(selectorFeatureName, selectorType, selectorValue);
1721 kvPair.key = featureName +
"-" + selectorValue;
1722 kvPair.value = getFeatureValueAsStrFn(featureName, featureType);
1724 camDiagnosticMsg.data.push_back(diagnostic_msgs::KeyValue(kvPair));
1728 ROS_WARN_ONCE(
"Diagnostic feature selector with name '%s' is not implemented.",
1729 selectorFeatureName.c_str());
1738 kvPair.key = featureName;
1739 kvPair.value = getFeatureValueAsStrFn(featureName, featureType);
1741 camDiagnosticMsg.data.push_back(diagnostic_msgs::KeyValue(kvPair));
1746 ROS_WARN_ONCE(
"Diagnostic feature with name '%s' is not implemented.",
1747 featureName.c_str());
1767 ArvGc* gc = arv_device_get_genicam(
p_device_);
1771 std::list<ArvDomNode*> todo;
1772 todo.push_front((ArvDomNode*)arv_gc_get_node(gc,
"Root"));
1774 while (!todo.empty())
1777 ArvDomNode* node = todo.front();
1779 const std::string name(arv_dom_node_get_node_name(node));
1784 if (name.compare(
"pInvalidator") == 0)
1788 ArvDomNode* inode = (ArvDomNode*)arv_gc_get_node(gc,
1789 arv_dom_node_get_node_value(arv_dom_node_get_first_child(node)));
1791 todo.push_front(inode);
1796 if (ARV_IS_GC_FEATURE_NODE(node))
1799 ArvGcFeatureNode* fnode = ARV_GC_FEATURE_NODE(node);
1800 const std::string fname(arv_gc_feature_node_get_name(fnode));
1801 const bool usable = arv_gc_feature_node_is_available(fnode, NULL) && arv_gc_feature_node_is_implemented(fnode, NULL);
1815 ArvDomNodeList* children = arv_dom_node_get_child_nodes(node);
1816 const uint l = arv_dom_node_list_get_length(children);
1817 for (uint i = 0; i < l; ++i)
1819 todo.push_front(arv_dom_node_list_get_item(children, i));
1826 size_t array_start = 0;
1827 size_t array_end = in_arg_string.length();
1828 if (array_start != std::string::npos && array_end != std::string::npos)
1831 std::stringstream ss(in_arg_string.substr(array_start, array_end - array_start));
1835 getline(ss, temp,
',');
1836 boost::trim_left(temp);
1837 boost::trim_right(temp);
1838 out_args.push_back(temp);
1844 out_args.push_back(in_arg_string);
1861 ArvGcNode* p_gc_node;
1862 GError* error = NULL;
1868 for (iter = xml_rpc_params.
begin(); iter != xml_rpc_params.
end(); iter++)
1870 std::string key = iter->first;
1872 p_gc_node = arv_device_get_feature(
p_device_, key.c_str());
1873 if (p_gc_node && arv_gc_feature_node_is_implemented(ARV_GC_FEATURE_NODE(p_gc_node), &error))
1879 switch (iter->second.getType())
1883 int value = (bool)iter->second;
1884 arv_device_set_integer_feature_value(
p_device_, key.c_str(), value);
1885 ROS_INFO(
"Read parameter (bool) %s: %d", key.c_str(), value);
1891 int value = (int)iter->second;
1892 arv_device_set_integer_feature_value(
p_device_, key.c_str(), value);
1893 ROS_INFO(
"Read parameter (int) %s: %d", key.c_str(), value);
1899 double value = (double)iter->second;
1900 arv_device_set_float_feature_value(
p_device_, key.c_str(), value);
1901 ROS_INFO(
"Read parameter (float) %s: %f", key.c_str(), value);
1907 std::string value = (std::string)iter->second;
1908 arv_device_set_string_feature_value(
p_device_, key.c_str(), value.c_str());
1909 ROS_INFO(
"Read parameter (string) %s: %s", key.c_str(), value.c_str());
1919 ROS_WARN(
"Unhandled rosparam type in writeCameraFeaturesFromRosparam()");
1928 nodelet::NodeletUnload unload_service;
1929 unload_service.request.name = this->
getName();