drone由于版本问题被淘汰了。
后续很多环境都没有drone这个头文件。
这里将说明一些比较经典的控制代码
Onboard-SDK: Unofficial mirror - Gitee.com这里能找到很多头文件,可以帮助理解。
ros上有很多教程,都可以去学
dji_sdk/Tutorials/Getting Started - ROS Wiki
dji_sdk/Tutorials/Running the flight control sample code - ROS Wiki
善用wiki.ros上的搜索,一堆好东西
飞控最简单的方法就是通过dji_sdk.h发布一些控制指令
其中最为有用的就是/dji_sdk/flight_control_setpoint_generic (sensor_msgs/Joy)
这个话题的发布可以控制UAV。
只要查看相关的demo就写一个最简单的一段能控制M100的代码(简化版)
GitHub - dji-sdk/Onboard-SDK at 3.8
这里能找到demo_flight_control.cpp
首先就是照着demo抄一些头文件的声明,主函数各种订阅等,还有附带的回调函数。(里面是通过同名头文件里面定义的类以及gps_callback里面写的控制函数来实现控制的。)
个人观感有点绕。所以这里将gps_callback里面的控制函数删去,保留其存储订阅的位置信息的功能。
定义一个void flycontrol()函数。这里首先先声明函数,然后在ros::spinOnce()的循环里直接调用flycontrol函数,这样每次利用spin函数刷新订阅消息时,都能够实时发布指令控制无人机。具体如下:
#include "头文件们"
***各类声明***
void flycontrol();
int main()
{
***各类订阅和请求服务等***
***请求权限、M100起飞等***
ros::Rate loop_rate(10);
while (ros::ok())
{
ros::spinOnce();
flycontrol();
loop_rate.sleep();
}
return 0;
}
***CallBacks***
***各类请求许可的具体函数***
flycontrol函数内容如下:利用主函数里的loop_rate(10)以及while循环,可以控制飞行时间。
int count=0;
uint8_t flag = (DJISDK::VERTICAL_VELOCITY |
DJISDK::HORIZONTAL_VELOCITY |
DJISDK::YAW_RATE |
DJISDK::HORIZONTAL_GROUND |
DJISDK::STABLE_ENABLE);
void flycontrol()
{
if (takeoff_result)
{
if (count<50) count++;
else if(count<200)
{
sensor_msgs::Joy controlVelYawRate;
controlVelYawRate.axes.push_back(1);
controlVelYawRate.axes.push_back(0);
controlVelYawRate.axes.push_back(0);
controlVelYawRate.axes.push_back(0);
controlVelYawRate.axes.push_back(flag);
ctrlBrakePub.publish(controlVelYawRate);
}
else
{
dji_sdk::DroneTaskControl droneTaskControl;
droneTaskControl.request.task = 6;
drone_task_service.call(droneTaskControl);
if(droneTaskControl.response.result)
{
ROS_INFO("landing!!");
}
}
}
}
这里同样运用了flag的知识,与drone类似。这段飞控代码就是飞机起飞后5s,以1m/s的速度向x方向(East)飞去15s,然后land。