一、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> ControllerVector;
typedef std::map<std::string, boost::shared_ptr> ControllerMap;
void clear();
template
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> custom_start_stop_requests_;
std::vector<boost::function> controller_change_callbacks_;
};
四、ControllerLoader類詳解
ControllerLoader類主要負責控制器的載入工作,它提供了從插件目錄載入控制器的方法。
此外,ControllerLoader還定義了Controller對象的標識符,這個標識符是Controller名稱和Controller類型組合而成的字元串。
class ControllerLoader
{
public:
ControllerLoader(const std::string& name, const std::string& type,
const std::vector& 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 getInterfaces() const { return interfaces_; }
BaseControllerPtr createInstance();
private:
std::string name_;
std::string type_;
std::vector 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 listLoadedControllers() = 0;
virtual std::vector listRunningControllers() = 0;
virtual bool switchController(const std::string& start, const std::string& stop) = 0;
virtual boost::shared_ptr getTime() = 0;
virtual bool waitForRunning(const ros::Duration& timeout) = 0;
virtual ros::Time getTimeOfLastControlLoop() = 0;
template
void advertiseCommand(const std::string& name, unsigned int command_queue_size);
template
void advertiseState(const std::string& name, unsigned int state_queue_size);
template
void setCommand(const std::string& name, const MsgType& command_msg);
template
boost::shared_ptr getState(const std::string& name);
};
七、總結
以上是對ControllerManager的詳細闡述,ControllerManager是ROS機器人控制中最為核心和基礎的組件之一,它實現了控制器的管理、控制器的載入以及機器人關節控制功能。
通過以上介紹,你可以了解到如何使用ControllerManager更高效地實現機器人的控制,以及可能出現的問題和應對方法。
ControllerManager是ROS機器人控制的有力保障,它使機器人控制更簡單、更規範、更易於維護。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242434.html
微信掃一掃
支付寶掃一掃