Skip to content

Commit 4d3d80d

Browse files
committed
Hotfix Release 3.2.2 Movement control, Vertical Position control bug. User is not required to add home point altitude to Z desired position after this fix. Z desired position may be entered directly. Home point altitude is handled internally
1 parent 5c1aca0 commit 4d3d80d

File tree

11 files changed

+146
-45
lines changed

11 files changed

+146
-45
lines changed

CMakeLists.txt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ project(onboardsdk)
44
set(CMAKE_VERBOSE_MAKEFILE OFF)
55

66
# Add module path for <name>.cmake conf files
7-
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/contrib/)
7+
if(NOT CMAKE_MODULE_PATH)
8+
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/contrib/)
9+
endif()
810

911
include(${CMAKE_MODULE_PATH}/DJIConfig.cmake)
1012

@@ -17,8 +19,15 @@ option(GTEST "Build with Google Test framework" OFF)
1719
# Allow to build additional modules
1820
option(LIDAR_LOGGING "Build VLP16 Puck LiDAR logging" OFF)
1921

20-
# Use External DJI Modules
22+
#### Use External DJI Modules ####
23+
2124
option(USE_PRECISION_MISSIONS "Use DJI precision-missions library" OFF)
25+
# If you are using custom precision-missions library
26+
option(PRECISION_MISSIONS_LIBRARY "WARNING: for custom precision-missions Library only, point to a library location" PATH)
27+
option(PRECISION_MISSIONS_INCLUDE_DIR "WARNING: for custom precision-missions library only, point to headers location" PATH)
28+
# Dependencies include Eigen and csv
29+
option(PRECISION_MISSIONS_DEPENDENCIES_DIR "WARNING: for custom precision-missions library only, point to dependencies location" PATH)
30+
2231
option(USE_COLLISION_AVOIDANCE "Use DJI collision avoidance library" OFF)
2332
option(USE_POINTCLOUD2LAS "Use DJI pointcloud to LAS converter library" OFF)
2433

contrib/External_DJIModules.cmake

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
if(USE_PRECISION_MISSIONS)
1+
# Check if custom binaries were given
2+
find_package(PrecisionMissions QUIET)
3+
4+
if(NOT PrecisionMissions_FOUND AND USE_PRECISION_MISSIONS)
25
add_definitions(-DUSE_PRECISION_MISSIONS)
36
include(${CMAKE_MODULE_PATH}/External_PrecisionMissions.cmake)
47
endif()

contrib/External_PrecisionMissions.cmake

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,5 @@ ExternalProject_Get_Property(PrecisionMissions source_dir)
2323

2424
# Make sure src/bin directory names do not collide
2525
# with other external projects
26-
set(precision_missions_source_dir ${source_dir}/precision-missions-${VERSION})
27-
include_directories("${precision_missions_source_dir}/inc")
26+
set(precision_missions_source_dir ${source_dir}/precision-missions-${VERSION} CACHE PATH "")
2827

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Find Precision Missions library
2+
find_path(PRECISION_MISSIONS_INCLUDE_DIR
3+
OnboardSDK.h
4+
HINTS ${PRECISION_MISSIONS_INCLUDE_DIR}
5+
NO_DEFAULT_PATH)
6+
7+
find_path(PRECISION_MISSIONS_DEPENDENCIES_DIR
8+
Eigen/Dense
9+
HINTS ${PRECISION_MISSIONS_DEPENDENCIES_DIR}
10+
NO_DEFAULT_PATH)
11+
12+
set(PRECISION_MISSIONS_LIBRARY_NAMES "libmissionplan.a")
13+
find_library(PRECISION_MISSIONS_LIBRARY
14+
NAMES ${LIBLAS_NAMES}
15+
HINTS ${PRECISION_MISSIONS_LIBRARY}
16+
NO_DEFAULT_PATH)
17+
18+
if(EXISTS ${PRECISION_MISSIONS_INCLUDE_DIR})
19+
message(STATUS "Precision Missions include dir set to ${PRECISION_MISSIONS_INCLUDE_DIR}")
20+
endif()
21+
22+
if(EXISTS ${PRECISION_MISSIONS_DEPENDENCIES_DIR})
23+
message(STATUS "Precision Missions dependencies dir set to ${PRECISION_MISSIONS_DEPENDENCIES_DIR}")
24+
endif()
25+
26+
if(EXISTS ${PRECISION_MISSIONS_LIBRARY})
27+
message(STATUS "Precision Missions library set to ${PRECISION_MISSIONS_LIBRARY}")
28+
set(PrecisionMissions_FOUND "YES")
29+
endif()
30+

