MoveIT Rviz和Gazebo联合仿真

news2024/11/29 8:47:09

文章目录

    • 环境
    • 安装
    • 概述
      • ros_control框架
      • ros_control数据流
    • 文件配置
    • 附加工具
    • 故障问题解决
    • 参考

接前两篇:

ROS MoveIT1(Noetic)安装总结
Solidworks导出为URDF用于MoveIT总结(带prismatic)
MoveIT1 Assistant 总结

环境

  • Ubuntu20.04;
  • ROS1 Noetic;
  • VMware

安装

sudo apt-get install ros-noetic-joint-state-controller
sudo apt-get install ros-noetic-effort-controllers
sudo apt-get install ros-noetic-position-controllers
sudo apt-get install ros-noetic-joint-trajectory-controller
sudo apt-get install ros-noetic-controller-manager
sudo apt-get install ros-noetic-gazebo-ros-control
sudo apt-get install ros-noetic-ros-controllers

概述

URDF 用于创建机器人模型、Rviz 可以显示机器人感知到的环境信息,Gazebo 用于物理环境仿真。

先在Moveit!端配置关节和传感器接口yaml文件,将其加载到rviz端;再在机器人端配置ros_control和接口yaml文件,将机器人加载到Gazebo。

最后同时启动加载有ros_control的Gazebo和加载有Moveit的rviz,达到联合仿真的目的。

ros_control框架

在这里插入图片描述
在这里插入图片描述
ros_control包由以下几部分:

  • combined_robot_hw(硬件包):一个允许将多个RobotHW组合成一个“RobotHW”的软件包。

  • controller_interface(controller接口)

  • controller_manager(controller管理器):提供了一个近乎实时的controller管理器,用于管理(加载、卸载、启停)controllers。

  • controller_manager_msg(controller管理器的消息类型):定义了controller的状态消息类型msg,以及调用controller_manager的服务类型srv。

  • hardware_interface(硬件底层的接口):向硬件发送(write())命令并从硬件接收(read())联合状态。
    https://github.com/ros-controls/ros_control/wiki/hardware_interface
    在这里插入图片描述

  • joint_limits_interface(joints限制接口):根据URDF中的limit标签,将joint limit载入到硬件层中。

  • transmission_interface(传动接口):根据URDF中的transmission标签将该关系载入到硬件层中。

  • realtime_tools(实时控制工具):包含一组可以从硬实时线程中使用的工具,而不会破坏实时行为。

ros_control数据流

在这里插入图片描述

  • Controller Manager:每个机器人可能有多个controller,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的controller。controller manager的输入就是ROS上层应用的输出。

  • Controller:controller可以完成每个joint的控制,请求下层的硬件资源,并且提供了PID控制器,读取硬件资源接口中的状态,在发布控制命令。
    在这里插入图片描述

  • Hardware Rescource:为上下两层提供硬件资源的接口。

  • RobotHW:硬件抽象层和硬件直接打交道,通过write和read方法来完成硬件的操作,这一层也包含关节限位、力矩转换、状态转换等功能。

  • Real Robot:实际的机器人上也需要有自己的嵌入式控制器,接收到命令后需要反映到执行器上,比如接收到位置1的命令后,那就需要让执行器快速、稳定的到达位置1。

【控制流】
ROS中的Controller manager接收load_controller、unload_controller等命令来加载和运行不同类型的controller(例如joint_position),这些controller通过Hardware Resource接口向硬件抽象层RobotHW读取和发布控制命令,这些命令再输入到机器人上的嵌入控制器上,然后有执行器执行。

文件配置

/home/gw2/ws_moveit/src/assis_1/config/robot_controller.yaml中定义的是"position_controllers/JointTrajectoryController",则URDF中定义的transmission中如果使用的是PositionJointInterface必须要对应,否则会提示找不到controller。

    <transmission name="trans_Joint1">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="Joint1">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
        </joint>
        <actuator name="Joint1_motor">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            <mechanicalReduction>1</mechanicalReduction>
        </actuator>
    </transmission>
    <transmission name="trans_Joint2">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="Joint2">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
        </joint>
        <actuator name="Joint2_motor">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            <mechanicalReduction>1</mechanicalReduction>
        </actuator>
    </transmission>
    <transmission name="trans_Joint3">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="Joint3">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
        </joint>
        <actuator name="Joint3_motor">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            <mechanicalReduction>1</mechanicalReduction>
        </actuator>
    </transmission>
    <transmission name="trans_Joint4">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="Joint4">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
        </joint>
        <actuator name="Joint4_motor">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            <mechanicalReduction>1</mechanicalReduction>
        </actuator>
    </transmission>
    <transmission name="trans_Joint5">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="Joint5">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
        </joint>
        <actuator name="Joint5_motor">
            <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            <mechanicalReduction>1</mechanicalReduction>
        </actuator>
    </transmission>

