基于Dji M600-PRO的Onboard-SDk-ROS入门应用之———航点记录与自主飞行

         从学习dji-osdk到现在大概二十天左右,基本上是0基础学习这个东西,以前就用过一些51和stm32,Linux操作系统就会一些简单的操作指令,就这么点基础,然后开始学习OSDK。希望我的这篇文章可以帮助刚开始学习dji-sdk的你,因为我也是刚开始学习,所以可能会有很多错误,希望各位能够批评指正。

       首先来说一下OSDK-ROS,OSDK英文全拼就是Onboard Software Development kit(板载软件开发包),ROS就是Robot Operating System(机器人操作系统)。大疆的软件开发包有两种,带ROS和不带ROS的,带ROS就是这个软件开发包是基于机器人操作系统这个平台上运行的,而不带ROS的就相当于在“裸板”上运行的,我用的是带ROS3.2版本的,至于为什么用带ROS的,因为我不带ROS的版本运行例程没成功。。。。 而为什么用3.2,因为Dji M600暂时支持的最高版本就是3.2, 3.3版本的不知道什么时候能用,固件一直没更新,嗯,这个问题先不讨论。3.2带ROS的OSDK运行例程的步骤你可以看他的官网介绍,也可以看点击打开链接这篇文章,这些你都会了之后,就可以自己diy了。 

        我们第一步要打开例程源码,源码放在Onboard-SDK-3.2/build/catkin_ws/src/Onboard-SDK-ROS-3.2/dji_sdk_demo/src/client.cpp(隐藏的很深啊)。推荐你下载一个叫Kdeveloper的软件打开这个源码,这个软件比较好用,它能识别你的整个工程文件,在整个工程里找到函数定义或使用的地方。第一次打开你会发现,啊,程序好长,一大坨,其实大多数不用管,找到你要用的api函数就行了,3.2版本带ROS的sdk能用的api函数都在drone.h这个文件里,这里面定义了一个DJIDrone的大类,里面也很乱,看不懂,没关系,一直往下找,直到你发现了这个函数,

bool activate() ;激活飞机,下面还有检查版本号,起飞,降落,回家等功能的api函数,想要实现这些函数的功能,直接在主函数调用就行,具体调用方法就像例程里写的,drone->函数;,当然在这之前你要先获取控制权,也就是

 要先调用一下 request_sdk_permission_control()这个函数,先获取控制权,然后你就可以为所欲为了。除了上面说的,还有两个比较实用的函数,一个是bool attitude_control(unsigned char ctrl_flag, float x, float y, float z, float yaw)飞机的姿态控制函数,第一个控制位可以在dji官网上找,链接是https://developer.dji.com/onboard-sdk/documentation/appendix/index.html。里面除了介绍这个控制位外还介绍了sdk可以读取到的飞机数据,数据的类型以及范围等等。第二个重要函数就是bool local_position_control(float x, float y, float z, float yaw) 本地位置控制。知道了怎么控制飞机,那第二步就是要读取飞机数据了。可以读取的数据在程序里面存放的地方也是drone.h文件里,在稍微靠上面一点的位置。

基于Dji M600-PRO的Onboard-SDk-ROS入门应用之———航点记录与自主飞行_第1张图片

就是这些。比如你想读取本地位置local_position,而local_position包含哪些内容呢,你可以点到LocalPosition定义的那个地方去,然后你会发现你可以读取到的值有x,y,z。这三个值分别是相对于你起始地点的偏差值。你如果想得到x值,读取方法就是drone->local_position.x,读取y值就是drone->local_position.y其他的同理。

     关于我写的第一个小应用程序——航点记录与自主飞行,里面用到的api函数有request_sdk_permission_control(),local_position_control(),读取的数据有local_position的x,y,z的值,还有gare值,用到的函数不多,数据也不多,实现的功能为:在飞机高度为1~2米之间可以选择飞机的飞行模式,普通航点记录模式还是自主飞行模式,选择方式就是起落架的拨档开关,记录航点也是起落架的拨档开关,至于是实现哪个功能看你的飞行高度而定,1~2米是模式选择,两米以上是记录航点。第一次起飞后要飞到高于两米的地方(默认是记录航点模式,注意不要在1~2米间记录航点),飞到第一个点后掰下并掰回起落架的开关,飞机记录下此时航点,然后飞到下一个位置记录下一个航点,航点个数不限。等把需要飞到的航点记录完成后,飞机飞到高度为1~2米之间的距离,掰下并掰回起落架的开关,飞机开始进入自主飞行模式,依次飞到你所记录的航点。程序如下:

white(1)  

 {
    ros::spinOnce();    
    high=drone->local_position.z;
    gares=drone->rc_channels.gear;
    printf("gare: %d \n",gares);
    printf("high: %d \n",high);
    if((high==1)&&((drone->rc_channels.gear)==-10000) )
    setup=799;

 if(   (setup==799)&&((drone->rc_channels.gear)==-5000)    )
 {
 printf("NOW,Start autoflight \n");
 drone->request_sdk_permission_control();
 sigh=0;
 }   
    if((high==1)&&(setup==0))
    {
      printf("You Are In Normal Flight\n");
      sigh=1;
    }
    sleep(1);
if(sigh==0)
{
   for(int j=0;j    {
                for(int i = 0; i < 1000; i ++)
{   
   ros::spinOnce();
   drone->local_position_control(position[j][0] ,position[j][1] ,position[j][2], 0);
   usleep(20000);  
 x_center=drone->local_position.x;
 y_center=drone->local_position.y;
 z_center=drone->local_position.z;
 if(  (fabs(position[j][0]-x_center)<2)&&(fabs(position[j][1]-y_center)<2)&&(fabs(position[j][2]-z_center)<2)  )
 break;
}
printf("You have arrived point %d\n",j+1);
   }
   setup=0;
   sigh=1;
}              
 //normalflight mode
if(sigh==1)
{
     if(  (high!=1)&&((drone->rc_channels.gear)==-10000)  )
     setup=999;
     if(   (setup==999)&&((drone->rc_channels.gear)==-5000)     )   //rc gare channel increase once
     {
     printf("You Have Rember Point %d \n",time1+1);
     position[time1][0]=drone->local_position.x;
     position[time1][1]=drone->local_position.y;
     position[time1][2]=drone->local_position.z;
     printf("x :%d \n",position[time1][0]);
     printf("y :%d \n",position[time1][1]);
     printf("z :%d \n",position[time1][2]);
     time1++;
     setup=0;
     }
}     
  }

程序很简单也不长,我就不解释了

现在遇到的问题是还有好多函数不知道是干嘛的,还有里面好多回调函数到底在哪调用了,以及调用下面这些函数是具体是干嘛用的,都不明白,还希望各路大神来详细讲解讲解。在此谢过了。

基于Dji M600-PRO的Onboard-SDk-ROS入门应用之———航点记录与自主飞行_第2张图片

你可能感兴趣的:(ROS)