mirror of
https://github.com/commaai/msgq.git
synced 2026-06-13 00:14:32 +08:00
45 lines
1.6 KiB
Markdown
45 lines
1.6 KiB
Markdown
What is cereal? [](https://github.com/commaai/cereal/actions) [](https://codecov.io/gh/commaai/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/) and another 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'])
|
|
|
|
```
|
|
|
|
```python
|
|
# in publisher
|
|
pm = messaging.PubMaster(['sensorEvents'])
|
|
dat = messaging.new_message('sensorEvents', size=1)
|
|
dat.sensorEvents[0] = {"gyro": {"v": [0.1, -0.1, 0.1]}}
|
|
pm.send('sensorEvents', dat)
|
|
```
|