机器人建模与仿真(三)——ros_control

机器人建模与仿真(三)——ros_control

总述

ROS中提供了丰富的机器人应用:SLAM、导航、MoveIt…但是你可能一直有一个疑问,这些功能包到底应该怎么样用到我们的机器人上,也就是说在应用和实际机器人或者机器人仿真器之间,缺少一个连接两者的东西。
ros_control就是ROS为用户提供的应用与机器人之间的中间件,包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等等,可以帮助机器人应用快速落地,提高开发效率。
在这里插入图片描述

一、ros_control框架

在这里插入图片描述
如上图所示为ros_control的总体框架,可以看到针对不同类型的机器人(移动机器人、机械臂等),ros_control可以提供多种类型的控制器(controller),但是这些控制器的接口各不相同,为了提高代码的复用率,ros_control还提供一个硬件的抽象层。硬件抽象层负责机器人硬件资源的管理,而controller从抽象层请求资源即可,并不直接接触硬件。
在这里插入图片描述
在这里插入图片描述
上图是ros_control的数据流图,可以更加清晰的看到每个层次包含的功能:
(1)控制器管理器(Controller Manager)
每个机器人可能有多个controller,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的controller。控制器管理器的输入就是ROS上层应用功能包的输出。
(2)控制器(Controller)
控制器可以完成每个joint的控制,读取硬件资源接口中的状态,再发布控制命令。
(3)硬件资源(Hardware Rescource)
为上下两层提供硬件资源的接口。
(4)机器人硬件抽象(RobotHW)
机器人硬件抽象层和硬件资源直接打交道,通过write和read方法来完成硬件的操作,这一层也包含关节约束、力矩转换、状态转换等功能。
(5)真实机器人(Real Robot)
真实机器人上也需要有自己的嵌入式控制器,将接收到的命令反映到执行器上,比如接收到旋转90度的命令后,就需要让执行器快速、稳定地旋转90度。

二、控制器

ros_controllers这个功能包提供了以下控制器:
在这里插入图片描述
在这里插入图片描述
当然,我们也可以根据自己的需求,创建需要的控制器,然后通过控制器来管理自己创建的控制器,创建控制器的具体方法可以参考https://github.com/ros-controls/ros_control/wiki/controller_interface

三、硬件接口

硬件接口是控制器和RobotHw沟通的接口,基本与控制器的种类相互对应,同样可以自己创建需要的接口,具体实现方法可以参考:https://github.com/ros-controls/ros_control/wiki/hardware_interface
在这里插入图片描述

四、传动系统

传动系统(Transmissions)可以将机器人的关节指令转换成执行器的控制信号。机器人每个需要运动的关节都需要配置相应的传动系统,可以通过代码完成https://github.com/ros-controls/ros_control/wiki/transmission_interface,但大部分情况下,都会在URDF文件中直接添加(http://ros.org/wiki/urdf/XML/Transmission):

<transmission name="simple_trans">
     <type>transmission_interface/SimpleTransmission</type>
     <joint name="foo_joint">
          <hardwareInterface>EffortJointInterface</hardwareInterface>
     </joint>
     <actuator name="foo_motor">
          <mechanicalReduction>50</mechanicalReduction>
          <hardwareInterface>EffortJointInterface</hardwareInterface>
     </actuator>
</transmission>

五、关节约束

关节约束(Joint Limits)是硬件抽象层中的一部分,维护一个关节约束的数据结构,这些约束数据可以从机器人的URDF文件中加载,也可以在ROS的参数服务器上加载(需要先用YAML配置文件导入ROS 参数服务器),不仅包含关节速度、位置、加速度、加加速度、力矩等方面的约束,还包含起安全作用的位置软限位、速度边界(k_v)和位置边界(k_p)等。
可以使用如下方式在URDF中设置Joint Limits参数:

