cereal/README.md

45 lines
1.6 KiB
Markdown
Raw Normal View History

2020-07-29 15:37:16 +08:00
What is cereal? [![cereal tests](https://github.com/commaai/cereal/workflows/Tests/badge.svg?event=push)](https://github.com/commaai/cereal/actions) [![codecov](https://codecov.io/gh/commaai/cereal/branch/master/graph/badge.svg)](https://codecov.io/gh/commaai/cereal)
2019-12-16 10:27:46 +08:00
----
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:
2020-07-09 12:51:58 +08:00
* 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
2019-12-16 10:27:46 +08:00
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.
2020-07-09 12:51:58 +08:00
All Events have a `logMonoTime` and a `valid`. Then a big union defines the packet type.
2019-12-16 10:27:46 +08:00
Pub Sub Backends
----
2020-07-09 12:51:58 +08:00
cereal supports two backends, one based on [zmq](https://zeromq.org/) and another called msgq, a custom pub sub based on shared memory that doesn't require the bytes to pass through the kernel.
2019-12-16 10:27:46 +08:00
Example
---
```python
2020-01-13 06:32:47 +08:00
import cereal.messaging as messaging
# in subscriber
sm = messaging.SubMaster(['sensorEvents'])
while 1:
sm.update()
print(sm['sensorEvents'])
2020-07-09 12:51:58 +08:00
```
```python
2020-01-13 06:32:47 +08:00
# in publisher
pm = messaging.PubMaster(['sensorEvents'])
dat = messaging.new_message('sensorEvents', size=1)
2020-01-13 06:32:47 +08:00
dat.sensorEvents[0] = {"gyro": {"v": [0.1, -0.1, 0.1]}}
pm.send('sensorEvents', dat)
```