commit
0440535f64
11 changed files with 122 additions and 40 deletions
@ -0,0 +1,42 @@ |
||||
What is cereal? |
||||
---- |
||||
|
||||
cereal is both a messaging spec for robotics systems as well as generic high performance IPC pub sub messaging with a single publisher and multiple subscribers. |
||||
|
||||
Imagine this use case: |
||||
* A sensor process reads gyro measurements directly from an IMU and publishes a sensorEvents packet |
||||
* A calibration process subscribes to the sensorEvents packet to use the IMU |
||||
* A localization process subscribes to the sensorEvents packet to use the IMU also |
||||
|
||||
|
||||
Messaging Spec |
||||
---- |
||||
|
||||
You'll find the message types in [log.capnp](log.capnp). It uses [Cap'n proto](https://capnproto.org/capnp-tool.html) and defines one struct called Event. |
||||
|
||||
All Events have a logMonoTime and a valid. Then a big union defines the packet type. |
||||
|
||||
|
||||
Pub Sub Backends |
||||
---- |
||||
|
||||
cereal supports two backends, one based on [zmq](https://zeromq.org/), the other called msgq, a custom pub sub based on shared memory that doesn't require the bytes to pass through the kernel. |
||||
|
||||
Example |
||||
--- |
||||
```python |
||||
import cereal.messaging as messaging |
||||
|
||||
# in subscriber |
||||
sm = messaging.SubMaster(['sensorEvents']) |
||||
while 1: |
||||
sm.update() |
||||
print(sm['sensorEvents']) |
||||
|
||||
# in publisher |
||||
pm = messaging.PubMaster(['sensorEvents']) |
||||
dat = messaging.new_message() |
||||
dat.init('sensorEvents', 1) |
||||
dat.sensorEvents[0] = {"gyro": {"v": [0.1, -0.1, 0.1]}} |
||||
pm.send('sensorEvents', dat) |
||||
``` |
Loading…
Reference in new issue