ZMQ implementation of the cfclient

The Crazyflie Python client runs a number of back-ends where you can set/get information from other applications via ZMQ.

Here's a list of the ports/functions available:

Port Type Functionality
1213 REQ Set parameters
1214 PUSH LED-ring memory
1212 PULL Input device

By default all sockets are disabled in the configuration file and needs to be enabled. The configuration file parameter are named enable_zmq_param, enable_zmq_led and enable_zmq_input. see the configuration documentation for more information about the configuration file.


Parameters

The parameter back-end gives access to setting parameters in the Crazyflie. The back-end is enabled by default.

Protocol

Available fields:

Field Format Comments
version int Should be set to 1
cmd string Command to send (currently only set is supported)
name string The name of the parameter
value string The value of the parameter

Example of setting the buzzer.freq parameter to 4000.

{
  "version": 1,
  "cmd": "set",
  "name" : "buzzer.freq",
  "value": "4000"
}

LED-ring

The LED-ring back-end gives access to the LED-ring memory driver where the user can write the RGB values for all 12 LEDs on the ring. The back-end is enabled by default.

Protocol

Available fields:

Field Format Comments
version int Should be set to 1
rgbleds array of 3 item arrays of int R/G/B value for each LED (starting at 1)

Example of setting all LEDs off:

{
  "version": 1,
  "rgbleds": [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
  ]
}

Input device

If you don't want to use the API and you don't want to bother about scanning/connecting/logging/etc or there's no API for the environment you use, there's an easy way to control the Crazyflie. Just like you would control the Crazyflie with a gamepad or joystick connected to a computer, you can use ZMQ to inject control set-points directly into the client. You still use the client for connecting/logging/graphing/setting parameters, it's just the control part that's broken out.

To enable controlling by the back-end select the ZMQ\@127.0.0.1:1212 input device in the Input device menu.

Protocol

Available fields:

Field Format Comments
version int Should be set to 1
client_name string Name of the client (currently unused)
ctrl dict A dictionary with keys and values that match the internal names of controls in the client (see list below)

Available keys for the ctrl dictionary:

Field Range Unit Comments
roll N/A degrees  
pitch N/A degrees  
yaw N/A degrees/second  
thrust 0-100 Percent  
estop T/F boolean Used to stop the Crazyflie and disable the control
alt1 T/F boolean Alt1 is internally mapped to functionality like switching LED-ring effect
alt2 T/F boolean Alt2 is internally mapped to functionality like switching LED-ring headlights on/off

Example:

{
    "version": 1,
    "client_name": "ZMQ client",
    "ctrl": {
        "roll": 0.0,
        "pitch": 0.0,
        "yaw": 0.0,
        "thrust": 0.0
    }
}

NOTE1: Altitude hold is currently not working.

NOTE2: The values are used at 100Hz in the client, no matter at what rate they are sent via ZMQ