mirror of
https://github.com/karma-riuk/hdr_esim.git
synced 2024-11-22 14:17:50 +01:00
Created Creating your own publisher (markdown)
parent
d34e3247e5
commit
f868d10edc
124
Creating-your-own-publisher.md
Normal file
124
Creating-your-own-publisher.md
Normal file
@ -0,0 +1,124 @@
|
||||
This page explains how to write your own publisher for ESIM.
|
||||
This will enable you to control exactly how you want the simulated data to be saved on disk (events, images, camera poses, etc.).
|
||||
|
||||
As a simple example, we will write our own publisher, which will simply write all the simulated events into a text file (and ignore all the other measurements).
|
||||
|
||||
Here are the steps to follow:
|
||||
|
||||
- Write your own `TextFilePublisher` C++ class implementing the [`Publisher`](https://github.com/uzh-rpg/rpg_esim/blob/master/event_camera_simulator/esim_visualization/include/esim/visualization/publisher_interface.hpp#L8) interface by creating the two files below.
|
||||
|
||||
Header `esim_visualization/include/esim/visualization/text_file_publisher.hpp`:
|
||||
|
||||
```cpp
|
||||
#pragma once
|
||||
|
||||
#include <esim/common/types.hpp>
|
||||
#include <esim/visualization/publisher_interface.hpp>
|
||||
#include <fstream>
|
||||
|
||||
namespace event_camera_simulator {
|
||||
|
||||
class TextFilePublisher : public Publisher
|
||||
{
|
||||
public:
|
||||
TextFilePublisher(const std::string& path_to_events_text_file, size_t num_cameras);
|
||||
~TextFilePublisher();
|
||||
|
||||
virtual void eventsCallback(const EventsVector& events) override; // will be called when new events are available
|
||||
|
||||
static Publisher::Ptr createFromGflags(size_t num_cameras);
|
||||
|
||||
|
||||
private:
|
||||
size_t num_cameras_;
|
||||
std::vector<cv::Size> sensor_sizes_;
|
||||
std::ofstream events_text_file_;
|
||||
};
|
||||
|
||||
} // namespace event_camera_simulator
|
||||
```
|
||||
|
||||
C++ file (`esim/visualization/src/text_file_publisher.cpp`):
|
||||
|
||||
```cpp
|
||||
#include <esim/visualization/text_file_publisher.hpp>
|
||||
#include <esim/common/utils.hpp>
|
||||
|
||||
#include <gflags/gflags.h>
|
||||
#include <glog/logging.h>
|
||||
|
||||
DEFINE_string(path_to_events_text_file, "",
|
||||
"Path to the text file in which to write the events.");
|
||||
|
||||
namespace event_camera_simulator {
|
||||
|
||||
TextFilePublisher::TextFilePublisher(const std::string& path_to_events_text_file, size_t num_cameras)
|
||||
{
|
||||
CHECK_EQ(num_cameras, 1) << "TextFilePublisher implemented for one camera only";
|
||||
events_text_file_.open(path_to_events_text_file);
|
||||
}
|
||||
|
||||
TextFilePublisher::~TextFilePublisher()
|
||||
{
|
||||
events_text_file_.close();
|
||||
}
|
||||
|
||||
Publisher::Ptr TextFilePublisher::createFromGflags(size_t num_cameras)
|
||||
{
|
||||
if(FLAGS_path_to_events_text_file == "")
|
||||
{
|
||||
LOG(WARNING) << "Empty events text file path: will not write events to a text file.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return std::make_shared<TextFilePublisher>(FLAGS_path_to_events_text_file,
|
||||
num_cameras);
|
||||
}
|
||||
|
||||
void TextFilePublisher::eventsCallback(const EventsVector& events)
|
||||
{
|
||||
CHECK_EQ(events.size(), 1);
|
||||
for(const Event& e : events[0])
|
||||
{
|
||||
events_text_file_ << e.t << " " << e.x << " " << e.y << " " << e.pol << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace event_camera_simulator
|
||||
```
|
||||
|
||||
- Add these two files to the [CMakeLists.txt](https://github.com/uzh-rpg/rpg_esim/blob/master/event_camera_simulator/esim_visualization/CMakeLists.txt) in the `esim_visualization` package:
|
||||
|
||||
```
|
||||
set(HEADERS
|
||||
...
|
||||
include/esim/visualization/text_file_publisher.hpp
|
||||
)
|
||||
|
||||
set(SOURCES
|
||||
...
|
||||
src/text_file_publisher.cpp
|
||||
)
|
||||
```
|
||||
|
||||
- Register the new publisher in [this file](https://github.com/uzh-rpg/rpg_esim/blob/master/event_camera_simulator/esim_ros/src/esim_node.cpp), e.g. like this:
|
||||
```cpp
|
||||
Publisher::Ptr my_publisher = TextFilePublisher::createFromGflags(data_provider_->numCameras());
|
||||
if(my_publisher) sim->addPublisher(my_publisher);
|
||||
```
|
||||
|
||||
Do not forget to include the new header file at the top of `esim_node.cpp`:
|
||||
```cpp
|
||||
#include <esim/visualization/text_file_publisher.hpp>
|
||||
```
|
||||
|
||||
- Now, recompile ESIM: `catkin build esim_ros`.
|
||||
|
||||
- You can now run ESIM, setting the path to the event file as a flag:
|
||||
```rosrun esim_ros esim_node --flagfile=cfg/example.conf --path_to_events_text_file=/tmp/events.txt```
|
||||
|
||||
The events will now be written to the text file at: `/tmp/events.txt`!
|
||||
|
||||
### Next steps
|
||||
|
||||
Now that you know how to write your own publisher, try to implement the other callback functions (e.g. `image_callback()`, etc.) to save more measurements to disk!
|
Loading…
Reference in New Issue
Block a user