Rscp
Rover Satellite Communications Protocol is a protocol for communicating with a rover over a serial connection. This project is designed for Anatolian Rover Challenge (ARC)
Install / Use
/learn @anatolianroverchallenge/RscpREADME
Rover Satellite Communications Protocol
Rover Satellite Communications Protocol is a protocol for communicating with a rover over a serial connection. This project is designed for Anatolian Rover Challenge (ARC).
<h2>If you are a competitor in <strong>ARC'25</strong>, please watch this repository to get notified about the updates.</h2>Also check out Discussions for updates and questions.
Issue Tracking
Please use the GitHub issue tracker to report issues or request features. https://github.com/anatolianroverchallenge/rscp/releases
Releases
The latest release can be found on the GitHub releases page. If you cannot see any releases, hold tight! We are working hard.
Table of Contents
- Rover Satellite Communications Protocol
- Issue Tracking
- Releases
- Table of Contents
- Details
- Getting Started
- License
- Authors
- Acknowledgements
Details
RSCP now uses Google Protocol Buffers for serialization and deserialization of messages. This means you don't have to manually serialize/deserialize RSCP messages.
You can use the provided .proto files under proto directory to generate the necessary classes for your language. Refer to the official documentation for more information. You can use the official protoc compiler to generate the necessary classes for your language, or you can use the pre-generated classes provided in this repository, which can be found in the releases. Always use the latest release for the most up-to-date classes.
The releases will have c.zip cpp.zip rscp_protobuf.zip nanopb.zip index.html files which contain the necessary classes for the respective languages, generated using the .proto files in the proto directory using the protoc compiler.
| Language | File | Description | | ------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | | C | c.zip | C source files | | C++ | cpp.zip | C++ source files | | rscp_protobuf | rscp_protobuf.zip | Python source files (pip3 install <url> to install) | | nanopb | nanopb.zip | C source and header files for nanopb library | | docs | index.html | Documentation for the protocol |
You may use rscp_protobuf.zip under the releases to install the python package using pip3 install https://github.com/anatolianroverchallenge/rscp/releases/latest/download/rscp_protobuf.zip
The nanopb library is used to generate the C/C++ source and header files that can be used in embedded systems. Refer to the official documentation and nanopb examples for more information.
You may find the latest Protobuf documentation of the protocol here
Frame Format
To communicate with the RSCP module, all you need to do is:
- Create a
rscp.ResponseEnvelopeobject - Fill out the appropriate fields
- Serialize the object using the
SerializeToStringmethod - Encode it with
cobsencoding. For python you can use thecobspackage. - Send the encoded message to the rover over serial
To receive an instruction from the RSCP module, you need to:
- Receive the message from the serial port and accumulate it over a buffer
- If
0x00is received, decode the message usingcobsdecoding - Parse the message using the
rscp.RequestEnvelopeobject - Use
request.WhichOneof('request')to determine the type of the message - Use the appropriate method to handle the data
Communication Sequence
RSCP client module will be sending host messages to the rovers in rscp.RequestEnvelope format. The rovers will be sending responses to the host in rscp.ResponseEnvelope format.
Stage 1 Antenna Installation
| Message Type | Direction | Description | light | | -------------------------- | ---------------- | --------------------------------------------------- | --------------- | | SetStage(1) | HM -> CM | -- | :heart: | | SetStage(1) | CM -> Rover | Rover sets the stage to 1 | :heart: | | Acknowledge | Rover -> CM | Rover acknowledges the stage setting | :heart: | | Acknowledge | CM -> HM | -- | :heart: | | ArmDisarm(arm=True) | HM -> CM | -- | :heart: | | ArmDisarm(arm=True) | CM -> Rover | Rover arms itself | :green_heart: | | Acknowledge | Rover -> CM | Rover acknowledges the arming request | :green_heart: | | Acknowledge | CM -> HM | -- | :green_heart: | | SearchArea(lat1,lon1,rad1) | HM -> CM | -- | :green_heart: | | SearchArea(lat1,lon1,rad1) | CM -> Rover | Rover starts receives area coordinates | :green_heart: | | Acknowledge | Rover -> CM | Rover acknowledges and starts navigation and search | :yellow_heart: | | Acknowledge | CM -> HM | -- | :yellow_heart: | | no message sent | -- | finished navigating and searching | :yellow_heart: | | no message sent | -- | install antenna | :yellow_heart: | | GPSCoordinate(lat2,lon2) | Rover -> CM | Rover sends coordinates of the peak | :yellow_heart: | | GPSCoordinate(lat2,lon2) | CM -> HM | -- | :yellow_heart: | | TaskCompleted | Rover -> CM | rover reports navigation finished | :green_heart: | | TaskCompleted | CM -> HM | -- | :green_heart: |
Stage 2 Icy Crater
| Message Type | Direction | Description | light | | -------------------------- | ---------------- | --------------------------------------------------- | --------------- | | SetStage(2) | HM -> CM | -- | :green_heart: | | SetStage(2) | CM -> Rover | Rover sets the stage to 2 | :green_heart: | | Acknowledge | Rover -> CM | Rover acknowledges the stage setting | :green_heart: | | Acknowledge | CM -> HM | -- | :green_heart: | | SearchArea(lat3,lon3,rad3) | HM -> CM | -- | :green_heart: | | SearchArea(lat3,lon3,rad3) | CM -> Rover | Rover starts receives area coordinates | :green_heart: | | Acknowledge | Rover -> CM | Rover acknowledges and starts navigation and search | :yellow_heart: | | Acknowledge | CM -> HM | -- | :yellow_heart: | | no message sent | -- | finished navigating and searching | :yellow_heart: | | GPSCoordinate(lat4,lon4) | Rover -> CM | Rover sends coordinates of the coldest surface | :y
