
无人机(Unmanned Aerial Vehicle),指的是一种由动力驱动的、无线遥控或自主飞行、机上无人驾驶并可重复使用的飞行器,飞机通过机载的计算机系统自动对飞行的平衡进行有效的控制,并通过预先设定或飞机自动生成的复杂航线进行飞行,并在飞行过程中自动执行相关任务和异常处理。
在前面的博客中,分析了 rotors_simulator 一个开源的无人机gazebo的仿真系统的一个控制接口(roll、pitch、yawrate、thrust),并通过键盘发布控制指令,使飞机飞了起来,但是真正实验过的人则知道,起控制会飞常难,需要一直调整键盘,稍微一不注意,无人机就飞走了。
其原因就是这个接口在无人机内部并没有位置控制的闭环。
在这篇文章中,分析了自动控制原理;并在这篇文章中分析了无人机各种模式的控制框图。
在前面的文章中,完成了无人机的水平位置、垂直位置、航向角度的 空间位置控制。
相当于如果有个地面站,就可以完成自动航线,指点飞行等模式了。
无人机还有一个功能就是在悬停模式下,用遥控器控制无人机飞行。本篇博客就利用键盘,在前面做好的位置控制的基础上,做一个基于PID控制器的速度控制。
当有方向按键按下的时候,无人机按期望速度方向飞行,没有方向按键按下,无人机则自动悬停。
功能概述:通过键盘发布 无人机期望速度控制指令,其中速度控制指令包括:
无人机位置控制 解析该4个指令变量,赋值到位置控制控制器的期望速度。
无人机位置控制 将期望位置设置为 当前位置,使得速度控制模式得以实现 。
此模块有开源功能包 :teleop_twist_keyboard
该功能包可发送
geometry_msgs/Twist

发布的话题名称

void PidPositionControllerNode::KeyboardCmdVelCallback(const geometry_msgs::TwistConstPtr& cmdvel_msg)
{
// 取出指令
geometry_msgs::Twist cmd_vel = *cmdvel_msg;
std::cout<< "线速度x : "<<cmd_vel.linear.x <<"|||" <<"线速度y :"<<cmd_vel.linear.y<<"|||" <<"线速度z :"<<cmd_vel.linear.z<<std::endl;
std::cout<< "角速度x : "<<cmd_vel.angular.x <<"|||" <<"角速度y :"<<cmd_vel.angular.y<<"|||" <<"角速度z :"<<cmd_vel.angular.z<<std::endl;
cmd_vel_x_ = cmd_vel.linear.x ;
cmd_vel_y_ = cmd_vel.linear.y ;
cmd_vel_z_= cmd_vel.linear.z ;
cmd_vel_yaw_ = cmd_vel.angular.z ;
}
geometry_msgs/Twist 消息类型的回调函数
将控制指令赋值给 类的私有变量
继续浏览请跳转古月居
详情参考 古月居