Gazebo和ROS通信实现发球

2023-05-16

ROS版本: ROS Kinetic
操作系统:Ubuntu16.04 LTS

YouTube上有一个视频,是一个乒乓球机器人在gazebo里面的方针
https://www.youtube.com/watch?v=HBNGeYZKJM4
因为项目需要,需要实现这个发球的装置。因为第一次接触gazebo和ros所以这里把自己的研究过程记录下来。

预备知识

1.ros的安装和通信机制,主要是话题和服务通信。
这里只需要根据根据ros wiki上的教程实现前20讲,就可以实现安装(包括gazebo_ros包)和简单入门。
http://wiki.ros.org/ROS/Tutorials
2.gazebo的一些基础知识(非必须),这里可以看一下gazebo的入门教程
http://gazebosim.org/tutorials

总体实现思路

整个方针的实现可以分为以下几步:
###环境的搭建
这里我们并不采用gazebo教程里面直接gui插入模型的方法,而是采用ros和gazebo的通信机制实现。如果我们按前面的方法正确安装了ros。接下来,打开终端,依次执行下列命令,每个命令可以打开一个终端
$roscore
$rosrun gazebo_ros gazebo
这事我们就打开了gazebo界面。接下来,我们需要一个小球.
$rosrun gazebo_ros spawn_model -database robocup_spl_ball -sdf -model my_ball1
ok,那么现在我们已经把所有需要的模型加载进来了(虽然就1个球)
参考网站:http://gazebosim.org/tutorials/?tut=ros_comm
###动起来
如果仔细看了上面的教程和参考网站,那我们就会有一个整体的思路:利用gazebo提供的话题和服务就可以实现,在环境的搭建中,我们是直接采用spawn_sdf_model服务实现的模型的加载。接下来我们需要把加载的网球删除。接着实现流程如下:
1.使用spawn_sdf_model服务加载一个网球,并指定小球的位置
2.使用apply_body_wrench服务,给网球施加一个斜向上的力,使其做斜抛运动
3.当球弹出后,进入while循环,使用get_model_state服务得到小球的位置,当小球位置飞出预定轨迹后,跳出循环。
4.使用delete_model服务将这个小球删除,回到1.
程序如下:

#!/usr/bin/env python


import time
import rospy
from gazebo_msgs.srv import SpawnModel
from gazebo_msgs.srv import DeleteModel
from gazebo_msgs.srv import ApplyBodyWrench
from gazebo_msgs.srv import GetModelState
from geometry_msgs.msg import Pose
from geometry_msgs.msg import Wrench
#初始位置
initial_pose = Pose()
initial_pose.position.x = -4
initial_pose.position.y = -1
initial_pose.position.z = 1
#所用力的大小
initial_wrench = Wrench()
initial_wrench.force.x = 0.16
initial_wrench.force.y = 0.0
initial_wrench.force.z = 0.25
#ctrl+h显示隐藏文档,将XXX替换为自己的目录,从自己的目录中找的这个文件
f = open('/home/XXXXX/.gazebo/models/robocup_spl_ball/model.sdf','r')
sdff = f.read()
#产生小球的服务
rospy.wait_for_service('gazebo/spawn_sdf_model')
spawn_model_prox = rospy.ServiceProxy('gazebo/spawn_sdf_model', SpawnModel)
#施加一个作用力
rospy.wait_for_service('gazebo/apply_body_wrench')
apply_wrench = rospy.ServiceProxy('gazebo/apply_body_wrench', ApplyBodyWrench)
#删除小球
rospy.wait_for_service('gazebo/delete_model')
deletesrv = rospy.ServiceProxy('gazebo/delete_model', DeleteModel)
#得到小球位置
rospy.wait_for_service('gazebo/get_model_state')
get_m_state = rospy.ServiceProxy('gazebo/get_model_state', GetModelState)
while(1):
	spawn_model_prox("my_ball", sdff, "robotos_name_space", initial_pose, "world")
	time.sleep(1)

	apply_wrench("my_ball::ball", "world", None, initial_wrench, rospy.Time.from_sec(0), rospy.Duration.from_sec(0.2))
	s = get_m_state("my_ball","world")
	while(1):
		if(s.pose.position.x < 6):
			s = get_m_state("my_ball","world")
			print(s.pose.position.x)
		else:
			rospy.wait_for_service('gazebo/delete_model')
			deletesrv = rospy.ServiceProxy('gazebo/delete_model', DeleteModel)
			ass = deletesrv("my_ball")
			print(ass)			
			break

关于程序中各个服务的的调用方法,可以直接参考相关的消息和服务文档。