<joint name="$foo_joint" type="revolute">
  <!-- other joint description elements -->
 
  <!-- Joint limits -->
  <limit lower="0.0"
         upper="1.0"
         effort="10.0"
         velocity="5.0" />
 
  <!-- Soft limits -->
  <safety_controller k_position="100"
                     k_velocity="10"
                     soft_lower_limit="0.1"
                     soft_upper_limit="0.9" /> 
</joint>

还有一些参数需要通过YAML配置文件事先加载到参数服务器中,YAML文件的格式如下:

joint_limits:
  foo_joint:
    has_position_limits: true
    min_position: 0.0
    max_position: 1.0
    has_velocity_limits: true
    max_velocity: 2.0
    has_acceleration_limits: true
    max_acceleration: 5.0
    has_jerk_limits: true
    max_jerk: 100.0
    has_effort_limits: true
    max_effort: 5.0
  bar_joint:
    has_position_limits: false # Continuous joint
    has_velocity_limits: true
    max_velocity: 4.0

六、控制器管理器

controller_manager提供了一种多控制器控制的机制,可以实现控制器的加载、开始运行、停止运行、卸载等多种操作。如下图所示的就是controller_manager控制控制器实现的状态跳转。
在这里插入图片描述
controller_manager还提供多种工具来辅助完成这些操作。
1、命令行工具
controller_manager命令的格式为:

rosrun controller_manager controller_manager <command> <controller_name>

支持的如下 :
load: 加载一个控制器(load a controller (construct and initialize))
unload: 卸载一个控制器(unload a controller (destruct))
start: 启动控制器(start a controller)
stop: 停止控制器(stop a controller)
spawn: 加载并启动一个控制器(load and start a controller)
kill: 停止并卸载一个控制器(stop and unload a controller)
如果想要查看某个控制器的状态,可以使用如下命令:

rosrun controller_manager controller_manager <command>

支持的 :
list: 根据执行顺序列出所有控制器,并显示每个控制器的状态。(list all the controllers in the order they are executed, and give the state of each controller)
list-types: 显示所有控制器类型。(list all the controller types the controller manager knows about. If your controller is not in this list, you won’t be able to spawn it.)
reload-libraries: 以插件的形式重载所有控制器的库,不需要重新启动,方便对控制器的开发和测试。(Reloads all the controller libraries that are available as plugins. This is convenient when you are developing a controller and you want to test your new controller code, without restarting the robot every time. This does not restart controllers which were running before.)
reload-libraries --restore: 以插件的形式重载所有控制器的库,并恢复到初始状态。(Reloads all the controller libraries that are available as plugins and restores all controllers to their original state.)
但是很多时候我们需要控制的控制器有很多,比如六轴机器人至少有六个控制器,这时也可以使用spawner 命令一次控制多个控制器:

rosrun controller_manager spawner [--stopped] name1 name2 name3

上边的命令可以自动加载、启动控制器,如果加上–stopped参数,那么控制器则只会被加载,但是并不会开始运行。如果想要停止一系列控制器,但是不需要卸载,可以使用如下命令:

rosrun controller_manager unspawner name1 name2 name3

2、launch工具
在launch文件中,同样可以通过运行controller_manager命令,加载和启动一系列控制器:

 <launch>
   <node pkg="controller_manager"
         type="spawner"
         args="controller_name1 controller_name2" /> 
 </launch>

以上launch文件会加载并启动controller,如果只需要加载不必启动,可以使用以下配置:

<launch>
  <node pkg="controller_manager"
    type="spawner"
    args="--stopped controller_name1 controller_name2" />
</launch>

3.可视化工具rqt_controller_manager
controller_manager还提供了可视化工具rqt_controller_manager,安装成功后,直接使用以下命令即可打开界面:

rosrun rqt_controller_manager rqt_controller_manager

七、Gazebo仿真

