dronekit控制实体无人机起飞降落

摘要:本文基于dronekit在实体无人机上实现最基本的起飞和降落,测试了这一过程中速度的变化以及起落位置的偏移。

实体实验环境

  • 树莓派4B
  • Ubuntu mate 20.04
  • 飞控Pixhawk 2.4.8
  • 飞控固件APM
  • Python3.7

dronekit对常用的指令进行了简单封装,比如提供了simple_takeoff、simple_goto等API。这使得大部分任务可以不用通过手动发送mavlink指令来完成。然而,这些API直接使用也不太方便,因为这些API常常是异步的,直接使用会在没有到达目标状态下就继续执行之后的命令。文档的Examples中给出了很多用例函数,再次将这些简单的API封装,我们可以用这里面提供的函数。

起飞降落方法

Examples中的takeoff调用了simple_takeoff完成起飞,同时加入了很多合法性检测,比如无人机是否arm等。使用takeoff时,我们需要传入起飞的高度。达到预定高度后,无人机才会执行后续指令。

降落没有一个固定的函数,将无人机改为LAND模式即可。例程中一般只有下面一句指令,但是并没有保证这句话飞控一定会收到。事实上,在仿真时也发生过没有收到而高度一直不变的情况,这里建议多发几次,或判断状态是否改变。

vehicle.mode= VehicleMode("LAND")

除此之外,也可以通过速度控制不断给无人机发送向下的速度来实现。冬天的时候我们曾经用LAND模式下降,下降到地面后依然不停,非常容易侧翻。夏天用同样的方法则不会出现上述现象。分析原因,气压计等定位传感器在冬天比较冷的时候会有漂移,导致飞控认为自己还没有将到地面。因此,我们会采用将模式调到自稳并把油门逐渐打到零来降落。

实验结果

起降速度

起飞和降落模式都没有可以调节的速度。以起飞为例,源代码中只不过是发送了MAV_CMD_NAV_TAKEOFF的指令1。这个调节的过程是在飞控中完成的。

为了测试无人机自主起飞降落的速度,我们使无人机飞到一定高度,并时通过以下代码刻获取无人机的速度。

print("Velocity: %s" % vehicle.velocity)

经过多次起飞和降落测试,无人机速度都能够自主调节先增后减。起飞时,目标高度,更够达到的最大速度也不同。根据观察,起飞速度可以达到非常快。下降过程中,我们可以看到实时输出的速度如下所示

Velocity: [0.15, -0.08, 0.5]

高于1m时z轴下降速度的基本维持在0.5m/s,1m以下速度逐渐减慢。

奇怪的是,输出的速度仿真中下降速度是负的,上升是正的。但是在实际飞行中,速度的符号正好相反。

起降偏移

理想的起飞降落都是竖直的,然而,即便起飞前对飞控罗盘进行校准,无人机起降位置还是有一定偏移。经过测试,没有校准、风速较大或稍微倾斜的起飞都会让这个偏移更大。起飞高度不同,偏移也不同。我们飞到10m后下降大概会偏移3m。

参考文献


  1. https://github.com/dronekit/dronekit-python/blob/master/dronekit/__init__.py ↩︎

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用mavros控制无人机起飞降落的C++代码示例: ```cpp #include <ros/ros.h> #include <mavros_msgs/CommandBool.h> #include <mavros_msgs/CommandTOL.h> #include <mavros_msgs/SetMode.h> int main(int argc, char **argv) { ros::init(argc, argv, "takeoff_landing"); ros::NodeHandle nh; // 创建发布器 ros::Publisher arming_client = nh.serviceClient<mavros_msgs::CommandBool>("mavros/cmd/arming"); ros::Publisher takeoff_client = nh.serviceClient<mavros_msgs::CommandTOL>("mavros/cmd/takeoff"); ros::Publisher land_client = nh.serviceClient<mavros_msgs::CommandTOL>("mavros/cmd/land"); ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode>("mavros/set_mode"); // 设置模式为MANUAL mavros_msgs::SetMode set_mode; set_mode.request.base_mode = 0; set_mode.request.custom_mode = "MANUAL"; set_mode_client.call(set_mode); // 解锁 mavros_msgs::CommandBool arm_cmd; arm_cmd.request.value = true; arming_client.call(arm_cmd); // 等待解锁 while (!arm_cmd.response.success) { arm_cmd.response.success = false; arm_cmd.response.result = ""; ROS_INFO("Waiting for arming..."); arming_client.call(arm_cmd); ros::Duration(1.0).sleep(); } // 起飞 mavros_msgs::CommandTOL takeoff_cmd; takeoff_cmd.request.altitude = 3; // 设置起飞高度 takeoff_client.call(takeoff_cmd); // 等待起飞 while (!takeoff_cmd.response.success) { takeoff_cmd.response.success = false; takeoff_cmd.response.result = ""; ROS_INFO("Waiting for takeoff..."); takeoff_client.call(takeoff_cmd); ros::Duration(1.0).sleep(); } // 降落 mavros_msgs::CommandTOL land_cmd; land_cmd.request.altitude = 0; // 设置降落高度 land_client.call(land_cmd); // 等待降落 while (!land_cmd.response.success) { land_cmd.response.success = false; land_cmd.response.result = ""; ROS_INFO("Waiting for landing..."); land_client.call(land_cmd); ros::Duration(1.0).sleep(); } // 上锁 arm_cmd.request.value = false; arming_client.call(arm_cmd); return 0; } ``` 请注意,这仅仅是一个简单的示例,实际使用中可能需要根据具体需求进行修改和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值