Firmware
Not much work has been done in the Firmware yet (as of 7/20/16). The few things we have been able to successfully modify are:
- Creating New Log Blocks
- Modifying the Default Yaw Mode
- Adding and Modifying Parameter Values
New Firmware Log Blocks
In the Crazyflie Firmware there is a generalized logging framework that allows us to make any group of variables into a log block. It makes things very easy to log. Here are a few examples:
- IMPORTANT: If you want to create new Log groups in a file, make sure you include
#include "log.h"at the top of the file.
- Ex. 1. Magnometer Log Block (code found in Firmware > modules > src > stabilizer.c)
LOG_GROUP_START(mag) LOG_ADD(LOG_FLOAT, x, &mag.x) LOG_ADD(LOG_FLOAT, y, &mag.y) LOG_ADD(LOG_FLOAT, z, &mag.z) LOG_GROUP_STOP(mag)
- So with this code we have created a log block called 'mag' and it contains the X, Y, and Z measurements from the magnetometer sensor.
- Ex. 2. Accelerometer Log Block (code found in Firmware > modules > src > stabilizer.c)
LOG_GROUP_START(acc) LOG_ADD(LOG_FLOAT, x, &acc.x) LOG_ADD(LOG_FLOAT, y, &acc.y) LOG_ADD(LOG_FLOAT, z, &acc.z) LOG_ADD(LOG_FLOAT, zw, &accWZ) LOG_ADD(LOG_FLOAT, mag2, &accMAG) LOG_GROUP_STOP(acc)
- Just like in the magnetometer block, here we have created a log group called 'acc' and inside this group we are logging the variables for the accelerometer's X, Y, and Z values as well as 2 other gravity based variables used for thrust compensation.
Using New Log Blocks in Swarm Client
Now that we have these new log blocks in the Firmware, we can use log blocks in the Client
Modify the Default Yaw Mode
There are 3 types of Yaw Modes available in the Firmware (as of 7/21/16), as shown (code in Firmware > modules > interface > commander.h)
typedef enum { CAREFREE = 0, // Yaw is locked to world coordinates thus heading stays the same when yaw rotates PLUSMODE = 1, // Plus-mode. Motor M1 is defined as front XMODE = 2, // X-mode. M1 & M4 is defined as front } YawModeType;
- Note: The default mode for the Crazyflie 2.0 is XMODE. The PLUSMODE is default for the Crazyflie 1.0, but can still be used on the Crazyflie 2.0 if desired.
Carefree Mode
CAREFREE mode is what our Crazyflie 2.0's are using, this mode applies a transformation to the Pitch and Roll setpoints depending on the angle of Yaw. We used to perform this calculation on the Client like this (code in eris_vrpn.cpp):
#if USE_PR_YAW_CORRECT //CORRECTS PITCH AND ROLL PID ERRORS TO ACCOUNT FOR QUADS CURRENT YAW DIRECTION (_/57.2958 converts DEG to RADIANS) xError2 = cos(correctedYaw2 / 57.2958)*(xPositionDesired2 - xPosition2) - sin(correctedYaw2 / 57.2958)*(yPositionDesired2 - yPosition2); yError2 = sin(correctedYaw2 / 57.2958)*(xPositionDesired2 - xPosition2) + cos(correctedYaw2 / 57.2958)*(yPositionDesired2 - yPosition2); #else xError2 = xPositionDesired2 - xPosition2; yError2 = yPositionDesired2 - yPosition2; #endif controllerSetXYError(&pidCtrl2, xError2, yError2);
This is no longer necessary on the Client because this is the exact same calculation CAREFREE mode performs on the Firmware. So this reduces the computation done on the Client in each Crazyflie Callback.
Changing Yaw Mode in Firmware
To change the Yaw Mode to CAREFREE mode we had to make the modification shown (code in Firmware > modules > interface > commander.h (line 36)):
- ORIGINAL:
... #ifdef PLATFORM_CF1 #define DEFUALT_YAW_MODE PLUSMODE #else #define DEFUALT_YAW_MODE XMODE #endif ...
- MODIFIED:
... #ifdef PLATFORM_CF1 #define DEFUALT_YAW_MODE PLUSMODE #else #define DEFUALT_YAW_MODE CAREFREE #endif ...
- The code checks for which version Crazyflie you are using, either the original Crazyflie (
PLATFORM_CF1), or the Crazyflie 2.0. We are using the Crazyflie 2.0 so we only care about the 2nd DEFAULT_YAW_MODE, which we modified to CAREFREE mode as shown.
- The code checks for which version Crazyflie you are using, either the original Crazyflie (
New Firmware Parameter Groups
Parameter groups are very similar to Log groups with a few key differences. An example of a Parameter group is shown (code in Firmware > modules > src > commander.c):
- IMPORTANT: If you want to create new Parameter groups in a file, make sure you include
#include "param.h"at the top of the file.
// Params for flight modes PARAM_GROUP_START(flightmode) PARAM_ADD(PARAM_UINT8, althold, &altHoldMode) PARAM_ADD(PARAM_UINT8, yawMode, &yawMode) PARAM_ADD(PARAM_UINT8, yawRst, &carefreeResetFront) PARAM_ADD(PARAM_UINT8, stabModeRoll, &stabilizationModeRoll) PARAM_ADD(PARAM_UINT8, stabModePitch, &stabilizationModePitch) PARAM_ADD(PARAM_UINT8, stabModeYaw, &stabilizationModeYaw) PARAM_GROUP_STOP(flightmode)
- So we create a parameter group called flightmode that contains the parameters listed. The difference between Log variables and Param variables is that for Param variables you need to specify the variable type (PARAM_UINT8 shown in the example).
Some User Friendly Param Types are shown below (you can find more complex Param types in Firmware > modules > interface > param.h).
// User-friendly macros #define PARAM_UINT8 (PARAM_1BYTE | PARAM_TYPE_INT | PARAM_UNSIGNED) #define PARAM_INT8 (PARAM_1BYTE | PARAM_TYPE_INT | PARAM_SIGNED) #define PARAM_UINT16 (PARAM_2BYTES | PARAM_TYPE_INT | PARAM_UNSIGNED) #define PARAM_INT16 (PARAM_2BYTES | PARAM_TYPE_INT | PARAM_SIGNED) #define PARAM_UINT32 (PARAM_4BYTES | PARAM_TYPE_INT | PARAM_UNSIGNED) #define PARAM_INT32 (PARAM_4BYTES | PARAM_TYPE_INT | PARAM_SIGNED)
Using Param Groups in Client
This is not implemented yet (as of 7/21/16) but would be very nice to have. We could then tune Firmware PID constants without needing to flash the Firmware each time and much more.
If someone would like to attempt to create this you can see the Bitcraze Wiki page on the Params Protocol for help on how to implement this.