gazebo: ROS Control的仿真教程

2023-05-16

gazebo + ROS control

    • 1. 预备知识
    • 2. 数据流
    • 3. 实现动态避障的环境构建

本文主要介绍如何为仿真机器人做控制器的仿真。通过仿真控制器,控制机器人的对应关节

1. 预备知识

关于gazebo中机器人的仿真:link

关于ros_control的了解:link

2. 数据流

在这里插入图片描述

如上图所示,ros提供的ros_control接口,通过与硬件接口RobotHW交互,实现对硬件的控制。

在gazebo中使用的时候,主要就是左侧部分的仿真硬件。

与右侧实物硬件对比,可得我们在仿真的时候,也要仿真出来一个transmission传动系统,也要在硬件层面(urdf文件)声明使用gazebo_ros_control来进行控制。

依据上述两点,我们来看如何在gazebo仿真中使用具体的ros_control

第一部分:添加传动装置

使用标签, 将标签贴在urdf中,并指明传动装置对应的joint

举例:

<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>

具体标签的含义见link

在这里插入图片描述
其中最重要的标签是<joint>,以及他对应的应该填写的<hardwareinterface>

其中需要指定的hadrwareInterface具体含义如下

在这里插入图片描述

第二部分:添加gazebo_ros_control插件

首先需要在urdf中声明:

<gazebo>
  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
    <robotNamespace>/</robotNamespace>
  </plugin>
</gazebo>

gazebo需要上述这样的声明,来明确需要载入gazebo_ros_control插件,进而能够解析transmission中指定的硬件接口,做好与ros_control对接的准备。

截至目前为止,硬件仿真部分都已经准备好了。等待与上层ros_control进行数据交互。

第三部分:launch文件编写与yaml参数配置文件

先看个例子:

    <rosparam command="load"
              file="$(find learn_model)/config/joints.yaml"
              ns="r2d2_joint_state_controller" />
    <rosparam command="load"
              file="$(find learn_model)/config/head.yaml"
              ns="r2d2_head_controller" />
    <rosparam command="load"
              file="$(find learn_model)/config/gripper.yaml"
              ns="r2d2_gripper_controller"/>
    <rosparam command="load"
              file="$(find learn_model)/config/wheel.yaml"
              ns="r2d2_diff_drive_controller" />


    <node name="r2d2_controller_spawner" pkg="controller_manager" type="spawner"
          args="r2d2_joint_state_controller
          r2d2_head_controller
          r2d2_gripper_controller
          r2d2_diff_drive_controller
          --shutdown-timeout 3"/>

这个例子是ros官方urdf教程link中的r2d2机器人对应的撰写方法。

其中第一部分r2d2_joint_state_controller是用来启动joint_state_controller,需要通过配置参数指定发布类型。
其作用是与控制器形成闭环,同时可以提供给robot_state_publisher需要的joint_state最新信息。
在这里插入图片描述
其具体的yaml参数文件如下:

type: "joint_state_controller/JointStateController"
publish_rate: 50

剩下的三个控制器:

  • r2d2_head_controller:关节位置控制器
type: "position_controllers/JointPositionController"
joint: head_swivel
  • r2d2_gripper_controller:关节位置组控制器

type: "position_controllers/JointGroupPositionController"
joints:
  - gripper_extension
  - left_gripper_joint
  - right_gripper_joint
  • r2d2_diff_drive_controller:差分控制器
type: "diff_drive_controller/DiffDriveController"
publish_rate: 50

left_wheel: ['left_front_wheel_joint', 'left_back_wheel_joint']
right_wheel: ['right_front_wheel_joint', 'right_back_wheel_joint']

wheel_separation: 0.44 # wheel distance

# Odometry covariances for the encoder output of the robot. These values should
# be tuned to your robot's sample odometry data, but these values are a good place
# to start
pose_covariance_diagonal: [0.001, 0.001, 0.001, 0.001, 0.001, 0.03]
twist_covariance_diagonal: [0.001, 0.001, 0.001, 0.001, 0.001, 0.03]

# Top level frame (link) of the robot description
base_frame_id: base_link

# Velocity and acceleration limits for the robot
linear:
  x:
    has_velocity_limits    : true
    max_velocity           : 0.2   # m/s
    has_acceleration_limits: true
    max_acceleration       : 0.6   # m/s^2
angular:
  z:
    has_velocity_limits    : true
    max_velocity           : 2.0   # rad/s
    has_acceleration_limits: true
    max_acceleration       : 6.0   # rad/s^2


最后我们启动之后,查看所有topic可以发现,差分控制器是一种速度控制器,订阅cmd_vel

其他的属于位置控制,需要指定command位置。

在这里插入图片描述
附:

如果位置控制器速度太快,我们可以在joint标签下添加<limit>属性,进而对其进行相关限制。

3. 实现动态避障的环境构建

笔者想要在gazebo中构建一个动态环境,来验证动态避障算法的时候,需要实现如下几点。

  1. 批量建立一些简单的urdf模型
  2. 给所有的urdf模型设置gazebo_ros_control插件
  3. 设立一个node节点,按照时间间隔给上述这些模型定时发布位置命令。
  4. 最好能找个好看的人模型的mesh给urdf模型贴上,这样就看起来就好很多了。

发现gazebo都给实现好了:之间调用就可以,不用折腾了。

https://blog.csdn.net/allenhsu6/article/details/112966600

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gazebo: ROS Control的仿真教程 的相关文章

随机推荐

  • CMake中执行shell命令之execute_process、add_custom_target和add_custom_command

    背景 以下情况可能需要在CMake中执行shell脚本 xff1a cmake未提供的功能而实际构建中又需要时 xff0c 如获取Linux发行版本项目构建时需要执行脚本才能完成 xff0c 如boost构建过程 有的需要shell脚本的返
  • rsync增量同步文件用法实践

    rsync rsync remote sync xff0c 远程同步 xff0c 用于在本地机器及远程机器之间同步数据 对于本地机器之内 xff0c 同步数据使用cp即可 对于本地与远程 xff0c 使用scp即可 但上面两个命令同步数据时
  • 关于职业生涯发展的一点思考

    职业类型 从学校毕业步入社会 xff0c 即正式开始了人生职业生涯发展的第一步 总括地说 xff0c 大概有以下几类职业 xff1a 当公务员 xff0c 从政创立公司 xff0c 当企业家找一份工作 xff0c 成为职员 这三条道路 xf
  • c++矩阵计算性能对比:Eigen和GPU

    生成随机矩阵 生成随机矩阵有多种方式 xff0c 直接了当的方式是使用显式循环的方式为矩阵的每个元素赋随机值 span class token macro property span class token directive hash s
  • c语言中 char* 和 unsigned char* 的区别浅析

    背景 最近在项目中遇到了一个编译警告 xff0c 是因为定义的变量为char xff0c 而在使用时作为函数的unsigned char 类型的参数调用 这个警告很容易避免 xff0c 但是char 和unsigned char 到底有什么
  • c语言中static关键字用法详解

    概述 static关键字在c语言中比较常用 xff0c 使用恰当能够大大提高程序的模块化特性 xff0c 有利于扩展和维护 但是对于c语言初学者 xff0c static由于使用灵活 xff0c 并不容易掌握 本文就static在c语言中的
  • linux下把进程/线程绑定到特定cpu核上运行

    概述 现在大家使用的基本上都是多核cpu xff0c 一般是4核的 平时应用程序在运行时都是由操作系统管理的 操作系统对应用进程进行调度 xff0c 使其在不同的核上轮番运行 对于普通的应用 xff0c 操作系统的默认调度机制是没有问题的
  • git中submodule子模块的添加、使用和删除

    背景 项目中经常使用别人维护的模块 xff0c 在git中使用子模块的功能能够大大提高开发效率 使用子模块后 xff0c 不必负责子模块的维护 xff0c 只需要在必要的时候同步更新子模块即可 本文主要讲解子模块相关的基础命令 xff0c
  • ros下package中CMakelists的编写

    目录 一 package自动生成的Cmakelists1 指定cmake版本2 项目名字3 寻找构建所需依赖包4 启用python模块依赖5 Message Service Action 生成文件6 启动 message services
  • STM32跳至硬件错误中断(HardFault_Handle) 原因及参考解决方法

    一 HardFault Handle引起的原因 1 遇到错误问题是数据类型不对 xff0c 导致该步骤永远不能执行到 xff0c 跳至硬件错误中断 xff1b 所以硬件中断可尝试查找数据类型错误 2 堆栈设置错误也会跳至hardwarefa
  • 时间与日期插件 -- laydate 使用方法(摘自官网)

    简单例子 xff1a function var start 61 elem 39 start 39 选择ID为START的input format 39 YYYY MM DD hh mm ss 39 自动生成的时间格式 min laydat
  • nginx部署vue项目(包括一个nginx部署多个vue项目)

    部署准备 vue项目打包 首先打开public下的index目录 xff0c 修改后台的URL地址 xff0c 如下图所示 xff1a 使用CMD xff0c 打开命令行程序 进入项目根目录 执行命令 xff1a npm run build
  • 雅可比(Jacobian)矩阵

    在向量分析中 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵 其行列式称为雅可比行列式 还有 在代数几何中 代数曲线的雅可比量表示雅可比簇 xff1a 伴随该曲线的一个代数群 曲线可以嵌入其中 它们全部都以数学家卡尔 雅可比 Carl Jac
  • 粒子滤波方法入门

    例子滤波方法入门 xff1a 分析典型非线性系统数学模型 主要内容 xff1a 1 非线性数学模型 2 用粒子滤波的MATLAB程序简介 1 非线性数学模型 2 用粒子滤波的MATLAB程序简介 function output args 6
  • 关于VIO中IMU预积分的讲解

    Why VIO 转自 xff1a https zhehangt github io 2019 03 23 SLAM Basic VIOInit 首先我们先简单回顾一下为什么要做VIO xff0c 以及为什么要做VIO初始化 我们知道单目相机
  • 线程互斥量死锁,与sleep没有关联

    文章目录 死锁问题死锁原因产生死锁的几个常见场景死锁产生的四个必要条件 61 61 仅供参考互斥条件占有和等待条件不可抢占条件环路等待条件 pthread mutex lock 线程互斥量死锁 与sleep没有关联 项目上 定位死锁原因 无
  • linux下,应用程序中的全局变量与so库中的全局变量名冲突,怎么办?

    文章目录 Wl Bsymbolic 动态库与应用 如果存在同名全局变量 会如何 实现了一个动态库 xff0c 封装了一些方法 然后基于这个动态库 xff0c 实现了一个应用程序 应用程序中含有全局变量A xff0c 动态库中也含有全局变量A
  • 内存管理:分页,分段,段页结合

    内存管理 xff1a 分页 xff0c 分段 xff0c 段页结合
  • STM32 SPI 收发数据 ---规则 + 问题解析

    规则 xff1a 1 xff09 高速同步串行口 3 xff5e 4线接口 xff08 CS xff0c CLK xff0c MOSI xff0c MISO xff09 xff0c 收发独立 可同步进行 2 xff09 SPI分为主从模式
  • gazebo: ROS Control的仿真教程

    gazebo 43 ROS control 1 预备知识2 数据流3 实现动态避障的环境构建 本文主要介绍如何为仿真机器人做控制器的仿真 通过仿真控制器 xff0c 控制机器人的对应关节 1 预备知识 关于gazebo中机器人的仿真 xff