ROS 系列学习教程(总目录)
本文目录
- 一、ros_control 架构
- 1.1 hardware_interface
- 1.2 combined_robot_hw
- 1.3 controller_interface
- 1.4 controller_manager
- 1.5 controller_manager_msgs
- 1.6 joint_limits_interface
- 1.7 transmission_interface
- 1.8 realtime_tools
- 二、ros_controllers
- 2.1 控制器列表
- 2.2 配置控制器
- 三、命令行工具
- 3.1 controller_manager
- 3.2 spawner
- 3.3 unspawner
- 3.4 controller_group (melodic 新增)
- 四、加载配置并管理控制器
- 五、ROS API
- 5.1 controller_manager/load_controller
- 5.2 controller_manager/unload_controller
- 5.3 controller_manager/switch_controller
- 5.4 controller_manager/list_controllers
- 5.5 controller_manager/list_controller_types
- 5.6 controller_manager/reload_controller_libraries
ros_control
是一个 ROS 功能包,是一个通用的机器人控制框架,用于实现机器人硬件接口、控制器管理和控制器接口。它提供了一套用于控制各种类型机器人(如移动机器人、机械臂等)的工具和接口。ros_control
的设计目的是为开发者提供一个灵活且可扩展的框架,使得控制算法能够独立于具体的硬件平台运行,并且可以轻松地在不同的机器人之间移植。
一、ros_control 架构
ros_control
架构图如下:
ros_control
由以下几个主要组件组成:
- hardware_interface:硬件底层接口
- combined_robot_hw:硬件包
- controller_interface:controller接口
- controller_manager:controller管理器
- controller_manager_msgs:controller管理器的消息类型
- joint_limits_interface:joints限制接口
- transmission_interface:传动接口
- realtime_tools:实时控制工具
1.1 hardware_interface
hardware_interface
提供了一套硬件抽象接口,使得控制器可以独立于具体的硬件实现。
1.2 combined_robot_hw
combined_robot_hw
由 CombinedRobotHW
类实现,CombinedRobotHW
是一个硬件抽象类,允许将多个硬件接口组合在一起,从而让多个独立的硬件模块作为一个整体被控制器管理器控制。
1.3 controller_interface
controller_interface
提供了定义控制器的基础接口,用于实现具体的控制器。控制器需要继承 controller_interface::Controller
类,并实现控制逻辑。
1.4 controller_manager
controller_manager
负责管理控制器的生命周期,包括加载、启动、停止和卸载控制器。它提供了服务和话题接口,用于与控制器进行交互。
1.5 controller_manager_msgs
controller_manager_msgs
包含了与控制器管理器交互的消息类型和服务类型,例如加载、启动和停止控制器。
1.6 joint_limits_interface
joint_limits_interface
提供了一套接口,用于管理关节的限制条件(例如位置、速度、加速度和力矩限制),以确保关节在安全范围内运行。
1.7 transmission_interface
transmission_interface
提供了传动装置的抽象接口,用于处理关节和电机之间的传动关系。它定义了传动装置的结构和方法,以便在控制器中正确处理关节和电机的转换。
1.8 realtime_tools
realtime_tools
提供了一些实用工具,用于实现实时控制,包括实时缓冲区和周期性任务管理。
二、ros_controllers
ros_controllers
也是一个 ROS 功能包,提供了一组预定义的控制器,这些控制器已经为各种常见的机器人控制任务进行了优化和实现,可以用于控制不同类型的机器人,如移动机器人、机械臂和其他多关节系统。
2.1 控制器列表
目前主要包含以下控制器:
- joint_state_controller
- JointStateController:从硬件接口获取关节状态,并将这些状态信息发布到
/joint_states
话题
- JointStateController:从硬件接口获取关节状态,并将这些状态信息发布到
- joint_trajectory_controller
- JointTrajectoryController:接收轨迹信息(即一系列期望的关节位置、速度和加速度),并控制机器人的关节按照这些轨迹运动。该控制器适用于需要精确轨迹跟踪的任务,如路径规划和任务执行。
- gripper_action_controller
- GripperActionController:控制机械手夹具的开闭位置
- diff_drive_controller
- DiffDriveController:控制差速驱动的机器人
- effort_controllers
- JointEffortController:控制单个关节的力/力矩。通过设定期望的力/力矩,使关节达到所需状态。
- JointPositionController:控制单个关节的位置,通过力/力矩控制算法使关节达到设定的位置。
- JointVelocityController:控制单个关节的速度,通过力/力矩控制算法使关节达到设定的速度。
- JointGroupEffortController:控制一组关节的力/力矩。通过设定多个关节的力/力矩,使它们达到所需状态。
- JointGroupPositionController:控制一组关节的位置,通过力/力矩控制算法使这些关节达到设定的位置。
- velocity_controllers
- JointVelocityController:用于控制机器人单个关节的速度
- JointPositionController:通过PID控制速度以达到设置的位置
- JointGroupVelocityController:用于控制机器人多个关节的速度
- position_controllers
- JointPositionController:直接控制单个关节的位置
- JointGroupPositionController:直接控制一组关节的位置
- imu_sensor_controller
- IMUSensorController:发布 IMU 传感器的数据
- force_torque_sensor_controller
- ForceTorqueSensorController:发布力矩传感器的数据
- forward_command_controller
- ForwardCommandController:用于将单个关节的命令直接传递到硬件接口
- ForwardJointGroupCommandController:用于将一组关节的命令直接传递到硬件接口
- ackermann_steering_controller
- AckermannSteeringController:接收线速度和转向角度指令,然后根据 Ackermann 转向几何原理计算并控制各个车轮的转向角和速度,使车辆能够按照预定轨迹运动
- four_wheel_steering_controller
- FourWheelSteeringController:接收线速度和转向角度指令,然后根据四轮转向几何原理计算并控制各个车轮的转向角和速度,使车辆能够按照预定轨迹运动
2.2 配置控制器
通过将参数加载到ROS参数服务器来配置控制器,一般先将配置写入 yaml
文件,再通过文件加载到ROS参数服务器,然后 ros_control
会解析特定参数。控制器配置示例如下:
my_robot:
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
position_trajectory_controller:
type: position_controllers/JointTrajectoryController
joints:
- joint1
- joint2
constraints:
goal_time: 5.0
joint1:
trajectory: 0.60
goal: 0.15
joint2:
trajectory: 0.60
goal: 0.15
不同控制器的参数不同,详见 http://wiki.ros.org/ros_controllers
三、命令行工具
3.1 controller_manager
管理控制器生命周期:
rosrun controller_manager controller_manager <command> <name1> <name2> ...
其中,<command>
可选如下:
load
:加载控制器(构造和初始化)unload
:卸载控制器(析构)start
:启动控制器stop
:停止控制器spawn
:加载并启动控制器kill
:停止并卸载控制器
<name1> <name2>
为控制器的名称。
获取控制器的状态:
rosrun controller_manager controller_manager <command>
其中,<command>
可选如下:
list
:按执行顺序列出所有控制器,并给出每个控制器的状态list-types
:列出控制器管理器知道的所有控制器类型。如果控制器不在此列表中,将无法生成。reload-libraries
:重新加载所有可用作插件的控制器库。当新开发控制器并想要测试新的控制器代码时,这很方便,而无需每次都重新启动机器人。这不会重新启动之前运行的控制器。reload-libraries --restore
:重新加载所有可用作插件的控制器库,并将所有控制器恢复到其原始状态。
3.2 spawner
自动加载并启动一组控制器,并自动停止并卸载相同的控制器:
rosrun controller_manager spawner [--stopped] <name1> <name2> ...
当运行 spawner 时,列出的控制器将被加载并启动,如果加上 --stopped
参数,控制器只会被加载不会被启动。在控制器启动时,spawner 将继续运行,当终止 spawner(如:ctrl-c)时,它将自动停止并卸载它最初启动的所有控制器。
3.3 unspawner
停止控制器,但不卸载
rosrun controller_manager unspawner <name1> <name2> ...
3.4 controller_group (melodic 新增)
controller_manager
允许开发人员在运行时切换控制器,但是当出于某些特殊目的想要从一组控制器切换到另一组控制器时,它就不那么方便了。如果在 ROS 参数 controller_groups
中定义了这样的组,controller_group
脚本就可以让这变得简单。它知道所有涉及的控制器,然后知道在从一个组切换到另一个组时需要停止和启动的控制器。因此,不同的组可以共享一些控制器。
控制器分组配置,和控制器配置一样要先加载到ROS参数服务器:
controller_groups:
production:
- prod_controller_1
- prod_controller_2
development:
- devel_controller_1
- devel_controller_2
- shared_controller_3
diagnostics:
- diag_controller_1
- diag_controller_2
- shared_controller_3
运行 controller_group
:
rosrun controller_manager controller_group <command> <args>
其中,<command>
可选如下:
list
:列出在controller_groups
参数中找到的所有组定义spawn <group>
:加载并启动名为<group>
的组中包含的所有控制器。这通常在 ROS 启动文件中使用switch <group>
:切换到名为<group>
的组。这将停止那些在其他组中定义但未在本组中运行的控制器,并启动本组中定义的未运行的控制器。
四、加载配置并管理控制器
启动控制器时要注意,运行 controller_manager
来从启动文件中启动控制器时,即使启动文件被删除,控制器也会继续运行。建议使用 spawner
工具从启动文件中自动加载、启动、停止和卸载控制器,当启动 spawner
时,将加载并启动控制器。当停止 spawner
时(启动文件被删除或停止运行),将停止并卸载控制器。
<launch>
<!-- 加载配置文件 -->
<rosparam file="$(find rrbot_control)/config/rrbot_control.yaml" command="load"/>
<!-- 启动控制器 -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" ns="/my_robot" args="joint_state_controller position_trajectory_controller"/>
</launch>
图形化管理控制器:
rqt_controller_manager是一个 rqt 插件,允许以图形方式加载、卸载、启动和停止控制器,以及显示有关已加载控制器的信息。
它可以从 rqt 的插件菜单启动,或者作为独立可执行文件启动:
rosrun rqt_controller_manager rqt_controller_manager
五、ROS API
为了与其他 ROS 节点的控制器交互,控制器管理器提供了五个服务供调用:
5.1 controller_manager/load_controller
加载指定控制器
消息体:controller_manager_msgs/LoadController
5.2 controller_manager/unload_controller
卸载控制器,控制器仅在停止状态下才可卸载。
消息体:controller_manager_msgs/UnloadController
5.3 controller_manager/switch_controller
启动/停止 控制器
消息体:controller_manager_msgs/SwitchController
5.4 controller_manager/list_controllers
获取当前已加载的所有控制器
消息体:controller_manager_msgs/ListControllers
5.5 controller_manager/list_controller_types
获取已知的所有控制器类型
消息体:controller_manager_msgs/ListControllerTypes
5.6 controller_manager/reload_controller_libraries
重新加载所有可用作插件的控制器库
消息体:controller_manager_msgs/ReloadControllerLibraries