基于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运行例程的步骤你可以看他的官网介绍,也可以看点击打开链接这篇文章(一个开学大二的学弟写的,介绍很详细,6得不行),好了,这些你都会了之后,就可以自己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文件里,在稍微靠上面一点的位置。
就是这些。比如你想读取本地位置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<time1;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;
}
}
}
程序很简单也不长,我就不解释了
现在遇到的问题是还有好多函数不知道是干嘛的,还有里面好多回调函数到底在哪调用了,以及调用下面这些函数是具体是干嘛用的,都不明白,还希望各路大神来详细讲解讲解。在此谢过了。