1、机器人模型添加Gazebo属性
(1)为link添加< gazebo >标签
(2)添加传动装置
(3)添加Gazebo控制器插件
2、在Gazebo中显示机器人模型
3、控制机器人在Gazebo中运动
4、摄像头仿真
(1)为摄像头模型添加Gazebo插件
(2)运行仿真环境
5、Kinect仿真
(1)为Kinect模型添加Gazebo插件
(2)运行仿真环境
6、激光雷达仿真
(1)为rplidar模型添加Gazebo插件
(2)运行仿真环境

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: `ros_control`是ROS中的一个控制框架,用于实现机器人的高级控制。它提供了一套抽象的控制接口,使得机器人的硬件控制和软件控制可以被分离开来。`ros_control`框架包含了多个组件,例如控制器(controller)、硬件接口(hardware interface)、传感器接口(sensor interface)等,这些组件可以按照需要组合在一起,构出适合不同机器人和应用场景的控制系统。 在`ros_control`框架下,机器人的控制器可以通过订阅机器人状态信息(如关节角度、速度、加速度等),并根据控制策略发布控制指令,控制机器人的运动。同时,硬件接口可以将控制指令转化为实际的电机控制信号,从而控制机器人的运动。 `ros_control`框架的优势在于它提供了一套标准化的控制接口,使得不同类型的机器人可以使用同一套控制器进行控制。这样,开发者可以更加专注于机器人的应用开发,而不必关注底层的硬件控制细节。 ### 回答2: ros_control是一个在ROS(机器人操作系统)中用于控制机器人的软件包。它提供了一种标准化的方法来控制不同类型的机器人,包括机械臂、移动机器人和其他类型的机器人ros_control的设计目标是提供一个灵活且可扩展的控制架构,以满足不同机器人的控制需求。它将机器人控制分为硬件接口和控制器两个层次。硬件接口层负责处理机器人硬件和传感器的数据交互,包括读取传感器数据和发送控制命令到机器人硬件。控制器层则负责实现控制算法,根据硬件接口提供的数据计算出适当的控制命令,并发送给硬件接口层执行。 通过ros_control,使用者可以很容易地编写自己的硬件接口和控制器。它提供了一套标准化的接口和类来处理机器人控制相关的操作。使用标准化接口可以使不同类型的硬件接口和控制器之间可以互相替换,而无需修改其他部分的代码。这使得开发者可以更加专注于控制算法的设计和实现,而不需要关注细节的硬件接口实现。 此外,ros_control还提供了一些常用的控制器实现,如PID控制器、位置控制器和速度控制器等。这些控制器可以直接用于控制机器人,而无需用户自己实现。同时,它也支持用户自定义控制器,使开发者可以根据自己的需求实现更复杂的控制策略。 总而言之,ros_control是一个在ROS中控制机器人的重要软件包。它提供了一套灵活且可扩展的控制架构,使开发者可以更加方便地设计和实现机器人控制算法。 ### 回答3: ros_control是一个ROS(Robot Operating System)软件包,用于控制机器人硬件。它提供了一个灵活和通用的框架,用于在ROS中实现各种机器人控制算法和架构。 ros_control主要由以下几个组件组成: 1. 硬件接口(Hardware Interface):该组件定义了机器人硬件和控制系统之间的接口,包括传感器和执行器。它允许开发者将具体的机器人硬件与ros_control框架进行连接和集成。 2. 控制器(Controller):该组件实现了具体的机器人控制算法,例如PID控制器、状态机控制等。开发者可以根据机器人的需求编写自定义控制器,或者使用已经提供的控制器。 3. 控制器管理器(Controller Manager):该组件负责启动、停止和切换控制器。它允许用户通过ROS话题或服务接口来管理机器人的不同控制器,并实现控制器间的平滑过渡。 4. 硬件接口管理器(Hardware Interface Manager):该组件管理不同硬件接口的初始化和更新。它通过ros_control中定义的硬件接口统一处理传感器和执行器的数据流。 使用ros_control,开发者可以方便地在ROS中实现机器人的控制功能。它提供了一个统一的接口和管理机制,使得不同的控制器和硬件接口能够无缝集成,并能够通过ROS的通信机制进行配置和切换。 总之,ros_control是一个强大而灵活的机器人控制框架,它提供了一个通用的接口和管理机制,方便开发者在ROS中实现机器人的各种控制算法和架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是“耀”神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值