ros_control控制真实电机的方法

本文详细介绍了使用ROS控制系统控制真实电机的过程,从硬件选型到软件实现,包括使用Arduino作为中间件,通过L298N电机驱动板控制直流电机,并实现关节状态的读写。同时,讲解了如何配置控制器,利用PID参数调整电机性能。

ros_control控制真实电机的方法


声明:参考 此项目对电机驱动方法进行总结。

需要的硬件

  1. 用于下载程序的单片机,此处使用arduino uno
  2. 电机驱动板,此处使用常规的L298N
  3. 直流电机带编码器/霍尔元件

软件部分

  1. 和硬件交互的robot_hardware_interface.h,作用:声明接口类,构造器添加publisher用于发布关节角度,client用于接收返回角度。需要继承hardware_interface::RobotHW。
    代码如下:
#include <hardware_interface/joint_state_interface.h>
#include <hardware_interface/joint_command_interface.h>
#include <hardware_interface/robot_hw.h>
#include <joint_limits_interface/joint_limits.h>
#include <joint_limits_interface/joint_limits_interface.h>
#include <joint_limits_interface/joint_limits_rosparam.h>
#include <joint_limits_interface/joint_limits_urdf.h>
#include <controller_manager/controller_manager.h>
#include <boost/scoped_ptr.hpp>
#include <ros/ros.h>
#include <rospy_tutorials/Floats.h>
#include <three_dof_planar_manipulator/Floats_array.h>
#include <angles/angles.h>

class ROBOTHardwareInterface : public hardware_interface::RobotHW 
{
   
   
	public:
        ROBOTHardwareInterface(ros::NodeHandle& nh);
        ~ROBOTHardwareInterface();
        void init();
        void update(const ros::TimerEvent& e);
        void read();
        void write(ros::Duration elapsed_time);
        ros::Publisher pub;
        ros::ServiceClient client;
        rospy_tutorials::Floats joints_pub;
        three_dof_planar_manipulator::Floats_array joint_read;
        
    protected:
        hardware_interface::JointStateInterface joint_state_interface_;
        hardware_interface::PositionJointInterface position_joint_interface_;
        hardware_interface::EffortJointInterface     effort_joint_interface_;

        
        joint_limits_interface::EffortJointSaturationInterface effortJointSaturationInterface;
        
        int num_joints_;
        std::string joint_name_;  
        double joint_position_;
        double joint_velocity_;
        double joint_effort_;
        double joint_position_command_;
        double joint_effort_command_;
        double joint_velocity_command_;
        
        ros::NodeHandle nh_;
        ros::Timer non_realtime_loop_;
        ros::Duration elapsed_time_;
        double loop_hz_;
        boost::shared_ptr<controller_manager::ControllerManager> controller_manager_;
};
  1. 类的实现:robot_hardware_interface_node.cpp,在这里向ros注册控制器名称,通过服务的方式实现read方法:在cpp文件中声明客户端向服务器发起请求获得角度返回值。write方法:发布joint_effort_command_(目标值)到/joints_to_arduino话题。此处是定义功能,实际角度发布是在terminal使用rostopic pub发布的,当然也可以直接用脚本发布。注意joint_effort_command_表示目标的effor:

#include <ros_control_example/robot_hardware_interface.h>

ROBOTHardwareInterface::ROBOTHardwareInterface(ros::NodeHandle& nh) : nh_(nh) {
   
   
    init();
    controller_manager_.reset(new controller_manager::ControllerManager(this, nh_));
    loop_hz_=5;
    ros::Duration update_freq = ros::Duration(1.0/loop_hz_);
	
	pub = nh_.advertise<rospy_tutorials::Floats>("/joints_to_aurdino",10);
	client = nh_.serviceClient<three_dof_planar_manipulator::Floats_array>("/read_joint_state");
	
    non_realtime_loop_ = nh_.createTimer(update_freq, &ROBOTHardwareInterface::update, this);
}

ROBOTHardwareInterface::~ROBOTHardwareInterface() {
   
   
}

