ControllerManager详解

发布时间:2023-05-19

ControllerManager简介

ControllerManager是ROS中的一个核心组件,主要负责管理机器人中所有的控制器,是机器人控制的核心。 ControllerManager通过统一接口提供给用户控制机器人各个关节的位置、速度、加速度等命令,并且可以方便地添加或切换控制器,以便实现不同的控制策略。 在ROS控制系统中,ControllerManager是robot_control节点的一部分。

ControllerManager架构

ControllerManager架构主要包含以下三个部分:

  1. ControlManager类:控制器管理类
  2. ControllerLoader类:控制器加载类
  3. Controller类:控制器模型类

ControlManager类详解

ControlManager类是ControllerManager的核心类,主要负责以下几个方面的工作:

  1. 管理所有Controller对象,包括加载和卸载Controller对象。
  2. 负责请求Controller对象来执行控制算法。
  3. 维护Controller对象集合,请注意每个Controller对象都是一个独立的线程。
class ControlManager
{
public:
  ControlManager(ros::NodeHandle& nh, ros::NodeHandle& pnh);
  virtual ~ControlManager();
  bool loadController(const std::string& name);
  bool unloadController(const std::string& name);
  bool switchController(const std::string& start, const std::string& stop);
  void update(const ros::Time& time, const ros::Duration& period);
private:
  typedef std::vector<boost::shared_ptr<BaseController> > ControllerVector;
  typedef std::map<std::string, boost::shared_ptr<BaseController> > ControllerMap;
  void clear();
  template <class T>
  bool loadController(const std::string& name, const std::string& type, const ros::NodeHandle& nh, const ros::NodeHandle& pnh);
  std::string name_;
  ros::NodeHandle nh_;
  ros::NodeHandle pnh_;
  std::string robot_namespace_;
  std::string joint_state_topic_;
  ros::Subscriber state_sub_;
  ControllerVector controllers_;
  ControllerMap running_;
  ControllerMap loaded_;
  ros::Duration publish_period_;
  ros::Time publish_time_;
  std::vector<std::function<void()> > custom_start_stop_requests_;
  std::vector<boost::function<void()> > controller_change_callbacks_;
};

ControllerLoader类详解

ControllerLoader类主要负责控制器的加载工作,它提供了从插件目录加载控制器的方法。 此外,ControllerLoader还定义了Controller对象的标识符,这个标识符是Controller名称和Controller类型组合而成的字符串。

class ControllerLoader
{
public:
  ControllerLoader(const std::string& name, const std::string& type,
                   const std::vector<std::string>& interfaces,
                   const ros::NodeHandle& nh, const ros::NodeHandle& pnh);
  virtual ~ControllerLoader() {}
  std::string getName() const { return name_; }
  std::string getType() const { return type_; }
  std::vector<std::string> getInterfaces() const { return interfaces_; }
  BaseControllerPtr createInstance();
private:
  std::string name_;
  std::string type_;
  std::vector<std::string> interfaces_;
  ros::NodeHandle nh_;
  ros::NodeHandle pnh_;
};

Controller类详解

Controller类是ControllerManager中最核心的组件之一,它是与机器人关节接口的一种实现。 Controller类提供了以下几个方面的功能:

  1. 接收来自ControlManager的命令,执行关节的运动控制
  2. 提供接口以接收控制命令并获取机器人状态
  3. 提供接口查询当前控制状态
class ControllerBase
{
public:
  ControllerBase() {}
  virtual ~ControllerBase() {}
  virtual std::string getJointName() const = 0;
  virtual std::string getJointGroupName() const = 0;
  virtual bool init(hardware_interface::JointHandle joint_handle,
                    ros::NodeHandle& controller_nh) = 0;
  virtual void starting(const ros::Time& time) = 0;
  virtual void update(const ros::Time& time, const ros::Duration& period) = 0;
  virtual void stopping(const ros::Time& time) = 0;
};

ControllerManagerInterface类简介

ControllerManagerInterface类是提供ControllerManager服务的接口类,它定义了所有可供 ControllerManager 着手使用的API。

class ControllerManagerInterface
{
public:
  virtual ~ControllerManagerInterface() {}
  virtual void loadController(const std::string& name) = 0;
  virtual void unloadController(const std::string& name) = 0;
  virtual std::vector<std::string> listLoadedControllers() = 0;
  virtual std::vector<std::string> listRunningControllers() = 0;
  virtual bool switchController(const std::string& start, const std::string& stop) = 0;
  virtual boost::shared_ptr<const ros::Time> getTime() = 0;
  virtual bool waitForRunning(const ros::Duration& timeout) = 0;
  virtual ros::Time getTimeOfLastControlLoop() = 0;
  template <typename MsgType>
  void advertiseCommand(const std::string& name, unsigned int command_queue_size);
  template <typename MsgType>
  void advertiseState(const std::string& name, unsigned int state_queue_size);
  template <typename MsgType>
  void setCommand(const std::string& name, const MsgType& command_msg);
  template <typename MsgType>
  boost::shared_ptr<const MsgType> getState(const std::string& name);
};

总结

以上是对ControllerManager的详细阐述,ControllerManager是ROS机器人控制中最为核心和基础的组件之一,它实现了控制器的管理、控制器的加载以及机器人关节控制功能。 通过以上介绍,你可以了解到如何使用ControllerManager更高效地实现机器人的控制,以及可能出现的问题和应对方法。 ControllerManager是ROS机器人控制的有力保障,它使机器人控制更简单、更规范、更易于维护。