Skip to content
Snippets Groups Projects
Commit 42a1bb19 authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Working group code

parent 2dcd2043
No related branches found
No related tags found
1 merge request!70Implements #58 rgbd groups
Pipeline #12388 failed
...@@ -176,6 +176,7 @@ add_subdirectory(components/net) ...@@ -176,6 +176,7 @@ add_subdirectory(components/net)
add_subdirectory(components/rgbd-sources) add_subdirectory(components/rgbd-sources)
add_subdirectory(components/control/cpp) add_subdirectory(components/control/cpp)
add_subdirectory(applications/calibration) add_subdirectory(applications/calibration)
add_subdirectory(applications/groupview)
if (BUILD_RENDERER) if (BUILD_RENDERER)
add_subdirectory(components/renderers) add_subdirectory(components/renderers)
......
set(GVIEWSRC
src/main.cpp
)
add_executable(ftl-view ${GVIEWSRC})
target_include_directories(ftl-view PRIVATE src)
target_link_libraries(ftl-view ftlcommon ftlnet ftlrgbd Threads::Threads ${OpenCV_LIBS})
#include <loguru.hpp>
#include <ftl/configuration.hpp>
#include <ftl/net/universe.hpp>
#include <ftl/rgbd/source.hpp>
#include <ftl/rgbd/group.hpp>
int main(int argc, char **argv) {
auto root = ftl::configure(argc, argv, "viewer_default");
ftl::net::Universe *net = ftl::create<ftl::net::Universe>(root, "net");
net->start();
net->waitConnections();
auto sources = ftl::createArray<ftl::rgbd::Source>(root, "sources", net);
ftl::rgbd::Group group;
for (auto s : sources) group.addSource(s);
group.sync([](const ftl::rgbd::FrameSet &fs) {
LOG(INFO) << "Complete set: " << fs.timestamp;
return true;
});
while (ftl::running) {
std::this_thread::sleep_for(std::chrono::milliseconds(20));
for (auto s : sources) s->grab();
}
return 0;
}
...@@ -8,6 +8,7 @@ set(RGBDSRC ...@@ -8,6 +8,7 @@ set(RGBDSRC
src/net.cpp src/net.cpp
src/streamer.cpp src/streamer.cpp
src/colour.cpp src/colour.cpp
src/group.cpp
# src/algorithms/rtcensus.cpp # src/algorithms/rtcensus.cpp
# src/algorithms/rtcensus_sgm.cpp # src/algorithms/rtcensus_sgm.cpp
# src/algorithms/opencv_sgbm.cpp # src/algorithms/opencv_sgbm.cpp
......
#ifndef _FTL_RGBD_GROUP_HPP_ #ifndef _FTL_RGBD_GROUP_HPP_
#define _FTL_RGBD_GROUP_HPP_ #define _FTL_RGBD_GROUP_HPP_
#include <ftl/threads.hpp>
#include <opencv2/opencv.hpp>
#include <vector> #include <vector>
namespace ftl { namespace ftl {
...@@ -27,6 +30,7 @@ class Group { ...@@ -27,6 +30,7 @@ class Group {
void addSource(ftl::rgbd::Source *); void addSource(ftl::rgbd::Source *);
void sync(int N=-1, int B=-1); void sync(int N=-1, int B=-1);
void sync(std::function<bool(const FrameSet &)>);
bool getFrames(FrameSet &, bool complete=false); bool getFrames(FrameSet &, bool complete=false);
...@@ -34,6 +38,8 @@ class Group { ...@@ -34,6 +38,8 @@ class Group {
std::vector<FrameSet> framesets_; std::vector<FrameSet> framesets_;
std::vector<Source*> sources_; std::vector<Source*> sources_;
size_t head_; size_t head_;
std::function<bool(const FrameSet &)> callback_;
MUTEX mutex_;
void _addFrameset(int64_t timestamp); void _addFrameset(int64_t timestamp);
}; };
......
...@@ -6,8 +6,8 @@ using ftl::rgbd::Source; ...@@ -6,8 +6,8 @@ using ftl::rgbd::Source;
using ftl::rgbd::kFrameBufferSize; using ftl::rgbd::kFrameBufferSize;
using std::vector; using std::vector;
Group::Group() : framesets_(kFrameBufferSize), current_(0) { Group::Group() : framesets_(kFrameBufferSize), head_(0) {
framesets_[0].timestamp = -1;
} }
Group::~Group() { Group::~Group() {
...@@ -15,15 +15,17 @@ Group::~Group() { ...@@ -15,15 +15,17 @@ Group::~Group() {
} }
void Group::addSource(ftl::rgbd::Source *src) { void Group::addSource(ftl::rgbd::Source *src) {
UNIQUE_LOCK(mutex_, lk);
size_t ix = sources_.size(); size_t ix = sources_.size();
sources_.push_back(src); sources_.push_back(src);
src->setCallback([this,ix](int64_t timestamp, const cv::Mat &rgb, const cv::Mat &depth) { src->setCallback([this,ix](int64_t timestamp, const cv::Mat &rgb, const cv::Mat &depth) {
// TODO: Lock if (timestamp == 0) return;
UNIQUE_LOCK(mutex_, lk);
if (timestamp > framesets_[head_].timestamp) { if (timestamp > framesets_[head_].timestamp) {
// Add new frameset // Add new frameset
_addFrameset(timestamp); _addFrameset(timestamp);
} else (framesets_[(head_+1)%kFrameBufferSize].timestamp > timestamp) { } else if (framesets_[(head_+1)%kFrameBufferSize].timestamp > timestamp) {
// Too old, just ditch it // Too old, just ditch it
LOG(WARNING) << "Received frame too old for buffer"; LOG(WARNING) << "Received frame too old for buffer";
return; return;
...@@ -31,12 +33,22 @@ void Group::addSource(ftl::rgbd::Source *src) { ...@@ -31,12 +33,22 @@ void Group::addSource(ftl::rgbd::Source *src) {
// Search backwards to find match // Search backwards to find match
for (size_t i=0; i<kFrameBufferSize; ++i) { for (size_t i=0; i<kFrameBufferSize; ++i) {
FrameSet &fs = framesets_[(head+kFrameBufferSize-i) % kFrameBufferSize]; FrameSet &fs = framesets_[(head_+kFrameBufferSize-i) % kFrameBufferSize];
if (fs.timestamp == timestamp) { if (fs.timestamp == timestamp) {
//LOG(INFO) << "Adding frame: " << ix << " for " << timestamp;
rgb.copyTo(fs.channel1[ix]); rgb.copyTo(fs.channel1[ix]);
depth.copyTo(fx.channel2[ix]); depth.copyTo(fs.channel2[ix]);
++fs.count; ++fs.count;
fs.mask |= (1 << ix); fs.mask |= (1 << ix);
if (callback_ && fs.count == sources_.size()) {
//LOG(INFO) << "DOING CALLBACK";
if (callback_(fs)) {
//sources_[ix]->grab();
//LOG(INFO) << "GRAB";
}
}
return; return;
} }
} }
...@@ -52,13 +64,18 @@ void Group::sync(int N, int B) { ...@@ -52,13 +64,18 @@ void Group::sync(int N, int B) {
} }
} }
void Group::sync(std::function<bool(const FrameSet &)> cb) {
callback_ = cb;
sync(-1,-1);
}
bool Group::getFrames(FrameSet &fs, bool complete) { bool Group::getFrames(FrameSet &fs, bool complete) {
// Use oldest frameset or search back until first complete set is found? // Use oldest frameset or search back until first complete set is found?
if (complete) { if (complete) {
// TODO: Lock UNIQUE_LOCK(mutex_, lk);
// Search backwards to find match // Search backwards to find match
for (size_t i=0; i<kFrameBufferSize; ++i) { for (size_t i=0; i<kFrameBufferSize; ++i) {
FrameSet &f = framesets_[(head+kFrameBufferSize-i) % kFrameBufferSize]; FrameSet &f = framesets_[(head_+kFrameBufferSize-i) % kFrameBufferSize];
if (f.count == sources_.size()) { if (f.count == sources_.size()) {
LOG(INFO) << "Complete set found"; LOG(INFO) << "Complete set found";
fs = f; // FIXME: This needs to move or copy safely... fs = f; // FIXME: This needs to move or copy safely...
...@@ -68,19 +85,27 @@ bool Group::getFrames(FrameSet &fs, bool complete) { ...@@ -68,19 +85,27 @@ bool Group::getFrames(FrameSet &fs, bool complete) {
LOG(WARNING) << "No complete frame set found"; LOG(WARNING) << "No complete frame set found";
return false; return false;
} }
return false;
} }
void Group::_addFrameset(int64_t timestamp) { void Group::_addFrameset(int64_t timestamp) {
int count = (timestamp - framesets_[head_].timestamp) / 40; int count = (framesets_[head_].timestamp == -1) ? 1 : (timestamp - framesets_[head_].timestamp) / 40;
// Must make sure to also insert missing framesets // Must make sure to also insert missing framesets
LOG(INFO) << "Adding " << count << " framesets"; //LOG(INFO) << "Adding " << count << " framesets for " << timestamp << " head=" << framesets_[head_].timestamp;
//if (count > 10 || count < 1) return;
for (int i=0; i<count; ++i) { for (int i=0; i<count; ++i) {
int64_t lt = framesets_[head_].timestamp; int64_t lt = (framesets_[head_].timestamp == -1) ? timestamp-40 : framesets_[head_].timestamp;
head_ = (head_+1) % kFrameBufferSize; head_ = (head_+1) % kFrameBufferSize;
framesets_[head_].timestamp = lt+40; framesets_[head_].timestamp = lt+40;
framesets_[head_].count = 0; framesets_[head_].count = 0;
framesets_[head_].mask = 0; framesets_[head_].mask = 0;
framesets_[head_].channel1.resize(sources_.size());
framesets_[head_].channel2.resize(sources_.size());
for (auto s : sources_) framesets_[head_].sources.push_back(s);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment