You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.3 KiB
43 lines
1.3 KiB
5 years ago
|
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)
|
||
|
```
|