osdk-core/inc/DJI_API.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ class CoreAPI
634634
void setGlobalNavTestMobileCMD(bool userInput) {globalNavTestMobileCMD = userInput;}
635635
void setVRCTestMobileCMD(bool userInput) {VRCTestMobileCMD = userInput;}
636636

637-
637+
float32_t homepointAltitude;
638638

639639
private:
640640
BroadcastData broadcastData;

osdk-core/src/DJI_API.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ void CoreAPI::init(HardDriver *sDevice, CallBackHandler userRecvCallback, bool u
7575
versionData.fwVersion = 0; //! Default init value
7676
ack_activation = 0xFF;
7777

78+
//! This handles hotfix for Movement Control issue with Z position Control
79+
homepointAltitude = 999999;
80+
7881

7982
//! @todo simplify code above
8083
serialDevice->lockMSG();

osdk-core/src/DJI_App.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <string.h>
1313
#include <stdio.h>
14+
#include <DJI_Flight.h>
1415
#include "DJI_App.h"
1516
#include "DJI_API.h"
1617

@@ -75,6 +76,8 @@ void DJI::onboardSDK::CoreAPI::broadcast(Header *protocolHeader)
7576
enableFlag = (unsigned short *)pdata;
7677
broadcastData.dataFlag = *enableFlag;
7778
size_t len = MSG_ENABLE_FLAG_LEN;
79+
static int currentState = 0;
80+
static int prevState = 0;
7881

7982
//! @warning Change to const (+change interface for passData) in next release
8083
uint16_t DATA_FLAG = 0x0001;
@@ -121,13 +124,40 @@ void DJI::onboardSDK::CoreAPI::broadcast(Header *protocolHeader)
121124
passData(*enableFlag, DATA_FLAG, &broadcastData.ctrlInfo, pdata,
122125
sizeof(CtrlInfoData) - ((versionData.fwVersion < MAKE_VERSION(3,1,0,0)) ? 1 : 0), len);
123126
serialDevice->freeMSG();
124-
125127
/**
126128
* Set broadcast frame status
127129
* @todo Implement proper notification mechanism
128130
*/
129131
setBroadcastFrameStatus(true);
132+
static int counter=0;
130133

134+
//! State Machine for MSL Altitude bug in A3 and M600
135+
//! Handles the case if users start OSDK after arming aircraft (STATUS_ON_GROUND)/after takeoff (STATUS_IN_AIR)
136+
//! Transition from STATUS_MOTOR_STOPPED to STATUS_ON_GROUND can be seen with Takeoff command with 1hz flight status data
137+
//! Transition from STATUS_ON_GROUND to STATUS_MOTOR_STOPPED can be seen with Landing command only for frequencies >= 50Hz
138+
if (strcmp(getHwVersion(), "M100") != 0)
139+
{//! Only runs if Flight status is available
140+
if((*enableFlag) & (1<<11)) {
141+
if (getBroadcastData().pos.health > 3) {
142+
if (getFlightStatus() != currentState) {
143+
prevState = currentState;
144+
currentState = getFlightStatus();
145+
if (prevState == Flight::STATUS_MOTOR_OFF && currentState == Flight::STATUS_GROUND_STANDBY) {
146+
homepointAltitude = getBroadcastData().pos.altitude;
147+
}
148+
if (prevState == Flight::STATUS_TAKE_OFF && currentState == Flight::STATUS_GROUND_STANDBY) {
149+
homepointAltitude = getBroadcastData().pos.altitude;
150+
}
151+
//! This case would exist if the user starts OSDK after take off.
152+
else if (prevState == Flight::STATUS_MOTOR_OFF && currentState == Flight::STATUS_TAKE_OFF) {
153+
homepointAltitude = 999999;
154+
}
155+
}
156+
} else {
157+
homepointAltitude = 999999;
158+
}
159+
}
160+
}
131161
if (broadcastCallback.callback)
132162
broadcastCallback.callback(this, protocolHeader, broadcastCallback.userData);
133163
}

osdk-core/src/DJI_Flight.cpp

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ void Flight::task(TASK taskname, CallBack TaskCallback, UserData userData)
3838
{
3939
taskData.cmdData = taskname;
4040
taskData.cmdSequence++;
41-
4241
api->send(2, encrypt, SET_CONTROL, CODE_TASK, (unsigned char *)&taskData, sizeof(taskData),
4342
100, 3, TaskCallback ? TaskCallback : Flight::taskCallback, userData);
4443
}
@@ -48,14 +47,12 @@ unsigned short Flight::task(TASK taskname, int timeout)
4847
taskData.cmdData = taskname;
4948
taskData.cmdSequence++;
5049