在urdf中加入gazebo的ros_control插件,如果不加,运行gazebo会显示机械臂都耷拉在地上,仿佛电机没有使能一样。

    <gazebo>
        <plugin name="gazebo_ros_control"  filename="libgazebo_ros_control.so">
        <plugin name="joint_state_publisher" filename="libgazebo_ros_joint_state_publisher.so">
            <jointName>Joint1,Joint2,Joint3,Joint4,Joint5</jointName>
        </plugin>
            <robotNamespace>/</robotNamespace>
        </plugin>
    </gazebo>

检查ros_controllers.launch的args="control"不要有空格。

修改ros_controllers.yaml:

control:
  type: position_controllers/JointTrajectoryController
  joints:
    - Joint1
    - Joint2
    - Joint3
    - Joint4
    - Joint5

  gains:
    Joint1: { p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
    Joint2: { p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
    Joint3: { p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
    Joint4: { p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
    Joint5: { p: 12000, d: 50, i: 0.0, i_clamp: 10000 }

运行rviz和gazebo:

source ~/ws_moveit/devel/setup.bash
roslaunch assis_1 demo_gazebo.launch

可以看到Rviz中的运动在Gazebo中可以同步运动。
在这里插入图片描述

在这里插入图片描述

附加工具

rqt_graph
创建一个显示当前系统ROS程序运行情况的动态图形

安装:

sudo apt install ros-noetic-rqt
sudo apt install ros-noetic-rqt-common-plugins

运行:

rosrun rqt_graph rqt_graph

可以看到结果:
在这里插入图片描述

在这里插入图片描述
通过这个图可以看到:
/move_group发送/control/follow_joint_trajectory/goal【目标位置】到机器人,机器人发送/joint_states【轴状态】到/move_group和/robot_state_publisher

rqt_joint_trajectory_controller
安装:

sudo apt-get install ros-noetic-rqt-joint-trajectory-controller

运行:

roslaunch assis_1 demo_gazebo.launch 或 roslaunch assis_1 gazebo.launch
rosrun rqt_joint_trajectory_controller rqt_joint_trajectory_controller

效果:拖动进度条可以在Gazebo实现各个关节的运动。

在这里插入图片描述

rqt_controller_manager
rqt插件,该插件以图形化方式加载,卸载,启动和停止控制器;同时用来显示加载的控制器的信息。

安装:

sudo apt-get install ros-noetic-rqt-controller-manager

运行:可以看到control和joint_state_controller两个控制器。

rosrun rqt_controller_manager rqt_controller_manager

在这里插入图片描述

故障问题解决

Spawn service failed. Exiting.
cmd /opt/ros/noetic/lib/gazebo_ros/gzserver -e ode worlds/empty.world
parse as old deprecated model file failed.
这三个错误往往一起出现,最后通过在urdf文件中添加解决:
filename=“libgazebo_ros_control.so”

https://blog.csdn.net/qq_60018807/article/details/128543981

ERROR: cannot launch node of type [controller_manager/spawner]: controller_manager接着一堆错误。

sudo apt-get install ros-kinetic-controller-manager

https://blog.csdn.net/weixin_45839124/article/details/106589576

模型自己转动,乱跑

sudo apt-get install ros-noetic-gazebo-ros-control

[ERROR] [1675950367.646886773, 0.307000000]: Failed to initialize the controller
[ERROR] [1675950367.649888591, 0.308000000]: Initializing controller ‘control’ failed
[ERROR] [1675950368.653177, 0.650000]: Failed to load control

在ros_controllers.yaml中添加前述代码。

[ERROR] [1675950605.984213275]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/Joint1
[ERROR] [1675950605.988813331]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/Joint2
[ERROR] [1675950605.991700327]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/Joint3
[ERROR] [1675950605.995635439]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/Joint4
[ERROR] [1675950605.999769977]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/Joint5

添加修改ros_controllers.yaml文件:
/gazebo_ros_control:
pid_gains:

control:
  type: position_controllers/JointTrajectoryController
  joints:
    - Joint1
    - Joint2
    - Joint3
    - Joint4
    - Joint5
  /gazebo_ros_control:
    pid_gains:
      Joint1: {p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
      Joint2: {p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
      Joint3: {p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
      Joint4: {p: 12000, d: 50, i: 0.0, i_clamp: 10000 }
      Joint5: {p: 12000, d: 50, i: 0.0, i_clamp: 10000 }

但是加上以后发现Gazebo模型开始扭动起来,没眼看。最终无视这个错误即可。

https://blog.csdn.net/qq_32896521/article/details/111143282?spm=1001.2014.3001.5501
https://zhuanlan.zhihu.com/p/392635284

参考

https://blog.csdn.net/qq_34935373/article/details/95886151
https://ros-planning.github.io/moveit_tutorials/doc/gazebo_simulation/gazebo_simulation.html
http://www.guyuehome.com/890
https://blog.csdn.net/qq_41035283/article/details/120572465
http://wiki.ros.org/ros_control?distro=noetic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全协议(3)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.当前流行操作系统的安全等级 1.Windows的安全等级 什么是EAL…

不花钱体验最近火出圈的 ChatGPT 是真的

OpenAI 发布的 ChatGPT&#xff0c;一经发布在科技圈就火得不行了&#xff01; ChatGPT 是什么呢&#xff1f; 它是一款由 OpenAl 开发的语言模型产品&#xff0c;它能够模拟人类的语言行为&#xff0c;与用户进行自然的交互。ChatGPT 基于GPT-3.5&#xff08;Generative Pre…

linux基本功系列之lsof命令实战

文章目录前言一. lsof命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示系统打开的文件3.2 查找某个文件相关的进程3.3 列出某个用户打开的文件信息3.4 列出某个程序进程所打开的文件信息3.5 查看某个进程号打开的文件3.6 列出所有的网络连接3.7 列出谁在使用某个端口3.8 恢…

OSS(Object Storage Service)进行上传图片,下载图片(详细看文档可以完成操作)

文章目录1.单体前后端项目上传1.上传流程2. BuckName 和EndPoint3. AccessKey 和Access Secret(创建RAM&#xff08;Resource Access Manage&#xff09;的子账号&#xff0c;然后可以获得Accesskey和Acess Secret)3.根据创建的子账号分配OSS的所有权限(可以对文件进行上传&…

【年度总结】回望大学四年坎坷的2022

【年度总结】回望大学四年&坎坷的2022 2022年&#xff0c;我毕业了&#xff01; 满心欢喜的离开&#xff0c;到现在看来&#xff0c;却甚是想念大学的时光。 这一年&#xff0c;绝对是我此生过的最难的一年。考研失利、工作不顺、投资失败、“财政”赤字...... 现在的我…

浅析依赖注入框架的生命周期(以 InversifyJS 为例)

在上一篇介绍了 VSCode 的依赖注入设计&#xff0c;并且实现了一个简单的 IOC 框架。但是距离成为一个生产环境可用的框架还差的很远。 行业内已经有许多非常优秀的开源 IOC 框架&#xff0c;它们划分了更为清晰地模块来应对复杂情况下依赖注入运行的正确性。 这里我将以 Inv…

RiproV2主题首页中间网站动态栏美化教程

优化描述 Riprov2官网首页如下: 中间部分网站动态条过于简单,想优化成本文后续的样子,本教程解决这个问题。 优化后可设置滚动,可显示会员总数,今日发布,本周发布,资源总数等项。 优化后的具体网站:

大白话说ChatGPT

ChatGPT是如何流行的&#xff1f; 在经历了2016年&#xff0c;由AlphGo击败李世石而掀起的AI浪潮后&#xff0c;AI行业沉寂良久&#xff0c;上一波浪潮里起来的AI算法公司&#xff0c;在硬件化和数据的泥沼里寻找出路&#xff0c;这么多年&#xff0c;AI行业太需要一个现象级的…

JVM从跨平台到跨专业 Ⅲ -- 类加载与字节码技术【下】

文章目录编译期处理默认构造器自动拆装箱泛型集合取值可变参数foreach 循环switch 字符串switch 枚举枚举类try-with-resources方法重写时的桥接方法匿名内部类类加载阶段加载链接初始化相关练习和应用类加载器类与类加载器启动类加载器拓展类加载器双亲委派模式自定义类加载器…

前端JavaScript获取图片文件的真实格式

常见方式判断图片格式 当我们进行前端开发&#xff0c;需要处理图片上传功能&#xff0c;针对图片格式做判断时&#xff0c;常规的方法都是使用文件后缀名来判断&#xff0c;如下代码所示&#xff1a; input.addEventListener(change, (e) > {const file e.target.files[…

NLP顶会近三年小众研究领域

ACL 2022 编码器和解码器框架、自然语言生成、知识i神经元、抽取式文本摘要、预训练语言模型、零样本神经机器翻译等。 2021 新闻标题生成任务等。跨语言命名实体识别、代码搜索、音乐生成、Hi-Transformer、预训练语言模型、语义交互等。 EMNLP 2021 代码摘要生成、隐私…

MyBatis 单表的增删改查

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

在多线程环境下使用哈希表

一.HashTable和HashMapHashTable是JDK1.0时创建的&#xff0c;其在创建时考虑到了多线程情况下存在的线程安全问题&#xff0c;但是其解决线程安全问题的思路也相对简单&#xff1a;在其众多实现方法上加上synchronized关键字&#xff08;效率较低&#xff09;&#xff0c;保证…

《SOC芯片研究框架》深度科普,发展趋势、技术特点、产业链一文看懂

片上系统SoC&#xff08;System on Chip&#xff09;&#xff0c;即在一块芯片上集成一整个信息处理系统&#xff0c;简单来说 SoC芯片是在中央处理器CPU的基础上扩展音视频功能和专用接口的超大规模集成电路&#xff0c;是智能设备的“大脑”。随着半导体工艺的发展&#xff0…

Typescript - interface 关键字(通俗易懂的详细教程)

前言 简单来说&#xff0c;Interface 就是一种描述对象或函数的东西。 您可以把 interface 理解为形状&#xff0c;真实开发情况下&#xff0c;一个对象需要有什么样的属性&#xff0c;函数需要什么参数或返回什么样的值&#xff0c;数组应该是什么样子的&#xff0c;一个类和继…

MySQL慢查询分析和性能优化

1 背景我们的业务服务随着功能规模扩大&#xff0c;用户量扩增&#xff0c;流量的不断的增长&#xff0c;经常会遇到一个问题&#xff0c;就是数据存储服务响应变慢。导致数据库服务变慢的诱因很多&#xff0c;而RD最重要的工作之一就是找到问题并解决问题。下面以MySQL为例子&…

矢量网络分析仪介绍

矢量网络分析仪VNA是一种测试仪器&#xff0c;它可以将网络的响应测量成矢量:实参数和虚参数&#xff0c;从而表征其性能。矢量网络分析仪VNA是射频设计实验室和许多制造和服务领域的重要测试仪器。虽然矢量网络分析仪主要侧重于研究和开发&#xff0c;但它也可以为所有类型的R…

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形前言一. 柱状图中最大的矩形前言 想要精通算法和SQL的成长之路 - 系列导航 一. 柱状图中最大的矩形 原题链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求…

你是真的“C”——操作符详解【下篇】+整形提升+算术转换

你是真的“C”——操作符详解下篇&#x1f60e;前言&#x1f64c;操作符详解【上篇】内容&#xff1a;操作符详解【下篇】内容&#xff1a;1、 条件操作符2、逗号表达式&#xff1a;3、下标引用、函数调用和结构成员3、访问一个结构的成员表达式求值1、隐式类型转换&#xff1a…

扫雷——C语言【详解+全部码源】

前言&#xff1a;今天我们学习的是C语言中另一个比较熟知的小游戏——扫雷 下面开始我们的学习吧&#xff01; 文章目录游戏整体思路游戏流程游戏菜单的打印创建数组并初始化布置雷排查雷完整代码game.hgame.ctest.c游戏整体思路 我们先来看一下网上的扫雷游戏怎么玩 需要打印…