mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-18 17:43:54 +08:00
camerad: remove webcam + replay cameras (#24554)
* camerad: remove replay camera
* remove webcam + fix AE tests
old-commit-hash: b4091847df
This commit is contained in:
@@ -301,8 +301,6 @@ selfdrive/camerad/snapshot/*
|
||||
selfdrive/camerad/include/*
|
||||
selfdrive/camerad/cameras/camera_common.h
|
||||
selfdrive/camerad/cameras/camera_common.cc
|
||||
selfdrive/camerad/cameras/camera_replay.cc
|
||||
selfdrive/camerad/cameras/camera_replay.h
|
||||
selfdrive/camerad/cameras/sensor2_i2c.h
|
||||
|
||||
selfdrive/camerad/transforms/rgb_to_yuv.cc
|
||||
|
||||
@@ -2,39 +2,18 @@ Import('env', 'arch', 'cereal', 'messaging', 'common', 'gpucommon', 'visionipc',
|
||||
|
||||
libs = ['m', 'pthread', common, 'jpeg', 'OpenCL', 'yuv', cereal, messaging, 'zmq', 'capnp', 'kj', visionipc, gpucommon]
|
||||
|
||||
cameras = []
|
||||
if arch == "larch64":
|
||||
libs += ['atomic']
|
||||
cameras = ['cameras/camera_qcom2.cc']
|
||||
else:
|
||||
env['CXXFLAGS'] += ["-Wno-deprecated-declarations"]
|
||||
if USE_WEBCAM:
|
||||
libs += ['opencv_core', 'opencv_highgui', 'opencv_imgproc', 'opencv_videoio']
|
||||
cameras = ['cameras/camera_webcam.cc']
|
||||
env = env.Clone()
|
||||
env.Append(CXXFLAGS = '-DWEBCAM')
|
||||
env.Append(CFLAGS = '-DWEBCAM')
|
||||
env.Append(CPPPATH = ['/usr/include/opencv4', '/usr/local/include/opencv4'])
|
||||
else:
|
||||
libs += ['avutil', 'avcodec', 'avformat', 'bz2', 'ssl', 'curl', 'crypto']
|
||||
# TODO: import replay_lib from root SConstruct
|
||||
cameras = ['cameras/camera_replay.cc',
|
||||
env.Object('camera-util', '#/selfdrive/ui/replay/util.cc'),
|
||||
env.Object('camera-framereader', '#/selfdrive/ui/replay/framereader.cc'),
|
||||
env.Object('camera-filereader', '#/selfdrive/ui/replay/filereader.cc')]
|
||||
|
||||
if arch == "Darwin":
|
||||
del libs[libs.index('OpenCL')]
|
||||
del libs[libs.index(gpucommon)][gpucommon.index('GL')]
|
||||
env = env.Clone()
|
||||
env['FRAMEWORKS'] = ['OpenCL', 'OpenGL']
|
||||
|
||||
env.Program('camerad', [
|
||||
'main.cc',
|
||||
'cameras/camera_common.cc',
|
||||
'transforms/rgb_to_yuv.cc',
|
||||
'imgproc/utils.cc',
|
||||
cameras,
|
||||
], LIBS=libs)
|
||||
env.Program('camerad', [
|
||||
'main.cc',
|
||||
'cameras/camera_common.cc',
|
||||
'transforms/rgb_to_yuv.cc',
|
||||
'imgproc/utils.cc',
|
||||
cameras,
|
||||
], LIBS=libs)
|
||||
|
||||
if GetOption("test"):
|
||||
env.Program('test/ae_gray_test', [
|
||||
|
||||
@@ -17,13 +17,11 @@
|
||||
#include "common/util.h"
|
||||
#include "selfdrive/hardware/hw.h"
|
||||
|
||||
#if QCOM2
|
||||
#ifdef QCOM2
|
||||
#include "CL/cl_ext_qcom.h"
|
||||
#include "selfdrive/camerad/cameras/camera_qcom2.h"
|
||||
#elif WEBCAM
|
||||
#include "selfdrive/camerad/cameras/camera_webcam.h"
|
||||
#else
|
||||
#include "selfdrive/camerad/cameras/camera_replay.h"
|
||||
#include "selfdrive/camerad/test/camera_test.h"
|
||||
#endif
|
||||
|
||||
ExitHandler do_exit;
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "selfdrive/camerad/cameras/camera_common.h"
|
||||
#include "selfdrive/ui/replay/framereader.h"
|
||||
|
||||
#define FRAME_BUF_COUNT 16
|
||||
|
||||
typedef struct CameraState {
|
||||
int camera_num;
|
||||
CameraInfo ci;
|
||||
|
||||
int fps;
|
||||
float digital_gain = 0;
|
||||
|
||||
CameraBuf buf;
|
||||
FrameReader *frame = nullptr;
|
||||
} CameraState;
|
||||
|
||||
typedef struct MultiCameraState {
|
||||
CameraState road_cam;
|
||||
CameraState driver_cam;
|
||||
|
||||
SubMaster *sm = nullptr;
|
||||
PubMaster *pm = nullptr;
|
||||
} MultiCameraState;
|
||||
@@ -1,197 +0,0 @@
|
||||
#include "selfdrive/camerad/cameras/camera_webcam.h"
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wundefined-inline"
|
||||
#include <opencv2/core.hpp>
|
||||
#include <opencv2/highgui.hpp>
|
||||
#include <opencv2/opencv.hpp>
|
||||
#include <opencv2/videoio.hpp>
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
#include "common/clutil.h"
|
||||
#include "common/swaglog.h"
|
||||
#include "common/timing.h"
|
||||
#include "common/util.h"
|
||||
|
||||
// id of the video capturing device
|
||||
const int ROAD_CAMERA_ID = util::getenv("ROADCAM_ID", 1);
|
||||
const int DRIVER_CAMERA_ID = util::getenv("DRIVERCAM_ID", 2);
|
||||
|
||||
#define FRAME_WIDTH 1164
|
||||
#define FRAME_HEIGHT 874
|
||||
#define FRAME_WIDTH_FRONT 1152
|
||||
#define FRAME_HEIGHT_FRONT 864
|
||||
|
||||
extern ExitHandler do_exit;
|
||||
|
||||
namespace {
|
||||
|
||||
CameraInfo cameras_supported[CAMERA_ID_MAX] = {
|
||||
// road facing
|
||||
[CAMERA_ID_LGC920] = {
|
||||
.frame_width = FRAME_WIDTH,
|
||||
.frame_height = FRAME_HEIGHT,
|
||||
.frame_stride = FRAME_WIDTH*3,
|
||||
.bayer = false,
|
||||
.bayer_flip = false,
|
||||
},
|
||||
// driver facing
|
||||
[CAMERA_ID_LGC615] = {
|
||||
.frame_width = FRAME_WIDTH_FRONT,
|
||||
.frame_height = FRAME_HEIGHT_FRONT,
|
||||
.frame_stride = FRAME_WIDTH_FRONT*3,
|
||||
.bayer = false,
|
||||
.bayer_flip = false,
|
||||
},
|
||||
};
|
||||
|
||||
void camera_open(CameraState *s, bool rear) {
|
||||
// empty
|
||||
}
|
||||
|
||||
void camera_close(CameraState *s) {
|
||||
// empty
|
||||
}
|
||||
|
||||
void camera_init(VisionIpcServer * v, CameraState *s, int camera_id, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type) {
|
||||
assert(camera_id < std::size(cameras_supported));
|
||||
s->ci = cameras_supported[camera_id];
|
||||
assert(s->ci.frame_width != 0);
|
||||
|
||||
s->camera_num = camera_id;
|
||||
s->fps = fps;
|
||||
s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type);
|
||||
}
|
||||
|
||||
void run_camera(CameraState *s, cv::VideoCapture &video_cap, float *ts) {
|
||||
assert(video_cap.isOpened());
|
||||
|
||||
cv::Size size(s->ci.frame_width, s->ci.frame_height);
|
||||
const cv::Mat transform = cv::Mat(3, 3, CV_32F, ts);
|
||||
uint32_t frame_id = 0;
|
||||
size_t buf_idx = 0;
|
||||
|
||||
while (!do_exit) {
|
||||
cv::Mat frame_mat, transformed_mat;
|
||||
video_cap >> frame_mat;
|
||||
if (frame_mat.empty()) continue;
|
||||
|
||||
cv::warpPerspective(frame_mat, transformed_mat, transform, size, cv::INTER_LINEAR, cv::BORDER_CONSTANT, 0);
|
||||
|
||||
s->buf.camera_bufs_metadata[buf_idx] = {.frame_id = frame_id};
|
||||
|
||||
auto &buf = s->buf.camera_bufs[buf_idx];
|
||||
int transformed_size = transformed_mat.total() * transformed_mat.elemSize();
|
||||
CL_CHECK(clEnqueueWriteBuffer(buf.copy_q, buf.buf_cl, CL_TRUE, 0, transformed_size, transformed_mat.data, 0, NULL, NULL));
|
||||
|
||||
s->buf.queue(buf_idx);
|
||||
|
||||
++frame_id;
|
||||
buf_idx = (buf_idx + 1) % FRAME_BUF_COUNT;
|
||||
}
|
||||
}
|
||||
|
||||
static void road_camera_thread(CameraState *s) {
|
||||
util::set_thread_name("webcam_road_camera_thread");
|
||||
|
||||
cv::VideoCapture cap_road(ROAD_CAMERA_ID, cv::CAP_V4L2); // road
|
||||
cap_road.set(cv::CAP_PROP_FRAME_WIDTH, 853);
|
||||
cap_road.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
|
||||
cap_road.set(cv::CAP_PROP_FPS, s->fps);
|
||||
cap_road.set(cv::CAP_PROP_AUTOFOCUS, 0); // off
|
||||
cap_road.set(cv::CAP_PROP_FOCUS, 0); // 0 - 255?
|
||||
// cv::Rect roi_rear(160, 0, 960, 720);
|
||||
|
||||
// transforms calculation see tools/webcam/warp_vis.py
|
||||
float ts[9] = {1.50330396, 0.0, -59.40969163,
|
||||
0.0, 1.50330396, 76.20704846,
|
||||
0.0, 0.0, 1.0};
|
||||
// if camera upside down:
|
||||
// float ts[9] = {-1.50330396, 0.0, 1223.4,
|
||||
// 0.0, -1.50330396, 797.8,
|
||||
// 0.0, 0.0, 1.0};
|
||||
|
||||
run_camera(s, cap_road, ts);
|
||||
}
|
||||
|
||||
void driver_camera_thread(CameraState *s) {
|
||||
cv::VideoCapture cap_driver(DRIVER_CAMERA_ID, cv::CAP_V4L2); // driver
|
||||
cap_driver.set(cv::CAP_PROP_FRAME_WIDTH, 853);
|
||||
cap_driver.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
|
||||
cap_driver.set(cv::CAP_PROP_FPS, s->fps);
|
||||
// cv::Rect roi_front(320, 0, 960, 720);
|
||||
|
||||
// transforms calculation see tools/webcam/warp_vis.py
|
||||
float ts[9] = {1.42070485, 0.0, -30.16740088,
|
||||
0.0, 1.42070485, 91.030837,
|
||||
0.0, 0.0, 1.0};
|
||||
// if camera upside down:
|
||||
// float ts[9] = {-1.42070485, 0.0, 1182.2,
|
||||
// 0.0, -1.42070485, 773.0,
|
||||
// 0.0, 0.0, 1.0};
|
||||
run_camera(s, cap_driver, ts);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) {
|
||||
camera_init(v, &s->road_cam, CAMERA_ID_LGC920, 20, device_id, ctx,
|
||||
VISION_STREAM_RGB_ROAD, VISION_STREAM_ROAD);
|
||||
camera_init(v, &s->driver_cam, CAMERA_ID_LGC615, 10, device_id, ctx,
|
||||
VISION_STREAM_RGB_DRIVER, VISION_STREAM_DRIVER);
|
||||
s->pm = new PubMaster({"roadCameraState", "driverCameraState", "thumbnail"});
|
||||
}
|
||||
|
||||
void camera_autoexposure(CameraState *s, float grey_frac) {}
|
||||
|
||||
void cameras_open(MultiCameraState *s) {
|
||||
// LOG("*** open driver camera ***");
|
||||
camera_open(&s->driver_cam, false);
|
||||
// LOG("*** open road camera ***");
|
||||
camera_open(&s->road_cam, true);
|
||||
}
|
||||
|
||||
void cameras_close(MultiCameraState *s) {
|
||||
camera_close(&s->road_cam);
|
||||
camera_close(&s->driver_cam);
|
||||
delete s->pm;
|
||||
}
|
||||
|
||||
void process_driver_camera(MultiCameraState *s, CameraState *c, int cnt) {
|
||||
MessageBuilder msg;
|
||||
auto framed = msg.initEvent().initDriverCameraState();
|
||||
framed.setFrameType(cereal::FrameData::FrameType::FRONT);
|
||||
fill_frame_data(framed, c->buf.cur_frame_data);
|
||||
s->pm->send("driverCameraState", msg);
|
||||
}
|
||||
|
||||
void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) {
|
||||
const CameraBuf *b = &c->buf;
|
||||
MessageBuilder msg;
|
||||
auto framed = msg.initEvent().initRoadCameraState();
|
||||
fill_frame_data(framed, b->cur_frame_data);
|
||||
framed.setImage(kj::arrayPtr((const uint8_t *)b->cur_yuv_buf->addr, b->cur_yuv_buf->len));
|
||||
framed.setTransform(b->yuv_transform.v);
|
||||
s->pm->send("roadCameraState", msg);
|
||||
}
|
||||
|
||||
void cameras_run(MultiCameraState *s) {
|
||||
std::vector<std::thread> threads;
|
||||
threads.push_back(start_process_thread(s, &s->road_cam, process_road_camera));
|
||||
threads.push_back(start_process_thread(s, &s->driver_cam, process_driver_camera));
|
||||
|
||||
std::thread t_rear = std::thread(road_camera_thread, &s->road_cam);
|
||||
util::set_thread_name("webcam_thread");
|
||||
driver_camera_thread(&s->driver_cam);
|
||||
|
||||
t_rear.join();
|
||||
|
||||
for (auto &t : threads) t.join();
|
||||
|
||||
cameras_close(s);
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl.h>
|
||||
#else
|
||||
#include <CL/cl.h>
|
||||
#endif
|
||||
|
||||
#include "selfdrive/camerad/cameras/camera_common.h"
|
||||
|
||||
#define FRAME_BUF_COUNT 16
|
||||
|
||||
typedef struct CameraState {
|
||||
CameraInfo ci;
|
||||
int camera_num;
|
||||
int fps;
|
||||
float digital_gain;
|
||||
CameraBuf buf;
|
||||
} CameraState;
|
||||
|
||||
|
||||
typedef struct MultiCameraState {
|
||||
CameraState road_cam;
|
||||
CameraState driver_cam;
|
||||
|
||||
SubMaster *sm;
|
||||
PubMaster *pm;
|
||||
} MultiCameraState;
|
||||
@@ -10,12 +10,6 @@
|
||||
#include "common/util.h"
|
||||
#include "selfdrive/camerad/cameras/camera_common.h"
|
||||
|
||||
// needed by camera_common.cc
|
||||
void camera_autoexposure(CameraState *s, float grey_frac) {}
|
||||
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) {}
|
||||
void cameras_open(MultiCameraState *s) {}
|
||||
void cameras_run(MultiCameraState *s) {}
|
||||
|
||||
int main() {
|
||||
// set up fake camerabuf
|
||||
CameraBuf cb = {};
|
||||
|
||||
26
selfdrive/camerad/test/camera_test.h
Normal file
26
selfdrive/camerad/test/camera_test.h
Normal file
@@ -0,0 +1,26 @@
|
||||
// TODO: cleanup AE tests
|
||||
// needed by camera_common.cc
|
||||
void camera_autoexposure(CameraState *s, float grey_frac) {}
|
||||
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) {}
|
||||
void cameras_open(MultiCameraState *s) {}
|
||||
void cameras_run(MultiCameraState *s) {}
|
||||
|
||||
typedef struct CameraState {
|
||||
int camera_num;
|
||||
CameraInfo ci;
|
||||
|
||||
int fps;
|
||||
float digital_gain = 0;
|
||||
|
||||
CameraBuf buf;
|
||||
} CameraState;
|
||||
|
||||
typedef struct MultiCameraState {
|
||||
CameraState road_cam;
|
||||
CameraState driver_cam;
|
||||
|
||||
SubMaster *sm = nullptr;
|
||||
PubMaster *pm = nullptr;
|
||||
} MultiCameraState;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user