void ROBOTHardwareInterface::init() 
### ROS `ros_control` 控制系统与控制器开发文档概述 ROS(Robot Operating System)中的 `ros_control` 是一个用于机器人控制的中间件框架,旨在提供一个通用的接口,以实现对机器人硬件的控制。它通过模块化的设计,将硬件抽象、控制器管理以及具体控制算法分离,从而支持多种机器人平台的控制需求 [^1]。 #### 1. `ros_control` 的核心架构 `ros_control` 的主要组件包括以下部分: - **控制器管理器(Controller Manager)**:负责加载、启动、停止和卸载控制器。控制器管理器通过 `/controller_manager` 服务与控制器进行交互 。 - **控制器(Controllers)**:实现具体的控制逻辑,例如 PID 控制器、关节位置控制器等。控制器通过订阅 `/cmd_vel` 或 `/joint_commands` 等主题来接收控制指令 。 - **硬件抽象层(Hardware Interface)**:提供与机器人硬件的抽象接口,使得控制器可以与实际硬件进行交互。在 ROS 2 中,该部分被称为 `Hardware Interface` [^2]。 - **硬件资源(Hardware Resources)**:包括关节、传感器等硬件资源的描述,确保控制器能够访问所需的硬件数据 [^1]。 - **真实机器人的执行器(Actuators)**:最终执行控制指令的物理设备,例如电机、伺服等 。 #### 2. `ros_control` 在 Gazebo 中的实现流程 Gazebo 是 ROS 中常用的机器人仿真平台,`ros_control` 提供了与 Gazebo 的集成接口,以实现仿真环境下的控制功能。以下是典型实现流程: 1. **Gazebo 已经实现了 `ros_control` 的相关接口**:Gazebo 插件支持与 `ros_control` 的通信,使得仿真环境中的机器人可以使用相同的控制逻辑 。 2. **编写 xacro 文件添加传动装置和控制器**:在机器人模型中,使用 xacro 宏定义传动装置(transmission)和控制器配置 。 3. **集成 xacro 文件**:将新创建的 xacro 文件集成到机器人模型的主 xacro 文件中 。 4. **启动 Gazebo 并发布 `/cmd_vel` 消息**:通过发布 `/cmd_vel` 消息,控制机器人在 Gazebo 中的运动 。 5. **使用 Rviz 查看里程计信息**:通过 RViz 工具查看机器人运动状态,包括位置、速度等信息 。 #### 3. ROS 2 中的 `ros2_control` 配置与安装 ROS 2 对 `ros_control` 进行了改进,推出了 `ros2_control` 框架。其安装与配置流程如下: - **安装 `ros2_control` 相关包**:使用 `apt-get` 安装 `ros2_control` 的核心组件,包括控制器管理器、硬件接口、控制消息等 [^3]。 ```bash sudo apt-get update sudo apt-get install ros-jazzy-ros2-control \ ros-jazzy-controller-manager \ ros-jazzy-controller-interface \ ros-jazzy-hardware-interface \ ros-jazzy-ros2-controllers \ ros-jazzy-control-msgs \ ros-jazzy-realtime-tools \ ros-jazzy-joint-state-publisher-gui ``` - **配置硬件接口**:在 ROS 2 中,控制器通过 `Hardware Interface` 与硬件进行通信。需要在配置文件中定义硬件接口类型,例如 `hardware_interface::EffortJointInterface` [^2]。 - **实现控制器逻辑**:根据机器人需求,编写自定义控制器逻辑,例如基于 PID 的控制算法 [^2]。 #### 4. 控制器开发文档与资源 - **官方文档**:ROS 官方提供了详细的 `ros_control` 和 `ros2_control` 文档,涵盖控制器开发、硬件接口实现、仿真集成等内容 [^2]。 - **社区资源**:包括 GitHub 仓库、ROS Wiki 页面、技术博客等,提供了大量关于 `ros_control` 的示例代码和教程 。 - **调试工具**:如 `rqt_plot`、`rviz`、`ros2 control` 命令行工具等,可用于调试控制器性能和可视化机器人状态 [^3]。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值