Skip to content

Commit 84257aa

Browse files
authored
Merge pull request #46 from ethz-asl/feature/offsetAndMockCuckooClock
Feature/offset and mock cuckoo clock
2 parents ef03ffd + db5d70b commit 84257aa

File tree

5 files changed

+76
-16
lines changed

5 files changed

+76
-16
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python
2+
PACKAGE='cuckoo_time_translator'
3+
4+
from dynamic_reconfigure.parameter_generator_catkin import *
5+
6+
gen = ParameterGenerator()
7+
8+
gen.add("assumedDelay", double_t, 0,
9+
"Assumed deterministic transport delay in seconds.",
10+
0, 0.0, 1)
11+
12+
gen.add("delay", double_t, 0,
13+
"Actually simulated deterministic transport delay in seconds.",
14+
0, 0.0, 1)
15+
16+
gen.add("delaySigma", double_t, 0,
17+
"Simulated random transport delay in seconds (exponential distribution with lambda=1/delaySigma).",
18+
0, 0.0, 1)
19+
20+
21+
22+
exit(gen.generate(PACKAGE, "dynamic_reconfigure_node", "MockCuckooClock"))

cuckoo_time_translator/src/MockCuckooDeviceDriver.cpp

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
#include "MockCuckooDeviceDriver.h"
22

3+
#include <random>
4+
35
#include <cuckoo_time_translator/KalmanOwt.h>
46
#pragma GCC diagnostic push
57
#pragma GCC diagnostic ignored "-Wunused-parameter"
6-
#include "ros/ros.h"
7-
#include "std_msgs/String.h"
8+
#include <ros/ros.h>
89
#pragma GCC diagnostic pop
910

1011
namespace cuckoo_time_translator {
@@ -19,28 +20,50 @@ KalmanOwtConfig getMockKalmanConfig() {
1920
return kc;
2021
}
2122

22-
2323
MockCuckooDeviceDriver::MockCuckooDeviceDriver(ros::NodeHandle & nh) :
24-
cuckooClock(kWrappingNumber, kFreq, kSkew, ros::Duration(kOffset)),
25-
translator(WrappingClockParameters{kWrappingNumber, kFreq}, nh.getNamespace(), Defaults().setFilterConfig(getMockKalmanConfig()))
24+
cuckooClock_(kWrappingNumber, kFreq, kSkew, ros::Duration(kOffset)),
25+
translator_(WrappingClockParameters{kWrappingNumber, kFreq}, nh.getNamespace(), Defaults().setFilterConfig(getMockKalmanConfig()))
2626
{
27+
srv_.setCallback(boost::bind(&MockCuckooDeviceDriver::dynamicReconfigureCallback, this, _1, _2));
28+
29+
nh.param("delay", delaySeconds_, delaySeconds_);
30+
nh.param("delaySigma", delaySigmaSeconds_, delaySigmaSeconds_);
31+
nh.param("assumedDelay", assumedDelaySeconds_, assumedDelaySeconds_);
32+
ROS_INFO("Using initial delay=%g s, delaySigma=%g s, and assumedDelay=%g s.", delaySeconds_, delaySigmaSeconds_, assumedDelaySeconds_);
2733
}
2834

2935

3036
void MockCuckooDeviceDriver::step() {
3137
ros::Time receiveTime;
3238
uint32_t deviceTime;
3339

34-
cuckooClock.getNewSimulatedMeasurementTimes(deviceTime, receiveTime);
40+
static std::default_random_engine generator;
41+
42+
cuckooClock_.getNewSimulatedMeasurementTimes(deviceTime, receiveTime);
3543

36-
translator.update(deviceTime, receiveTime);
44+
receiveTime += ros::Duration(delaySeconds_);
45+
if(delaySigmaSeconds_){
46+
std::exponential_distribution<double> delayDistribution(1/delaySigmaSeconds_);
47+
receiveTime += ros::Duration(delayDistribution(generator));
48+
}
49+
50+
translator_.update(deviceTime, receiveTime, -assumedDelaySeconds_);
3751
}
3852
} // namespace cuckoo_time_translator
3953

4054
using namespace cuckoo_time_translator;
4155

