一.在Gazebo中使用ROS控制器

在本节中,我们将讨论如何在Gazebo中让机器人的每个关节运动。

为了让关节动起来,我们需要分配一个ROS控制器,尤其是,我们需要为每个关节连上一个与transmission标签内指定的硬件接口兼容的控制器。

ROS控制器主要由一套反馈机构组成,可以接受某一设定点,并用执行机构的反馈控制输出。

ROS控制器使用硬件接口与硬件交互,硬件接口的主要功能是充当ROS控制器与真实或仿真硬件之间的中介,根据ROS控制器生成的数据来分配

资源控制它。

在本机器人,我们定义了位置控制器,速度控制器,力控制器等,这些ROS控制器是由名为ros_control的一组软件包提供的。

为了正确理解如何为机械臂配置ROS控制器,我们需要理解它的概念。我们将进一步讨论ros_control软件包,不同类型的ROS

控制器以及ROS控制器如何与Gazebo仿真交互。

1.认识ros_control软件包

ros_control软件包实现了机器人控制器、控制管理器、硬件接口、不同的传输接口和控制工具箱。

ros_control软件包由以下各独立的软件包组成:
*control_toolbox : 这个软件包包含通用模块(PID 和 Sine),可供所有控制器使用。

*controller_interface : 这个软件包包含了控制器的接口(interface)基类。

*controller_manager : 这个软件包提供了加载(load)、卸载(unload)、启动(start) 和停止(stop)等控制器的基础架构。

*controller_manager_msgs : 这个软件包提供了控制管理器的消息和服务定义。

*hardware_interface : 这个软件包包含了硬件接口的基类。

*transmission_interface : 这个软件包包含了传动(transmission)接口的接口类(差速、四杆联动、关节状态、位置和速度)。

2.不同类型的ROS控制器和硬件接口

包含标准ROS控制器的ROS软件包列表:

*joint_position_controller : 这是关节位置控制器的简单实现。

*joint_state_controller : 这是一个发布关节状态的控制器。

*joint_effort_controller : 这是关节力(强度)控制器的实现。

以下是ROS中常用的一些硬件接口:

*Joint Command Interface : 将命令发送到硬件。

*Effort Joint Interface : 发送effort命令。

*Velocity Joint Interface : 发送velocity命令。

*Position Joint Interface : 发送position命令。

*Joint State Interface : 从执行器编码器检索关节状态。

3.ROS控制器如何与Gazebo交互

如图可以看到ROS控制器是如何与Gazebo进行交互的,显示了ROS控制器,机器人硬件接口、仿真器/真实硬件的连接:

ROS控制器与Gazebo的接口图

我们可以看到第三方工具navigation和MoveIt软件包。这些软件包可以为移动机器人控制器和机械臂控制器提供目标位置(即设定点 )。这些控制器可以将位置、速度或驱动力发送到机器人的硬件接口上。

硬件接口将每个资源分配给控制器,并将值发送给每个资源,机器人控制器与机器人硬件接口之间的通信如图所示:

ROS控制器和硬件接口的示意图

硬件接口与实际硬件和仿真分离,来自硬件接口的值可以馈送到Gazebo进行仿真或馈送到实际硬件本身。

硬件接口是机器人及其抽象硬件的软件表示,硬件接口的资源是执行机构、关节和传感器。

有些资源是只读的,比如关节状态、IMU、力-扭矩传感器等,有些资源是可读可写的,比如位置、速度和关节驱动力。

4.将关节状态控制器和关节位置控制器连接到手臂

将机器人控制器连接到每个关节是一项简单的任务,第一项任务就是 为两个控制器编写配置文件。

关节状态控制器将发布手臂的关节状态,而且关节位置控制器可以接收每个关节的目标位置并可以让每个关节运动。

我们将在seven_dof_arm_gazebo/config文件夹下找到控制器的配置文件seven_dof_arm_gazebo_control.yaml

以下是配置文件的定义:

 1 seven_dof_arm:
2 # Publish all joint states -----------------------------------
3 joint_state_controller:
4 type: joint_state_controller/JointStateController
5 publish_rate: 50
6
7 # Position Controllers ---------------------------------------
8 joint1_position_controller:
9 type: position_controllers/JointPositionController
10 joint: shoulder_pan_joint
11 pid: {p: 100.0, i: 0.01, d: 10.0}
12 joint2_position_controller:
13 type: position_controllers/JointPositionController
14 joint: shoulder_pitch_joint
15 pid: {p: 100.0, i: 0.01, d: 10.0}
16 joint3_position_controller:
17 type: position_controllers/JointPositionController
18 joint: elbow_roll_joint
19 pid: {p: 100.0, i: 0.01, d: 10.0}
20 joint4_position_controller:
21 type: position_controllers/JointPositionController
22 joint: elbow_pitch_joint
23 pid: {p: 100.0, i: 0.01, d: 10.0}
24 joint5_position_controller:
25 type: position_controllers/JointPositionController
26 joint: wrist_roll_joint
27 pid: {p: 100.0, i: 0.01, d: 10.0}
28 joint6_position_controller:
29 type: position_controllers/JointPositionController
30 joint: wrist_pitch_joint
31 pid: {p: 100.0, i: 0.01, d: 10.0}
32 joint7_position_controller:
33 type: position_controllers/JointPositionController
34 joint: gripper_roll_joint
35 pid: {p: 100.0, i: 0.01, d: 10.0}

我们可以看到所有的控制器都位于命名空间seven_dof_arm中,第一 行代表关节状态控制器,他将以50hz的频率发布机器人的关节状态。

其他的控制器是关节位置控制器,它被分配给前七个关节,而且还定义了PID增益。

5.在Gaazebo中启动ROS控制器

如果控制器配置准备就绪,我们就可以创建一个启动文件,该文件将启动所有控制器并进行Gazebo仿真.

进入seven_dof_arm_gazebo/launch文件夹并打开seven_dof_arm_gazebo_control.launch文件:

 1 <launch>
2 <!-- Launch Gazebo -->
3 <include file="$(find seven_dof_arm_gazebo)/launch/seven_dof_arm_world.launch" />
4
5
6 <!-- Load joint controller configurations from YAML file to parameter server -->
7 <rosparam file="$(find seven_dof_arm_gazebo)/config/seven_dof_arm_gazebo_control. yaml" command="load"/>
8
9
10 <!-- load the controllers -->
11 <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn=" false"
12 output="screen" ns="/seven_dof_arm" args="joint_state_controller
13 joint1_position_controller
14 joint2_position_controller
15 joint3_position_controller
16 joint4_position_controller
17 joint5_position_controller
18 joint6_position_controller
19 joint7_position_controller"/>
20
21
22 <!-- convert joint states to TF transforms for rviz, etc -->
23 <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_ publisher"
24 respawn="false" output="screen">
25 <remap from="/joint_states" to="/seven_dof_arm/joint_states" />
26 </node>
27
28 </launch>

该启动文件可以启动手臂的Gazebo仿真,加载控制器配置信息、关节状态控制器和关节位置控制器,最后运行机器人状态发布者(负责发布关节状态和tf)

检查运行此启动文件后生成的控制器话题:

$ roslaunch seven_dof_arm_gazebo seven_dof_arm_gazebo_control.launch

如果命令执行成功,我们可以在终端看到如图所示的消息:

运行该启动文件时从控制器中生成的话题如下:

6.控制机器人的关节运动

完成以上步骤后,我们就可以开始对每个关节进行控制了。

要在Gazebo中控制机器人关节运动,我们需要使用std_msgs/Float64类型的消息将所需的关节值发布到关节位置控制器命令话题上。

如下是控制第四个关节运动到1.0度的位置:

$ rostopic pub /seven_dof_arm/joint4_position_controller/command std_msgs/Float64 1.0

还可以用以下命令查看机器人的关节状态

$rostopic echo /seven_dof_arm/joint_states

ROS和Gazebo进行机器人仿真(二)的更多相关文章

  1. ROS和Gazebo进行机器人仿真(一)

    Gazebo是一种多机器人仿真器,可用于室内外机器人仿真.Gazebo在ROS中有良好的接口,包含ROS和Gazebo的所有控制. 若要实现ROS到Gazebo的通信,我们必须安装ROS-Gazebo ...

  2. ROS中的3D机器人建模(二)

    一,创建我们的第一个URDF模型 我们设计的第一个机器人模型是pan-and-tilt机械结构,代码如下 pan_tilt.urdf: 1 <?xml version="1.0&quo ...

  3. ROS(indigo)swarm_robot 群机器人示例Gazebo

    ROS(indigo)swarm_robot 群机器人示例Gazebo 参考网址:https://github.com/yangliu28/swarm_robot_ros_sim 安装提示:catki ...

  4. ROS_Kinetic_x 基於ROS和Gazebo的RoboCup中型組仿真系統(多機器人協作)

    國防科學技術大學發布了RoboCup中型組仿真平臺,基於ROS和Gazebo設計. 該平臺可以用於多機器人協作研究.參考資料如下: ROS新聞:1    http://www.ros.org/news ...

  5. 机器人与机器人仿真技术(zz)

    http://www.viblue.com/archives/5587.htm 一.机器人简介: 机器人(Robot)是自动执行工作的机器装置.它既可以接受人类指挥,又可以运行预先编排的程序,也可以根 ...

  6. 基于 Mathematica 的机器人仿真环境(机械臂篇)[转]

    完美的教程,没有之一,收藏学习. 目的 本文手把手教你在 Mathematica 软件中搭建机器人的仿真环境,具体包括以下内容(所使用的版本是 Mathematica 11.1,更早的版本可能缺少某些 ...

  7. Emotiv脑电设备与RDS机器人仿真初步测试

    Emotiv脑电设备与RDS机器人仿真初步测试 在脑电设备相关算法进行真实机器人测试前,有必要进行大量仿真验证算法,节约开发时间. 这里给我启发的Emotiv使用所参考的一些网址. 官网:https: ...

  8. 在ROS Kinetic中使用Gazebo 8进行机器人仿真

    在ROS Kinetic中使用Gazebo 8比在ROS Indigo中使用Gazebo 3-8要容易一些. 目前最新稳定版本的Gazebo8为8.1.1. 安装流程如下: $  sudo apt-g ...

  9. ROS探索总结(四)——简单的机器人仿真

    前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by Example>这本书的内容,我是 ...

随机推荐

  1. Java集合概述(上)

    Java集合概述(上) 前言 先说说,为什么要写这么一篇博客(我总是喜欢写原因).因为最近到年底了,正好又要准备面试,所以在做各方面的技术总结.而Java集合是Java非常重要的一部分,自己前前后后也 ...

  2. spring boot使用拦截器

    1.编写一个拦截器 首先,我们先编写一个拦截器,和spring mvc方式一样.实现HandlerInterceptor类,代码如下 package com.example.demo.intercep ...

  3. eclipse中使用postgreSQL报错( Cannot load JDBC driver class )

    需求: 使用Maven插件调用PostgreSQL数据库 环境: eclipse_4.5.0+JDK_1.7+Tomcat_7.0+Maven+postgresql-9.1-901.jdbc4.jar ...

  4. MySQL快速回顾:更新和删除操作

    前提要述:参考书籍<MySQL必知必会> 6.1 更新数据 为了更新(修改)表中的数据,可使用UPDATE语句.可采用两种方式使用UPDATE: 更新表中特定的行: 更新表中所有的行. U ...

  5. nginx负载均衡动态自动更新(微博开源模块nginx-upsync-module使用)

    这几天项目有个需求:负载要求能根据节点健康状态动态的增减.nginx自带的upstram已经很强大,而且基于Nginx Upstream配置动态更新已经有很多开源方案,大多数都是基于生成配置文件后进行 ...

  6. C++Primer第五版 6.1节练习

    练习6.1:实参和形参的区别是什么? 通俗解释: 实参是形参的初始值.编译器能以任意可行的顺序对实参求值.实参的类型必须与对应的形参类型匹配. 详解1) 形参变量只有在函数被调用时才会分配内存,调用结 ...

  7. 字符串转hash进阶版

    #include<bits/stdc++.h> using namespace std; ,mod=; vector<unsigned> H[mod]; void Add(un ...

  8. [题解]CSP2019 Solution - Part B

    \(\text{orz}\) 一波现场 \(\text{A}\) 掉 \(\text{D1T3}\) 的神仙 D2T3 centroid Solution 考虑每个点 \(u\) 作为重心的贡献 假设 ...

  9. MCLS Notes

    MainToolbar View Button Click Event handle àMainToolbar.xaml.cs OnConnect() functionàService.Messeng ...

  10. A complex 16-Level XSS Challenge

    A complex 16-Level XSS Challenge, held in summer 2014 (+1 Hidden Level) Index Level 0 Level 1 Level ...