Connect with Protobuf

This tutorial shows how to connect with Protobuf using Python. For other languages, please reach out.

Send a message

Let's have your robot send its first message to the cloud! We'll start by sending a GPS position from your robot.

First, create a file called sensor_msgs.proto and copy in the code below to define the message type.

syntax = "proto3";

message NavSatFix {
  float latitude = 1;
  float longitude = 2;

Compile your .proto file by running the following command:

protoc --python_out=. sensor_msgs.proto


Compiler installation

If you haven't installed the protocol buffer compiler (protoc), download the package and follow the instructions in the README.

Next, create a Python file called and use the sample code below.

from sensor_msgs_pb2 import NavSatFix
from freedomrobotics.link_protobuf import LinkProtobuf

# Connect to the cloud with LinkProtobuf
freedom = LinkProtobuf(name="Core")

# Send your GPS position
message = NavSatFix()
message.latitude = 37.778454
message.longitude = -122.389171
freedom.protobuf_message("/location", message)

Next, run your code with python The message will show up in the Freedom App in your STREAM dashboard, showing the latitude and longitude of your device under the /location topic.

Receive a message

Let's now send a simple command to your robot.

Set up a callback

To prepare your robot to receive and respond to a command, we'll need to set up a callback.

We'll demonstrate a simple case where the robot responds to a command sent as a string. First, create a file called string.proto and copy in the code below to define the message type.

syntax = "proto3";

message String {
  string data = 1;

Compile your .proto file by running the following command:

protoc --python_out=. string.proto

Next, create a file called and copy in the code below.

from time import sleep

from google.protobuf.json_format import MessageToDict
from freedomrobotics.link_protobuf import LinkProtobuf

from string_pb2 import String

keep_alive = True

# Create a callback to handle remote messages
def callback(msg):
    global keep_alive
    freedom.log("info", "I heard " + str(msg))
    if == "mission":
        freedom.log("info", "Running mission...")
    elif == "shutdown":
        freedom.log("info", "Shutting down...")
        keep_alive = False

# Connect to the cloud with LinkProtobuf
freedom = LinkProtobuf(protobuf_command_callback=callback)

while keep_alive:

Run the code with python Your robot is now waiting patiently for a remote command.

Test the callback

To check that the callback works, we'll send a command to your device using Freedom's REST API.

If you haven't already, click Log In in the top right corner of this page so we can populate the values for your token, secret, account, and device for this example. Once you've logged in, run the following command:

HEADERS="-H content-type:application/json -H mc_token:$TOKEN -H mc_secret:$SECRET"
    \"platform\": \"custom\", 
    \"utc_time\": `date +%s`,
    \"topic\": \"/commands\",
    \"type\": \"string_pb2.String\",
    \"expiration_secs\": 60,
    \"message\": {\"data\":\"mission\"}

curl -v $HEADERS -d "$DATA" -X PUT "<<API_URL>>accounts/$ACCOUNT/devices/$DEVICE/commands"

The message will be received in the callback you set up. Once your robot receives the command, it will log Running mission....

Change mission to shutdown and send a new command. Your application will now shut down remotely.

Success! You now know how to use Freedom to upload data and communicate with your robot through the cloud.

What's next?

If you would like to read walkthroughs of usage for key aspects of the system, the guides for Monitoring, Alerts and Integrations, and Teleop and Control are a great place to start.

If you prefer reviewing detailed API specs and references, you can do that also.

If you like to poke around applications, go to the Freedom App and explore!