ROS控制M100(九、dji_sdk/dji_sdk_node.h与3.3版本后的飞控程序)

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的代码(简化版)

https://github.com/dji-sdk/Onboard-SDK-ROS/blob/3.8/dji_sdk_demo/include/dji_sdk_demo/demo_flight_control.h

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值