【control manager】多控制器管理与切换的方法

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理


前言

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

本文先对多控制器管理与切换的方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章


提示:以下是本篇文章正文内容

一、创建一个控制器manager的管理器类

控制器manager的管理器可一对多个控制器进行管理和切换,如PID控制器、MPC控制器、pure_persuit控制器、旋转控制器等等

class ControllerComponent{
    
    
 public:
 // 构造函数,实例化一个对象的时候会调用
  ControllerComponent()

//订阅控制输入(带控制类型)

//订阅反馈输入(位姿信息)

//控制器manager初始化
 bool initialize() ;

//控制器定时周期处理函数--周期调用
 bool process() 

 private:
  // control data
  bool new_sequence = false;

  // config

  // log
 ;

}

.
.

二、定义控制器类型

enum class ControlType {
    
    
  VERTICAL_VEL,		//垂直速度PID控制器
  VERTICAL_POS,		//垂直位置PID控制器
  HORIZONTAL,		//水平速度PID控制器
  YAW,				//航向角yaw位置逻辑控制器
  YAW_RATE,			//航向角速度PID控制器
  CLEAN,			//清除控制数据-none控制器
  PURE_PERSUIT,		//纯跟踪控制器
  ROTATION,			//旋转控制器
  TRACKING			//跟人逻辑控制器
};

.
.

三、初始化控制器manager

bool ControllerComponent::initialize() {
    
    
  // 在构造函数就进行订阅发布:(1)控制输出、(2)控制序列输入XAG_CONTROL_INPUT、(3)反馈输入XAG_POSE
  return true;
}

.
.

四、运行控制器manager

bool ControllerComponent::process() {
    
    
  PrintHeartbeat();  // 打印控制心跳

  // 订阅控制输入(若更新了)
 if (control_input_message_.entity(control_input_))   // 获取控制序列输入到control_input_(control_input_是一系列控制数组序列)
{
    
    
 // 若控制输入为空,直接退出
    if (control_input_.empty()) {
    
     
     cont << "control_empty"<< endl;
     return true;
   }
   else
   {
    
    
   new_sequence = true;
   }
   
// 若控制输入不为空,分离控制序列的控制类型与控制数据
//tips:根据控制器功能来写

}


  // 反馈输入(若更新了),并获取到control_input_,设置了相关标志位
  if (pose_data_message_.entity(pose_control_) && new_sequence == true) 
  {
    
    
	// 1. get control type after interpolation
    // 2. switch control type
    // 3. calculate control output and send
 	switch (current_controltype) {
    
    
 	 case ControlType::TRACKING:{
    
    
 	 	//(1)打印现在是运行什么控制器
 	    // cout <<"tracking control "<< endl;
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }

 	 case ControlType::ROTATION:{
    
    
 	 	//(1)打印现在是运行什么控制器
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }
      
 	 case ControlType::PURE_PERSUIT:{
    
    
 	 	//(1)打印现在是运行什么控制器
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }

 	 case ControlType::VERTICAL_VEL:{
    
    
 	 	//(1)打印现在是运行什么控制器
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }
      
 	 case ControlType::VERTICAL_POS:{
    
    
 	 	//(1)打印现在是运行什么控制器
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }

 	 case ControlType::HORIZONTAL:{
    
    
 	 	//(1)打印现在是运行什么控制器
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }
 	 case ControlType::YAW:{
    
    
 	 	//(1)打印现在是运行什么控制器
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }

 	 case ControlType::CLEAN:{
    
    
 	 	//(1)打印现在是运行什么控制器
        
        //(2)对应控制器处理 
        
        //(3)发送对应对应控制器的控制输出
        // SendControlOutput(control_signal_);
        break;
      }
      default:
        break;
    }
  }
  return true;
}


五、对应类型的控制器实现

一般每种类型的控制器单独创建一个类实现,如

PID_Position_Controller

参考我的博客
https://blog.csdn.net/qq_35635374/article/details/121155753

Tracking_Controller

跟人的控制器我是逻辑实现的,没有什么算法可言

PurePursuit_Controller

参考我的博客
https://blog.csdn.net/qq_35635374/article/details/120704494


总结

一个机器人一般不仅仅只有一个控制器就可以满足其所有的运动效果,这是一个对机器人福哦控制器简单管理的一种方法

猜你喜欢

转载自blog.csdn.net/qq_35635374/article/details/121745509