当前位置: 代码迷 >> 综合 >> 基于px4二次开发的断电续飞
  详细解决方案

基于px4二次开发的断电续飞

热度:71   发布时间:2024-01-28 10:07:01.0

第一次写博客,不知道写啥,贴出自己写的一段断电续飞的代码,欢迎大家给出建议。

bool

Mission::set_current_position_as_takeoff_item()

{

int *mission_index_ptr = &_current_mission_index;

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "first item index num: %d.",

*mission_index_ptr);

const dm_item_t dm_item = (dm_item_t)_mission.dataman_id;

 

/* do not work on empty missions */

if (_mission.count == 0) {

return false;

}

for (int offset = 2; offset < 20; offset++) {

if ((*mission_index_ptr) - offset < 0 || *mission_index_ptr >= (int)_mission.count) {

if ((*mission_index_ptr != (int)_mission.count) && (*mission_index_ptr != -1)) {

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "Mission item index out of bound, index: %d, max: %d.",

*mission_index_ptr - offset, _mission.count);

}

break;

}

 

const ssize_t len = sizeof(struct mission_item_s);

 

struct mission_item_s mission_item_tmp;

/* read mission item from datamanager */

if (dm_read(dm_item, (*mission_index_ptr)-offset, &mission_item_tmp, len) != len) {

/* not supposed to happen unless the datamanager can't access the SD card, etc. */

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "Waypoint could not be read.");

return false;

}

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "index: %d, nav_cmd: %d.",

*mission_index_ptr - offset, mission_item_tmp.nav_cmd);

/* check for DO_JUMP item, and whether it hasn't not already been repeated enough times */

if (mission_item_tmp.nav_cmd != NAV_CMD_DO_JUMP) {

 

mission_item_tmp.nav_cmd = NAV_CMD_DO_JUMP;

mission_item_tmp.do_jump_mission_index = *mission_index_ptr;

if (dm_write(dm_item, (*mission_index_ptr)-offset, DM_PERSIST_POWER_ON_RESET, &mission_item_tmp, len) != len) {

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "DO JUMP waypoint could not be written.");

return false;

}

 

} else {

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "here is JUMP setpoint");

}

}

ssize_t len = sizeof(struct mission_item_s);

struct mission_item_s item;

 

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "the index to write %d.",*mission_index_ptr-1);

if (dm_read(dm_item, *mission_index_ptr-1, &item, len) != len) {

/* not supposed to happen unless the datamanager can't access the SD card, etc. */

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "Waypoint could not be read.");

return false;

}

item.lat = _navigator->get_global_position()->lat;

item.lon = _navigator->get_global_position()->lon;

item.altitude = _navigator->get_global_position()->alt/100;

 

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "lat %lf. lon %lf. alt %lf",

item.lat,item.lon,(double)item.altitude);

 

if (dm_write(dm_item, *mission_index_ptr-1, DM_PERSIST_POWER_ON_RESET, &item, len) == len) {

/* not supposed to happen unless the datamanager can't access the dataman */

mavlink_log_critical(_navigator->get_mavlink_log_pub(), "CURRENT waypoint be written.");

return true;

}

/* we have given up, we don't want to cycle forever */

return false;

}

 

主要是读取已经飞过的航点,将已经飞过的航点都设置为JUMP模式,然后读取当前的local_position作为当前航点的经纬度信息并保存。