Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions camera/camera_balsaq.cc
Original file line number Diff line number Diff line change
@@ -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 <cstddef>
#include <iostream>
Expand Down Expand Up @@ -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::string>() << std::endl;
const Camera camera = camera_manager_.get_camera(config["serial_number"].as<std::string>());
camera_serial_number_ = camera.serial_number;
std::cout << "Camera BQ: camera serial " << config["serial_number"].as<std::string>() << std::endl;
cap = cv::VideoCapture(camera.video_index);

camera_config_ = generate_capture_config(config);
Expand All @@ -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)) {
Expand All @@ -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");
Expand Down
14 changes: 9 additions & 5 deletions camera/camera_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<YAML::Node> config = read_YAML(filename);
Expand All @@ -45,10 +45,14 @@ std::optional<Camera> CameraManager::parse_config(const YAML::Node& cfg) const {
// path & video index
camera.serial_number = cfg["serial_number"].as<std::string>();
camera.v4l_path = "/dev/v4l/by-id/" + cfg["v4l_path"].as<std::string>();
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<double> camera_matrix_values = cfg["camera_matrix"].as<std::vector<double>>();
camera.calibration.camera_matrix = cv::Mat(3, 3, CV_64F, camera_matrix_values.data()).clone();
Expand All @@ -62,9 +66,9 @@ std::optional<int> 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;
}
}

Expand Down
2 changes: 1 addition & 1 deletion config/hoverjet/camera.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 3 additions & 3 deletions config/supervisor/supervisor.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion infrastructure/logging/message_logger_bq.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ void MessageLoggerBQ::init(const Config& config) {
assert(config["log_base_path"]);

// Load log channels
const std::vector<std::string> logged_channels = config["logged_channels"].as<std::vector<std::string>>();
channels_ = config["logged_channels"].as<std::vector<std::string>>();
const std::string log_base_path = config["log_base_path"].as<std::string>();

// Generate a log name. Log name will be the UTC date and time in the format YYYYMMDDHHMMSS
Expand Down