diff --git a/camera/camera_balsaq.cc b/camera/camera_balsaq.cc index 0afefdb..4f4c73c 100644 --- a/camera/camera_balsaq.cc +++ b/camera/camera_balsaq.cc @@ -1,8 +1,8 @@ //%bin(camera_balsaq_main) #include "camera/camera_balsaq.hh" +#include "camera/camera_manager.hh" #include "infrastructure/balsa_queue/bq_main_macro.hh" #include "infrastructure/time/duration.hh" -#include "camera/camera_manager.hh" #include #include @@ -38,9 +38,9 @@ CameraConfiguration generate_capture_config(const Config& config) { } // namespace void CameraBq::init(const Config& config) { + std::cout << "Camera BQ: camera serial " << config["serial_number"].as() << std::endl; const Camera camera = camera_manager_.get_camera(config["serial_number"].as()); camera_serial_number_ = camera.serial_number; - std::cout << "Camera BQ: camera serial " << config["serial_number"].as() << std::endl; cap = cv::VideoCapture(camera.video_index); camera_config_ = generate_capture_config(config); @@ -57,8 +57,11 @@ void CameraBq::loop() { std::cout << "Camera BQ: trying to get a frame" << std::endl; cap.set(cv::CAP_PROP_AUTOFOCUS, camera_config_.auto_focus); - cap.set(cv::CAP_PROP_AUTO_EXPOSURE, camera_config_.auto_exposure); - cap.set(cv::CAP_PROP_EXPOSURE, camera_config_.exposure); + // TODO(jpanikulam): Figure out why opencv won't let us + // set CAP_PROP_AUTO_EXPOSURE, or CAP_PROP_EXPOSURE + // --> Consider just using v4l2-ctl + // cap.set(cv::CAP_PROP_AUTO_EXPOSURE, camera_config_.auto_exposure); + // cap.set(cv::CAP_PROP_EXPOSURE, camera_config_.exposure); const auto current_time = get_current_time(); if (cap.read(camera_frame)) { @@ -76,7 +79,10 @@ void CameraBq::loop() { message.width = camera_frame.size().width; message.camera_serial_number = camera_serial_number_; publisher_->publish(message); - std::cout << "Camera BQ: publishes a camera frame " << message.width << " " << message.height << std::endl; + + std::stringstream go_msg; + go_msg << "Camera BQ: publishes a camera frame " << message.width << " " << message.height << std::endl; + gonogo().go(go_msg.str()); } if (last_msg_recvd_timestamp_ < get_current_time() - Duration::from_seconds(1)) { gonogo().nogo("More than 1 second since last camera frame"); diff --git a/camera/camera_manager.cc b/camera/camera_manager.cc index 4333b1c..a0c95e5 100644 --- a/camera/camera_manager.cc +++ b/camera/camera_manager.cc @@ -20,7 +20,7 @@ void CameraManager::load_configs() { const std::string config_dir = "/jet/camera/cfg"; for (const auto & entry : fs::directory_iterator(config_dir)) { const std::string filename = entry.path(); - if (filename == "." || filename == ".."){ + if (filename == "." || filename == ".."){ continue; } std::optional config = read_YAML(filename); @@ -45,10 +45,14 @@ std::optional CameraManager::parse_config(const YAML::Node& cfg) const { // path & video index camera.serial_number = cfg["serial_number"].as(); camera.v4l_path = "/dev/v4l/by-id/" + cfg["v4l_path"].as(); - camera.video_index = *follow_v4l_path(camera.v4l_path); - if (!camera.video_index) { + + const auto maybe_video_index = follow_v4l_path(camera.v4l_path); + if (maybe_video_index) { + std::cout << "Failed to camera index" << std::endl; return std::nullopt; } + + camera.video_index = *maybe_video_index; // calibration values std::vector camera_matrix_values = cfg["camera_matrix"].as>(); camera.calibration.camera_matrix = cv::Mat(3, 3, CV_64F, camera_matrix_values.data()).clone(); @@ -62,9 +66,9 @@ std::optional CameraManager::follow_v4l_path(const std::string& path) const const std::string v4l_path = fs::canonical(path, ec).string(); const int index = v4l_path.back() - '0'; // note that this will break for >10 cameras if (ec) { - return std::nullopt; - } else { return index; + } else { + return std::nullopt; } } diff --git a/config/hoverjet/camera.yaml b/config/hoverjet/camera.yaml index a0dc610..b4e9ed7 100644 --- a/config/hoverjet/camera.yaml +++ b/config/hoverjet/camera.yaml @@ -7,7 +7,7 @@ auto_focus: 0 # Disables autoexposure...allegedly? auto_exposure: 0.25 # Set a fixed exposure (The minimum) -webcam_exposure: 0.1 +webcam_exposure: 0.01 # Calling our shots: The camera we expect to be running serial_number: 5CFD076E diff --git a/config/supervisor/supervisor.conf b/config/supervisor/supervisor.conf index b1498df..af7eaf6 100644 --- a/config/supervisor/supervisor.conf +++ b/config/supervisor/supervisor.conf @@ -26,7 +26,7 @@ stdout_logfile = /var/log/supervisord/turbine_interface-stdout.log stopsignal=INT [program:logger] -command=/jet/bin/run/message_logger_bq_main config/hoverjet/logger.yaml +command=/jet/bin/run/message_logger_bq_main /jet/config/hoverjet/logger.yaml stderr_logfile = /var/log/supervisord/logger-stderr.log stdout_logfile = /var/log/supervisord/logger-stdout.log stopsignal=INT @@ -44,13 +44,13 @@ stdout_logfile = /var/log/supervisord/imu-stdout.log stopsignal=INT [program:servo_interface] -command=/jet/run/servo_balsaq_main /jet/embedded/servo_driver/cfg/servo_configs.yaml +command=/jet/bin/run/servo_balsaq_main /jet/embedded/servo_driver/cfg/servo_configs.yaml stderr_logfile = /var/log/supervisord/servo_interface-stderr.log stdout_logfile = /var/log/supervisord/servo_interface-stdout.log stopsignal=INT [program:camera] -command=/jet/run/camera_balsaq_main /jet/camera/cfg/camera_config_0.yaml +command=/jet/bin/run/camera_balsaq_main /jet/config/hoverjet/logger.yaml stderr_logfile = /var/log/supervisord/camera-stderr.log stdout_logfile = /var/log/supervisord/camera-stdout.log stopsignal=INT diff --git a/infrastructure/logging/message_logger_bq.cc b/infrastructure/logging/message_logger_bq.cc index 5d536d0..31d6920 100644 --- a/infrastructure/logging/message_logger_bq.cc +++ b/infrastructure/logging/message_logger_bq.cc @@ -19,7 +19,7 @@ void MessageLoggerBQ::init(const Config& config) { assert(config["log_base_path"]); // Load log channels - const std::vector logged_channels = config["logged_channels"].as>(); + channels_ = config["logged_channels"].as>(); const std::string log_base_path = config["log_base_path"].as(); // Generate a log name. Log name will be the UTC date and time in the format YYYYMMDDHHMMSS