51-
api->send(2, encrypt, SET_CONTROL, CODE_TASK, (unsigned char *)&taskData, sizeof(taskData),
52-
100, 3, 0, 0);
53-
54-
api->serialDevice->lockACK();
55-
api->serialDevice->wait(timeout);
56-
api->serialDevice->freeACK();
57-
58-
return api->missionACKUnion.simpleACK;
50+
api->send(2, encrypt, SET_CONTROL, CODE_TASK, (unsigned char *) &taskData, sizeof(taskData),
51+
100, 3, 0, 0);
52+
api->serialDevice->lockACK();
53+
api->serialDevice->wait(timeout);
54+
api->serialDevice->freeACK();
55+
return api->missionACKUnion.simpleACK;
5956
}
6057

6158
void Flight::setArm(bool enable, CallBack ArmCallback, UserData userData)
@@ -96,9 +93,36 @@ void Flight::setMovementControl(uint8_t flag, float32_t x, float32_t y, float32_
9693
data.flag = flag;
9794
data.x = x;
9895
data.y = y;
99-
data.z = z;
10096
data.yaw = yaw;
101-
api->send(0, encrypt, SET_CONTROL, CODE_CONTROL, &data, sizeof(FlightData));
97+
if(api->getFwVersion() > MAKE_VERSION(3,2,0,0) && api->getFwVersion() < MAKE_VERSION(3,2,15,39)) {
98+
if (flag & (1 << 4)) {
99+
if (api->getBroadcastData().pos.health > 3) {
100+
if(api->homepointAltitude!= 999999) {
101+
data.z = z + api->homepointAltitude;
102+
api->send(0, encrypt, SET_CONTROL, CODE_CONTROL, &data, sizeof(FlightData));
103+
}
104+
} else {
105+
API_LOG(api->getDriver(), STATUS_LOG, "Not enough GPS locks, cannot run Movement Control \n");
106+
}
107+
}
108+
}
109+
else if(api->getFwVersion() == MAKE_VERSION(3,2,100,0)) {
110+
if (flag & (1 << 4)) {
111+
if (api->getBroadcastData().pos.health > 3) {
112+
if(api->homepointAltitude!= 999999) {
113+
data.z = z + api->homepointAltitude;
114+
api->send(0, encrypt, SET_CONTROL, CODE_CONTROL, &data, sizeof(FlightData));
115+
}
116+
} else {
117+
API_LOG(api->getDriver(), STATUS_LOG, "Not enough GPS locks, cannot run Movement Control \n");
118+
}
119+
}
120+
}
121+
else
122+
{
123+
data.z = z;
124+
api->send(0, encrypt, SET_CONTROL, CODE_CONTROL, &data, sizeof(FlightData));
125+
}
102126
}
103127

104128

@@ -213,7 +237,7 @@ void Flight::armCallback(CoreAPI *api, Header *protocolHeader, UserData userData
213237
}
214238
}
215239