最后,可以加上一个球场,改变网球的形状,使仿真环境更加逼真。这需要我们自己去创建自己的模型。
突然发现经常出现小球删除不掉的情况,会出现
DeleteModel: Model pushed to delete queue, but delete service timed out waiting for
\ model to disappear from simulation"
调试了好久也没找出问题。有人说是gazebo的bug,真是迷了。。。

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

Gazebo和ROS通信实现发球 的相关文章

  • 【硬核】 ROS Navigation 局部路径规划常见算法

    简介 最近 作者参加了关于RMUS 高校 SimReal挑战赛 首次接触到了机器人导航领域 这里记录一下这段时间的收货 sim2real的全称是simulation to reality 是强化学习的一个分支 同时也属于transfer l
  • 使用WTGAHRS2(JY-GPSIMU)在ROS中读取数据并发布话题

    目录 IMU简介 驱动程序 IMU串口通信协议 程序 效果 IMU简介 十轴惯性导航传感器WTGAHRS2传感器集成高精度的陀螺仪 加速度计 地磁场传感器 GPS 模块 采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法 能够快速求
  • ROS中使用VLP16激光雷达获取点云数据

    ROS中使用VLP16激光雷达获取点云数据 个人博客地址 本文测试环境为 Ubuntu20 04 ROS Noetic 需要将激光雷达与PC连接 然后在设置 gt 网络 gt 有线中将IPv4改为手动 并且地址为192 168 1 100
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • GG-CNN代码学习

    文章目录 1 源码网址 https github com dougsm ggcnn 2 数据集格式转化 下载后的康奈尔数据集 解压完之后里面的格式 里面的 tiff图像通过 txt文件转化得到 python m utils dataset
  • 清华大学开源软件镜像站网址

    清华大学 TUNA 协会原名清华大学学生网管会 注册名清华大学学生网络与开源软件协会 是由清华大学网络技术和开源软件爱好者 技术宅组成的团体 现阶段向校内外提供开源软件镜像等服务 清华大学 TUNA 协会清华大学 TUNA 协会原名清华大学
  • 在Ubuntu 14.04.2 LTS上安装Qt

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • ROS 第四天 ROS中的关键组件

    1 Launch文件 通过XML文件实现多节点的配置和启动 可自动启动ROS Master
  • Ubuntu16.04及ROS Kinetic环境下安装使用RealSense SR300

    Ubuntu16 04及ROS Kinetic环境下安装使用RealSense SR300 1 准备条件 需要安装Ubuntu16 04及ROS Kinetic 2 安装驱动 安装realsense的驱动流程可以根据Github上的官方推荐
  • 如何将从 rospy.Subscriber 数据获得的数据输入到变量中?

    我写了一个示例订阅者 我想将从 rospy Subscriber 获得的数据提供给另一个变量 以便稍后在程序中使用它进行处理 目前 我可以看到订阅者正在运行 因为当我使用 rospy loginfo 函数时 我可以看到打印的订阅值 虽然我不
  • 什么是 void `std::allocator`?即:`std::allocator`

    自动生成ROS 机器人操作系统 message C 头文件包含如下类型定义 typedef std msgs Header
  • 如何将曲面拟合到一组数据点并获得曲面方程

    乌班图 ROS 思维 Python程序 我正在尝试获取适合点云数据中的一组点的表面方程 数据来自激光雷达扫描仪 我在 rviz 中选择整个扫描的一部分 并获得该选择的坐标选定表面的图片 所选曲面并不总是如此线性 因为材质中可能存在轻微的曲线
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS

