/* This file is autogenerated in nuttx/configs/px4fmu/include/updatesdlog.py */ #ifndef SDLOG_GENERATED_H_ #define SDLOG_GENERATED_H_ typedef struct { uint64_t sensors_raw_timestamp; int16_t sensors_raw_gyro_raw[3]; uint16_t sensors_raw_gyro_raw_counter; int16_t sensors_raw_accelerometer_raw[3]; uint16_t sensors_raw_accelerometer_raw_counter; float attitude_roll; float attitude_pitch; float attitude_yaw; float position_lat; float position_lon; float position_alt; float position_relative_alt; float position_vx; float position_vy; float position_vz; int32_t gps_lat; int32_t gps_lon; int32_t gps_alt; uint16_t gps_eph; float ardrone_control_setpoint_thrust_cast; float ardrone_control_setpoint_attitude[3]; float ardrone_control_position_control_output[3]; float ardrone_control_attitude_setpoint_navigationframe_from_positioncontroller[3]; char check[4]; } __attribute__((__packed__)) log_block_t; void copy_block(log_block_t *log_block) { if (global_data_wait(&global_data_sensors_raw->access_conf_rate_low) == 0) { memcpy(&log_block->sensors_raw_timestamp, &global_data_sensors_raw->timestamp, sizeof(uint64_t) * 1); memcpy(&log_block->sensors_raw_gyro_raw, &global_data_sensors_raw->gyro_raw, sizeof(int16_t) * 3); memcpy(&log_block->sensors_raw_gyro_raw_counter, &global_data_sensors_raw->gyro_raw_counter, sizeof(uint16_t) * 1); memcpy(&log_block->sensors_raw_accelerometer_raw, &global_data_sensors_raw->accelerometer_raw, sizeof(int16_t) * 3); memcpy(&log_block->sensors_raw_accelerometer_raw_counter, &global_data_sensors_raw->accelerometer_raw_counter, sizeof(uint16_t) * 1); if (global_data_trylock(&global_data_attitude->access_conf) == 0) { memcpy(&log_block->attitude_roll, &global_data_attitude->roll, sizeof(float) * 1); memcpy(&log_block->attitude_pitch, &global_data_attitude->pitch, sizeof(float) * 1); memcpy(&log_block->attitude_yaw, &global_data_attitude->yaw, sizeof(float) * 1); global_data_unlock(&global_data_attitude->access_conf); } if (global_data_trylock(&global_data_position->access_conf) == 0) { memcpy(&log_block->position_lat, &global_data_position->lat, sizeof(float) * 1); memcpy(&log_block->position_lon, &global_data_position->lon, sizeof(float) * 1); memcpy(&log_block->position_alt, &global_data_position->alt, sizeof(float) * 1); memcpy(&log_block->position_relative_alt, &global_data_position->relative_alt, sizeof(float) * 1); memcpy(&log_block->position_vx, &global_data_position->vx, sizeof(float) * 1); memcpy(&log_block->position_vy, &global_data_position->vy, sizeof(float) * 1); memcpy(&log_block->position_vz, &global_data_position->vz, sizeof(float) * 1); global_data_unlock(&global_data_position->access_conf); } if (global_data_trylock(&global_data_gps->access_conf) == 0) { memcpy(&log_block->gps_lat, &global_data_gps->lat, sizeof(int32_t) * 1); memcpy(&log_block->gps_lon, &global_data_gps->lon, sizeof(int32_t) * 1); memcpy(&log_block->gps_alt, &global_data_gps->alt, sizeof(int32_t) * 1); memcpy(&log_block->gps_eph, &global_data_gps->eph, sizeof(uint16_t) * 1); global_data_unlock(&global_data_gps->access_conf); } if (global_data_trylock(&global_data_ardrone_control->access_conf) == 0) { memcpy(&log_block->ardrone_control_setpoint_thrust_cast, &global_data_ardrone_control->setpoint_thrust_cast, sizeof(float) * 1); memcpy(&log_block->ardrone_control_setpoint_attitude, &global_data_ardrone_control->setpoint_attitude, sizeof(float) * 3); memcpy(&log_block->ardrone_control_position_control_output, &global_data_ardrone_control->position_control_output, sizeof(float) * 3); memcpy(&log_block->ardrone_control_attitude_setpoint_navigationframe_from_positioncontroller, &global_data_ardrone_control->attitude_setpoint_navigationframe_from_positioncontroller, sizeof(float) * 3); global_data_unlock(&global_data_ardrone_control->access_conf); } global_data_unlock(&global_data_sensors_raw->access_conf_rate_low); } } #define MFILE_STRING "% This file is autogenerated in updatesdlog.py and mfile.template in apps/sdlog\n\ %% Define logged values \n\ \n\ logTypes = {};\n\ logTypes{end+1} = struct('data','sensors_raw','variable_name','timestamp','type_name','uint64','type_bytes',8,'number_of_array',1);\n\ logTypes{end+1} = struct('data','sensors_raw','variable_name','gyro_raw','type_name','int16','type_bytes',2,'number_of_array',3);\n\ logTypes{end+1} = struct('data','sensors_raw','variable_name','gyro_raw_counter','type_name','uint16','type_bytes',2,'number_of_array',1);\n\ logTypes{end+1} = struct('data','sensors_raw','variable_name','accelerometer_raw','type_name','int16','type_bytes',2,'number_of_array',3);\n\ logTypes{end+1} = struct('data','sensors_raw','variable_name','accelerometer_raw_counter','type_name','uint16','type_bytes',2,'number_of_array',1);\n\ logTypes{end+1} = struct('data','attitude','variable_name','roll','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','attitude','variable_name','pitch','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','attitude','variable_name','yaw','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','position','variable_name','lat','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','position','variable_name','lon','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','position','variable_name','alt','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','position','variable_name','relative_alt','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','position','variable_name','vx','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','position','variable_name','vy','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','position','variable_name','vz','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','gps','variable_name','lat','type_name','int32','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','gps','variable_name','lon','type_name','int32','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','gps','variable_name','alt','type_name','int32','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','gps','variable_name','eph','type_name','uint16','type_bytes',2,'number_of_array',1);\n\ logTypes{end+1} = struct('data','ardrone_control','variable_name','setpoint_thrust_cast','type_name','float','type_bytes',4,'number_of_array',1);\n\ logTypes{end+1} = struct('data','ardrone_control','variable_name','setpoint_attitude','type_name','float','type_bytes',4,'number_of_array',3);\n\ logTypes{end+1} = struct('data','ardrone_control','variable_name','position_control_output','type_name','float','type_bytes',4,'number_of_array',3);\n\ logTypes{end+1} = struct('data','ardrone_control','variable_name','attitude_setpoint_navigationframe_from_positioncontroller','type_name','float','type_bytes',4,'number_of_array',3);\n\ \ %% Import logfiles\n\ \n\ % define log file and GPSs\n\ logfileFolder = 'logfiles';\n\ fileName = 'all';\n\ fileEnding = 'px4log';\n\ \n\ numberOfLogTypes = length(logTypes);\n\ \n\ path = [fileName,'.', fileEnding];\n\ fid = fopen(path, 'r');\n\ \n\ % get file length\n\ fseek(fid, 0,'eof');\n\ fileLength = ftell(fid);\n\ fseek(fid, 0,'bof');\n\ \n\ % get length of one block\n\ blockLength = 4; % check: $$$$\n\ for i=1:numberOfLogTypes\n\ blockLength = blockLength + logTypes{i}.type_bytes*logTypes{i}.number_of_array;\n\ end\n\ \n\ % determine number of entries\n\ entries = fileLength / blockLength;\n\ \n\ \n\ % import data\n\ offset = 0;\n\ for i=1:numberOfLogTypes\n\ \n\ data.(genvarname(logTypes{i}.data)).(genvarname(logTypes{i}.variable_name)) = transpose(fread(fid,[logTypes{i}.number_of_array,entries],[num2str(logTypes{i}.number_of_array),'*',logTypes{i}.type_name,'=>',logTypes{i}.type_name],blockLength-logTypes{i}.type_bytes*logTypes{i}.number_of_array));\n\ offset = offset + logTypes{i}.type_bytes*logTypes{i}.number_of_array;\n\ fseek(fid, offset,'bof');\n\ \n\ progressPercentage = i/numberOfLogTypes*100;\n\ fprintf('%3.0f%%',progressPercentage);\n\ end\n\ \n\ \n\ %% Plots\n\ \n\ figure\n\ plot(data.sensors_raw.timestamp,data.sensors_raw.gyro_raw)\n\ \n\ figure\n\ plot(data.sensors_raw.timestamp,data.sensors_raw.accelerometer_raw)\n\ \n\ %% Check for lost data\n\ \n\ % to detect lost frames (either when logging to sd card or if no new data is\n\ % data is available for some time)\n\ diff_counter = diff(data.sensors_raw.gyro_raw_counter);\n\ figure\n\ plot(diff_counter)\n\ \n\ % to detect how accurate the timing was\n\ diff_timestamp = diff(data.sensors_raw.timestamp);\n\ \n\ figure\n\ plot(diff_timestamp)\n\ \n\ %% Export to file for google earth\n\ \n\ \n\ if(isfield(data.gps,'lat') && isfield(data.gps,'lon') && isfield(data.gps,'alt'))\n\ \n\ % extract coordinates and height where they are not zero\n\ maskWhereNotZero = ((data.gps.lon ~= 0 & data.gps.lat ~= 0 ) & data.gps.alt ~= 0);\n\ \n\ % plot\n\ figure\n\ plot3(data.gps.lon(maskWhereNotZero),data.gps.lat(maskWhereNotZero),data.gps.alt(maskWhereNotZero))\n\ \n\ \n\ % create a kml file according to https://developers.google.com/kml/documentation/kml_tut\n\ % also see https://support.google.com/earth/bin/answer.py?hl=en&answer=148072&topic=2376756&ctx=topic\n\ \n\ % open file and overwrite content\n\ fileId = fopen('gps_path.kml','w+');\n\ \n\ % define strings that should be written to file\n\ fileStartDocumentString = ['PathsPath'];\n\ \n\ fileStyleString = '';\n\ \n\ filePlacemarkString = 'Absolute ExtrudedTransparent blue wall with blue outlines#blueLinebluePoly11absolute';\n\ \n\ fileEndPlacemarkString = '';\n\ fileEndDocumentString = '';\n\ \n\ % start writing to file\n\ fprintf(fileId,fileStartDocumentString);\n\ \n\ fprintf(fileId,fileStyleString);\n\ fprintf(fileId,filePlacemarkString);\n\ \n\ \n\ lonTemp = double(data.gps.lon(maskWhereNotZero))/1E7;\n\ latTemp = double(data.gps.lat(maskWhereNotZero))/1E7;\n\ altTemp = double(data.gps.alt(maskWhereNotZero))/1E3 + 100.0; % in order to see the lines above ground\n\ \n\ % write coordinates to file\n\ for k=1:length(data.gps.lat(maskWhereNotZero))\n\ if(mod(k,10)==0)\n\ fprintf(fileId,'%.10f,%.10f,%.10f\\n',lonTemp(k),latTemp(k),altTemp(k));\n\ end\n\ end\n\ \n\ % write end placemark\n\ fprintf(fileId,fileEndPlacemarkString);\n\ \n\ % write end of file\n\ fprintf(fileId,fileEndDocumentString);\n\ \n\ % close file, it should now be readable in Google Earth using File -> Open\n\ fclose(fileId);\n\ \n\ end\n\ \n\ if(isfield(data.position,'lat') && isfield(data.position,'lon') && isfield(data.position,'alt'))\n\ \n\ % extract coordinates and height where they are not zero\n\ maskWhereNotZero = ((data.position.lon ~= 0 & data.position.lat ~= 0 ) & data.position.alt ~= 0);\n\ \n\ % plot\n\ figure\n\ plot3(data.position.lon(maskWhereNotZero),data.position.lat(maskWhereNotZero),data.position.alt(maskWhereNotZero))\n\ end\n\ " #endif