42-
int main(int argc, char **argv)
43-
{
56+
57+
58+
59+
void MockCuckooDeviceDriver::dynamicReconfigureCallback(const MockCuckooClockConfig &config, int) {
60+
assumedDelaySeconds_ = config.assumedDelay;
61+
delaySeconds_ = config.delay;
62+
delaySigmaSeconds_ = config.delaySigma;
63+
ROS_INFO("Using updated delay=%g s, delaySigma=%g s, and assumedDelay=%g s.", delaySeconds_, delaySigmaSeconds_, assumedDelaySeconds_);
64+
}
65+
66+
int main(int argc, char **argv) {
4467
ros::init(argc, argv, "mock_cuckoo_device_driver");
4568

4669
ros::NodeHandle nh;
@@ -58,4 +81,3 @@ int main(int argc, char **argv)
5881

5982
return 0;
6083
}
61-

cuckoo_time_translator/src/MockCuckooDeviceDriver.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
#include <cuckoo_time_translator/DeviceTimeTranslator.h>
55
#include "MockCuckooClock.h"
66

7-
namespace ros {
8-
class NodeHandle;
9-
}
7+
#pragma GCC diagnostic push
8+
#pragma GCC diagnostic ignored "-Wunused-parameter"
9+
#include <dynamic_reconfigure/server.h>
10+
#include <cuckoo_time_translator/MockCuckooClockConfig.h>
11+
#pragma GCC diagnostic pop
1012

1113
namespace cuckoo_time_translator {
1214

@@ -21,8 +23,15 @@ class MockCuckooDeviceDriver {
2123

2224
void step();
2325
private:
24-
MockCuckooClock cuckooClock;
25-
DeviceTimeUnwrapperAndTranslator<TimestampUnwrapperEventOnly> translator;
26+
void dynamicReconfigureCallback(const MockCuckooClockConfig &config, int);
27+
28+
MockCuckooClock cuckooClock_;
29+
DeviceTimeUnwrapperAndTranslator<TimestampUnwrapperEventOnly> translator_;
30+
double delaySeconds_ = 0;
31+
double delaySigmaSeconds_ = 0;
32+
double assumedDelaySeconds_ = 0;
33+
34+
dynamic_reconfigure::Server<MockCuckooClockConfig> srv_;
2635
};
2736

2837
}

cuckoo_time_translator_python/python/cuckoo_time_translator/device_time_bags.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pickle
44
import rosbag
5+
import numpy as np
56

67
from timestamp_series import TimestampSeries
78
from timestamp_series import TimestampSeries
@@ -35,13 +36,17 @@ def __init__(self, bagFile, topic, invalidate=False):
3536
bag = rosbag.Bag(bagFile)
3637

3738
self.translated_hw_times = TimestampSeries()
39+
self.translated_hw_times_without_offset = TimestampSeries()
3840
self.receive_times = TimestampSeries()
3941
self.raw_hw_times = TimestampSeries()
4042
for topic, msg, t in bag.read_messages(topics=[topic]):
4143
self.translated_hw_times.append(msg.header.stamp.to_sec())
44+
self.translated_hw_times_without_offset.append(msg.header.stamp.to_sec() - msg.offset_secs)
4245
self.receive_times.append(msg.receive_time.to_sec())
4346
self.raw_hw_times.append(float(msg.event_stamp))
4447

48+
self.zeroOffsetAllTheTime = np.linalg.norm(np.array(self.translated_hw_times_without_offset) - np.array(self.translated_hw_times)) < 1e-9
49+
4550
bag.close()
4651
# Save data to file
4752
pickle.dump(self.__dict__, open(eventsFile, "wb"))

cuckoo_time_translator_python/scripts/ctt_introspect.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ def addToPlot(times, label, color):
8383
if not args.dontPlotReceiveTimes:
8484
addToPlot(ds.receive_times, "receive times", "r")
8585
if not args.dontPlotPreTranslated:
86-
addToPlot(ds.translated_hw_times, "pre-translated", "g")
86+
addToPlot(ds.translated_hw_times, "pre-translated" + (" (+ zero offset)" if ds.zeroOffsetAllTheTime else " + offset"), "g")
87+
if not ds.zeroOffsetAllTheTime:
88+
addToPlot(ds.translated_hw_times_without_offset, "pre-translated without offset", "b")
8789

8890
owtColors = ['m', 'grey', 'cyan', 'k', 'orange']
8991
for i, owt in enumerate(hwOwts):

0 commit comments

Comments
 (0)