随机推荐

  • 【自学Python】Python bytes转string

    Python bytes转string Python string转bytes教程 在 Python 中 xff0c bytes 类型和 字符串 的所有操作 使用和内置方法也都基本一致 因此 xff0c 我们也可以实现将 bytes 类型转
  • 【自学Python】Python查找字符串位置

    Python查找字符串位置 大纲 Python查找字符串位置教程 在开发过程中 xff0c 很多时候我们有在一个 字符串 中查找另一个字符串位置的需求 xff0c 在 Python 中 xff0c 在一个字符串中查找另一个字符串的位置我们使
  • 【自学Docker 】Docker port命令

    Docker port命令 概述 docker port命令教程 docker port 命令可以用于列出指定的 Docker容器 的端口映射 xff0c 或者将容器里的端口映射到宿主机 该命令后面的 CONTAINER 可以是容器Id x
  • 【自学Docker】Docker pull命令

    大纲 Docker pull命令 docker pull命令教程 docker pull 命令用于从镜像仓库中拉取或者更新指定镜像 docker pull 命令中的 name 即镜像名称后面可以跟上镜像标签或者镜像摘要 docker pul
  • 【自学Docker】Docker push命令

    大纲 Docker push命令 docker push命令教程 docker push 命令用于将本地的 Docker镜像 上传到 Docker镜像仓库 docker push命令使用之前需要要先登陆到镜像仓库 docker push命令
  • 【自学Linux】Linux运行级别

    Linux运行级别 Linux运行级别教程 Linux 可以支持运行级别的设置 xff0c 运行级别就是操作系统当前正在运行的功能级别 xff0c 级别是从 0 到 6 Centos7 系统之前的版本是通过 etc inittab 文件来定
  • 【自学Linux】 Linux文件目录结构

    Linux文件目录结构 Linux文件目录结构教程 在 Linux 中 xff0c 有一个很经典的说法 xff0c 叫做一切皆文件 xff0c 因此 xff0c 我们在系统学习 Linux 之前 xff0c 首先要了解 Linux 的文件目
  • 【自学Linux】Linux一切皆文件

    Linux一切皆文件 Linux一切皆文件教程 Linux 中所有内容都是以文件的形式保存和管理的 xff0c 即一切皆文件 xff0c 普通文件是文件 xff0c 目录是文件 xff0c 硬件设备 xff08 键盘 监视器 硬盘 打印机
  • 链路聚合--Eth-Trunk

    链路聚合技术是解决二层交换机多条链路产生环路的问题 xff0c 不仅避免了环路问题 xff0c 还提高了数据的传输效率 链路聚合分为两种模式 xff1a 手动模式和LACP模式 手动模式 手动模式就是人工的方式去创建Eth Trunk和成员
  • 块元素和内联元素的特点和区别

    lt css基础之块级元素和内联元素 块级元素的特点 xff1a 1 占一整行 2 是一个矩形 3 可定义宽度和高度 xff0c 内边距 xff0c 外边距等 4 其display属性默认为block 内联元素的特点 xff1a 1 并不占
  • 在vs code中使用git

    在vs code使用git 1 下载安装git 下载地址 xff1a Git Downloads 下载后安装选择默认选项即可 2 安装完成后 xff0c 设置git的环境变量 xff1a 在系统的path环境变量中添加git exe的安装目
  • Ubuntu下压缩与解压缩

    一 linux下常用的压缩格式 linux下常用的压缩扩展名有 xff1a tar tar bz2 tar gz 二 Windows下7ZIP软件的安装 因为Linux下很多文件是bz2 gz结尾的文件 xff0c 因此需要在windows
  • VIO的图优化模型

    因子图结构 VIO在纯视觉的基础上添加了IMU约束 xff0c 因子图如下 xff1a 状态变量 VIO中 xff0c 待估计的状态变量为 i 61 R
  • CMakeLists写法总结

    个人最近学习了一些关于常见的CMakeLists的一些写法格式 xff0c 分享给大家 CMAKE MINIMUM REQUIRED VERSION xxx 该项表示要求CMAKE的最低版本号 PROJECT aim1 此项表示所建立的工程
  • Qt两种传参形式(信号槽传参、界面传参)

    一 UI界面传参 在Qt中传输数据通常有两种形式 xff0c 一种是把待传输的数据先保存到UI界面的控件中 xff0c 然后子类从界面中读取数据 使用该控件作为参数传递承载 1 首先将计算出的数值传到控件中 ui span class to
  • Intel RealSense T265 Windows10 环境下运行

    Intel RealSense T265 Windows10 环境下运行 最近从某宝上买了个T265 体验了下 intel的硬件开发 卖家怕我不会用还专门问了我会不会用 intel的包装里面不带那个很酷炫的三脚架 xff01 xff01 x
  • TB6612FNG电机驱动替代方案

    最近东芝的一个很常用的电机驱动芯片TB6612FNG停产 xff0c 这是一个全桥驱动芯片 xff0c 经过测试 xff0c 两款比较好的替代芯片有ST公司的L298系列 xff0c L293D系列和VNH5019系列的全桥驱动器 这里的完
  • 关于链表中头指针和头结点的理解

    线性表使用顺序 xff08 数组 xff09 存储时有个弊端 xff0c 那就是在插入和删除时需要大量的移动数据 xff0c 这显示是非常消耗时间的 xff0c 所以可以采用链式存储 xff0c 即有一个指针域 xff08 单链表 xff0
  • 相对深度与绝对深度,深度图与真实距离

    刚开始看单目深度估计 xff0c 好多概念都不清楚 xff0c 下面是我的理解 xff0c 有不对之处希望大佬指出 首先是相对深度和绝对深度的概念 绝对深度就是利用激光雷达等设备获取的相机与物体之间的距离 xff0c 比如KITTI数据集就
  • Gazebo和ROS通信实现发球

    ROS版本 xff1a ROS Kinetic 操作系统 xff1a Ubuntu16 04 LTS YouTube上有一个视频 xff0c 是一个乒乓球机器人在gazebo里面的方针 https www youtube com watch