216-
void Flight::taskCallback(CoreAPI *api, Header *protocolHeader, UserData userData __UNUSED)
240+
void Flight::taskCallback(CoreAPI *api, Header *protocolHeader, UserData userData)
217241
{
218242
unsigned short ack_data;
219243
if (protocolHeader->length - EXC_DATA_SIZE <= 2)

osdk-wrapper/CMakeLists.txt

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,26 @@ FILE(GLOB SOURCE_FILES inc/*.h src/*.cpp)
2121
add_library(${PROJECT_NAME} ${SOURCE_FILES})
2222

2323
if (USE_PRECISION_MISSIONS AND (${DISTRO_VERSION} STREQUAL "1604"))
24+
# Precision-Missions library requiers RapidJSON
2425
add_dependencies(${PROJECT_NAME} rapidjson)
2526
include_directories("${rapidjson_source_dir}/include")
2627

27-
add_dependencies(${PROJECT_NAME} PrecisionMissions)
28-
include_directories("${precision_missions_source_dir}/inc")
29-
30-
# Local Mission Planning libraries
31-
include_directories("${precision_missions_source_dir}/dependencies")
32-
include_directories("${precision_missions_source_dir}/dependencies/csv")
33-
34-
set(MISSIONPLAN_LIBRARY
35-
"${precision_missions_source_dir}/lib/${TARGET_ARCH}/${DISTRO_VERSION}/libmissionplan.a")
28+
# If you are not using cutom binaries, CMake will download
29+
# pre-duilt binaries and place them in the CMake build directory
30+
if(NOT EXISTS ${PRECISION_MISSIONS_INCLUDE_DIR})
31+
add_dependencies(${PROJECT_NAME} PrecisionMissions)
32+
set(PRECISION_MISSIONS_INCLUDE_DIR "${precision_missions_source_dir}/inc" CACHE INTERNAL "" FORCE)
33+
set(PRECISION_MISSIONS_DEPENDENCIES_DIR "${precision_missions_source_dir}/dependencies" CACHE INTERNAL "" FORCE)
34+
endif()
35+
36+
if(NOT EXISTS ${PRECISION_MISSIONS_LIBRARY})
37+
set(PRECISION_MISSIONS_LIBRARY
38+
"${precision_missions_source_dir}/lib/${TARGET_ARCH}/${DISTRO_VERSION}/libmissionplan.a")
39+
endif()
40+
41+
include_directories("${PRECISION_MISSIONS_INCLUDE_DIR}")
42+
include_directories("${PRECISION_MISSIONS_DEPENDENCIES_DIR}")
43+
include_directories("${PRECISION_MISSIONS_DEPENDENCIES_DIR}/csv")
3644
endif()
3745

3846
if (USE_COLLISION_AVOIDANCE)
@@ -43,16 +51,15 @@ if (USE_POINTCLOUD2LAS)
4351
add_dependencies(${PROJECT_NAME} dji-ros-pointcloud2las)
4452
endif()
4553

46-
4754
set (WRAPPER_LINK_LIBRARIES djiosdk-core djiosdk-platform)
4855

4956
if (LIDAR_LOGGING)
5057
set(WRAPPER_LINK_LIBRARIES ${WRAPPER_LINK_LIBRARIES} vlp16lidar-driver)
51-
#target_link_libraries(${PROJECT_NAME} djiosdk-core vlp16lidar-driver djiosdk-platform ${MISSIONPLAN})
58+
#target_link_libraries(${PROJECT_NAME} djiosdk-core vlp16lidar-driver djiosdk-platform ${PRECISION_MISSIONS_LIBRARY})
5259
endif()
5360

5461
if (USE_PRECISION_MISSIONS)
55-
set(WRAPPER_LINK_LIBRARIES ${WRAPPER_LINK_LIBRARIES} ${MISSIONPLAN_LIBRARY})
62+
set(WRAPPER_LINK_LIBRARIES ${WRAPPER_LINK_LIBRARIES} ${PRECISION_MISSIONS_LIBRARY})
5663
endif ()
5764

5865
target_link_libraries(${PROJECT_NAME} ${WRAPPER_LINK_LIBRARIES})

sample/Linux/Blocking/CMakeLists.txt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,22 @@ if (LIDAR_LOGGING)
1818
include_directories(../../../sensor-integration/velodyne_vlp16puck_lite_API_example/vlp16lidar-driver/inc)
1919
endif ()
2020

21-
if (USE_PRECISION_MISSIONS)
22-
include_directories("${precision_missions_source_dir}/inc")
23-
24-
# Local Mission Planning libraries
25-
include_directories("${precision_missions_source_dir}/dependencies")
26-
include_directories("${precision_missions_source_dir}/dependencies/csv")
27-
endif()
28-
2921
FILE(GLOB SOURCE_FILES inc/*.h src/*.cpp)
3022
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
3123

3224
add_dependencies(${PROJECT_NAME} djiosdk-wrapper)
3325

26+
if(USE_PRECISION_MISSIONS)
27+
include_directories("${PRECISION_MISSIONS_INCLUDE_DIR}")
28+
include_directories("${PRECISION_MISSIONS_DEPENDENCIES_DIR}")
29+
include_directories("${PRECISION_MISSIONS_DEPENDENCIES_DIR}/csv")
30+
endif()
31+
3432
set(BLOCKING_LINK_LIBRARIES djiosdk-core djiosdk-platform djiosdk-wrapper)
3533

3634
if(LIDAR_LOGGING)
3735
set(BLOCKING_LINK_LIBRARIES ${BLOCKING_LINK_LIBRARIES} vlp16lidar-driver)
38-
#target_link_libraries(${PROJECT_NAME} vlp16lidar-driver djiosdk-core djiosdk-platform djiosdk-wrapper ${MISSIONPLAN})
36+
#target_link_libraries(${PROJECT_NAME} vlp16lidar-driver djiosdk-core djiosdk-platform djiosdk-wrapper ${PRECISION_MISSIONS_LIBRARY})
3937
endif()
4038

4139
target_link_libraries(${PROJECT_NAME} ${BLOCKING_LINK_LIBRARIES})

0 commit comments

Comments
 (0)