无人机定点悬停,这样可行吗?
用遥控器控制无人机时,根据目标位置和当前无人机的位置,不断调整油门和控制左右的遥杆,使无人机基本实现定点悬停(控制效果主要看个人技术),如果能知道无人机的三维坐标,通过算法直接调整调整油门和控制左右的遥杆对应变量的赋值,能否实现自动定位悬停? 无人机当不碰遥控器的时候就是悬停 其实问题的关键就是如何实时、准确的获取自己的当前位置。GPS是米级别的误差,陀螺仪本身有偏置、温漂还会受到震动影响,气压计受温度和气流影响
如何将不同传感器的数据融合到一起,这是个学问
一旦知道自己的位置,就像你说的,控制4个电机就行了,当然,这还是一门学问 JY-MCU 发表于 2019-7-29 19:50
无人机当不碰遥控器的时候就是悬停
我的无人机没有像超声波传感器或者气压计这类可测高的传感器,所以不能实现定高 zgxcom123 发表于 2019-7-29 19:55
其实问题的关键就是如何实时、准确的获取自己的当前位置。
GPS是米级别的误差,陀螺仪本身有偏置、温漂还会 ...
那么关键是实现三维定位,如果在定位实现的前提下,那我的这个想法或者做法是可实现的。可否这样理解? 记得是要加光流传感器,或UWB之类的辅助站 Himem 发表于 2019-7-29 20:08
记得是要加光流传感器,或UWB之类的辅助站
看到一些论文用光流传感器实现无人机悬停 这个已经很容易了。开源飞控做的很好了。 ttoto 发表于 2019-7-29 20:21
这个已经很容易了。开源飞控做的很好了。
能否给个链接 那个几百架飞行器组成图案的不就是定点吗? 网络攻城师 发表于 2019-7-29 20:28
那个几百架飞行器组成图案的不就是定点吗?
没错,但是不知道是怎么实现的。 余松灿 发表于 2019-7-29 20:31
没错,但是不知道是怎么实现的。
他们有自己的算法吧,不是一般的飞控,每架飞行器相互握手协议?超声波测距?GPS补偿?我也不懂
便宜飞控也就50元起,淘宝一大把,里面就是陀螺仪,能保持平稳,因为四轴多轴,斜了就会飞走,便宜的也能自己静止不动。
还有先进点的带GPS补偿的。比如大疆的,300元起,你要是做什么试验可以买来试试,也有很多开源的飞控 外国好多试验,用预先放置好的多点摄像头检测反馈,在房间里,可以飞各种特技。很炫酷,一个响指,呼拉一群飞行器在你身后,帅的一比{:lol:} 网络攻城师 发表于 2019-7-29 20:37
他们有自己的算法吧,不是一般的飞控,每架飞行器相互握手协议?超声波测距?GPS补偿?我也不懂
便宜飞 ...
我买的飞控188,不能悬停{:titter:} 。起飞之后左右飘。 余松灿 发表于 2019-7-29 20:43
我买的飞控188,不能悬停 。起飞之后左右飘。
你没校准吧?要放平,自检校准啥的,各家都不一样。。你问问卖家,188元不算最差,微风时也不至于乱漂
好几年前玩过四轴,现在不玩了,到处禁飞{:sweat:} 网络攻城师 发表于 2019-7-29 20:50
你没校准吧?要放平,自检校准啥的,各家都不一样。。你问问卖家,188元不算最差,微风时也不至于乱漂
...
看来我没买到靠谱的飞控{:titter:} 。它程序是由校准的,而且通过遥控器按键再次校准。卖家告诉如果飞不稳通过遥控器按键调整,比如起飞往前飘,就用按键按几下,再试飞再调整。。。。。。 余松灿 发表于 2019-7-29 20:22
能否给个链接
pixhawk + pxflow 网络攻城师 发表于 2019-7-29 20:50
你没校准吧?要放平,自检校准啥的,各家都不一样。。你问问卖家,188元不算最差,微风时也不至于乱漂
...
在初始化的过程中会调用如下的函数,这个就是校准吧?
void MpuGetOffset(void) //校准
{
int32_t buffer={0};
int16_t i;
uint8_t k=30;
const int8_t MAX_GYRO_QUIET = 5;//限制前后两次陀螺仪输出的偏差范围
const int8_t MIN_GYRO_QUIET = -5;
/* wait for calm down */
int16_t LastGyro = {0};
int16_t ErrorGyro;
/* set offset initial to zero */
memset(MpuOffset,0,12);
MpuOffset = 8192; //set offset from the 8192因为Z轴静止时也是有值的。
//在获取参考值时禁止系统调度时钟,即获取到陀螺仪加速度计的参考值之后再开始大循环
//在校准过程中关闭TIM3
TIM_ITConfig(//使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update ,
DISABLE//使能
);
while(k--)//30次前后两次输出的偏差都在范围内
{
do
{
delay_ms(10);
MpuGetData();
for(i=0;i<3;i++)
{
ErrorGyro = pMpu - LastGyro;
LastGyro = pMpu;
}
}while ((ErrorGyro >MAX_GYRO_QUIET )|| (ErrorGyro < MIN_GYRO_QUIET)
||(ErrorGyro > MAX_GYRO_QUIET )|| (ErrorGyro < MIN_GYRO_QUIET)
||(ErrorGyro > MAX_GYRO_QUIET )|| (ErrorGyro < MIN_GYRO_QUIET)
);//不在限制范围内则一直循环
}
/* throw first 100group data and make 256 group average as offset */
for(i=0;i<356;i++)//一共获取356次,舍弃前100次,用后256次的平均值作为参考值
{
MpuGetData();
if(100 <= i)
{
uint8_t k;
for(k=0;k<6;k++)
{
buffer += pMpu;
}
}
}
for(i=0;i<6;i++)
{
MpuOffset = buffer>>8;
}
TIM_ITConfig(//使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update ,
ENABLE//使能
);
}
页:
[1]