05-自动控制方法

一、自动控制原理

1-基础概念

开环控制

开环控制是一种不依赖反馈的控制策略。

在开环控制中,控制系统根据预设的输入指令(如设定的飞行模式、航点等)执行动作,而不考虑实际飞行状态的变化。也就是说,控制系统不会实时监测飞行器的响应来调整控制输入。简单来说,开环控制就是单纯按照事先编程好的指令运行而不做实时调整。

flowchart LR
A["控制器"]
B["执行机构"]
C["被控对象"]
D[" "]
E[" "]
E--给定值--> A --> B  --> C --被控量--> D
  • 优点:实现简单、成本低,适用于稳定环境中。
  • 缺点:无法适应环境变化,外部扰动(如风速变化)或控制器参数不准确时,会导致飞行不稳定或任务失败。

  • 应用:

    1. 简单任务:如短距离飞行、飞行模式切换等,在环境变化较小且预定条件较为稳定的情况下可以使用开环控制。
    2. 飞行器的起飞或定点悬停:在某些简单情况下,飞行器的飞行控制可以通过开环控制来实现,比如飞行器从地面起飞、进行短暂的定点悬停。

开环控制实例(vel_control_node)

1
2
3
4
5
6
7
8
9
10
if (ros::Time::now() - last srv request > ros::Duration(1.0)){
mavros_msgs::SetMode offb_set_mode;
offb_set_mode.request.custom_mode = "OFFBOARD";
if (set mode client,call(offb set mode) && offb_set_mode.response.mode_sent) {
ROS_INFO("offboard enabled");
} else {
ROS_WARN("Failed to enable offboard");
}
last_srv_request = ros::Time::now();
}

这段代码在状态机的case 0状态下,发送了一个命令将飞行模式切换到OFFBOARD。此时并没有任何反馈来调整模式,只是按照时间间隔固定发送命令。

1
2
3
4
5
6
7
8
9
if (ros::Time::now() - last_srv_request > ros::Duration(1.0)){
mavros_msgs::CommandBool arm_cmd;
arm_cmd.request.value = true;
if (arming_client.call(arm_cmd) && arm_cmd.response.success){
ROS_INFO("Vehicle armed");
} else {
ROS_WARN("Failed to arm vehicle");
last_srv_request = ros::Time::now();
}

这段代码在case1状态下,用于控制飞行器的arming操作。这也是基于时间的控制,直接发送命令启用arming,没有依赖于飞行器的状态来调整控制策略。

闭环控制

闭环控制是一种依赖反馈的控制策略。它通过实时监测飞行器的状态(如姿态、位置、速度等)与设定目标进行比较,根据偏差(误差)来调整控制输入,从而实现对飞行器的精确控制。闭环控制系统在飞行中持续进行实时反馈与修正,以确保飞行器能够按照预期轨迹飞行,尽可能减少外部干扰带来的影响。

flowchart LR
A["电位器(比较器)"]
B["放大器"]
C["电动机"]
D["减速器"]
E[" "]
F[" "]
E --> A --> B  --> C --> D --> F --> A
  • 优点:能够自动调整和修正飞行中的误差,确保飞行稳定,适应复杂和动态的飞行环境。
  • 缺点:实现较为复杂,需要更多的计算资源和传感器输入,系统成本较高。

  • 应用:

    1. 航点飞行:无人机按照设定的航点飞行,闭环控制帮助无人机根据实际飞行偏差(如位置误差)进行修正,确保飞行路线准确。
    2. 姿态控制:闭环控制能够根据姿态传感器(如陀螺仪、加速度计)的数据来实时调整飞行器的俯仰、滚转和偏航角度。
    3. 自动避障:利用激光雷达、视觉传感器等反馈信息进行避障,确保无人机避免撞击障碍物。

闭环控制实例(vel_control_node)

1
2
3
4
5
6
if (current_pose.pose.position.z > 1.0) {
fsm_state = 3; // goto move state
last_srv_request = ros::Time::now();
} else {
twist.twist.linear.z = 0.4;
}

这一部分代码监控无人机的高度currentpose.pose.position.z,并根据反馈的高度决定是否进入下一个状态。虽然此处只是一个简单的判断逻辑,但它仍然依赖于飞行器的反馈数据(高度)来决定是否继续加速升高或者切换状态。

1
2
3
4
5
6
7
8
if (getLengthBetweenPoints(hover_target, current_pose.pose.position) > 0.3) {
last_srv_request = ros::Time::now();
}
if (ros::Time::now() - last_srv_request > ros::Duration(3.0)) {
fsm_state = 4; // goto land state
} else { // PID control
twist.twist = get_pid_vel(hover_target);
}

case 3中,无人机通过计算当前位置与目标位置hover target之间的距离,并根据该反馈信息决定是否继续进行PID控制。这是典型的闭环控制,因为控制输入twist.twist是根据当前位置和目标位置之间的误差来动态调整的。get_pid_vel(hover target)是一个利用 PID 控制算法调整无人机速度的函数。


05-自动控制方法
https://pattianfang.github.io/2025/05/05/05-自动控制方法/
作者
Pat Tian Fang
发布于
2025年5月5日
更新于
2025年8月7日
许可协议