Unity-ROS与话题与服务(二)_unity3d发布ros信息-程序员宅基地

技术标签: unity  游戏引擎  ROS  

0. 简介

对于ROS而言,其最常用的就是Topic话题以及Service两个了。之前我们在了解Unity Robotics Hub时候就了解到基本的Unity和ROS的通讯,下面我们来详细介绍一下Unity与ROS的话题与服务。

ROS和Unity之间的通信是通过Unity的“ROS-TCP-Connector”软件包和ROS的“ROS-TCP-Endpoint”软件包进行通信的。

1. Unity与ROS链接

ROS方面的准备步骤如下,首先添加端口号“10000”“5005”,启动Docker镜像。

Unity和ROS之间的通信需要端口号“10000”“5005”。为了在Unity中导入消息文件,也进行文件夹的安装。

docker run -p 6080:80 -p 10000:10000 -p 5005:5005 --shm-size=1024m tiryoh/ros-desktop-vnc:melodic

安装“ROS-TCP-Endpoint”软件包,用于ROS程序与Unity通信

cd ~/catkin_ws/src
git clone https://github.com/Unity-Technologies/ROS-TCP-Endpoint
cd ..
catkin build
source ~/catkin_ws/devel/setup.bash

然后就是Unity端准备步骤如下,首先就是安装ROS-TCP-Connector。这需要确保Unity的版本在2020.2以上。然后在在Unity菜单“Window→Package Manager”中打开“Package Manager”,“+→Add Package from git URL…”中输入以下URL,按下“Add”按钮,然后我们就会看到ROS-TCP-Connector插件安装成功

https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector

在这里插入图片描述
然后在Unity中完成对ROS的设置,首先选择Unity菜单“Robotics→ROS Settings”
在这里插入图片描述
确认以下的设定是否正确

・Connect on Startup : True
・Protocol : ROS1
・ROS IP Address : 127.0.0.1
・ROS Port : 10000
・Show HUD : True
・KeepAlive time (secs):在指定秒数以上没有发送其他消息的情况下,频繁测试连接。这个时间越长,ROSConnection认识到Topic停止响应所花费的时间就越长。
・Network timeout (secs):消息发送超过指定秒数时,视为连接失败。这个时间越长,ROSConnection认识到Topic停止了响应所花费的时间就越长。
・Sleep time (secs):在确认新消息之前,睡眠的秒数。如果减少这个时间,响应会变快,但是会消耗更多的CPU。

2. 自定义msg

将消息导入Unity的步骤如下所示

  1. Unity的菜单“Robotics→Generate ROS Messages…”选择。

  2. 在“ROS message path”中选择“catkin_ws/src”。

然后就可以看到path下的msg都会显示在Unity下面
在这里插入图片描述

  1. 然后点击“MyString.msg”中的“Build msg”。这样“MyString.msg”将被转换成c#脚本“MyStringMsg”,并在Project窗口中输出“RosMessages”。
    在这里插入图片描述

3. Topic话题

这一小节我们主要来说Topic的发布和订阅,首先我们来看一下发布者的Unity编程。

  1. 在Hierarchy窗口的“+→Create Empty”中创建空GameObject,命名为“Publisher”。

  2. 在“Publisher”中追加新脚本“ChatterPublisher”,编辑如下

using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using MyStringMsg = RosMessageTypes.Hello.MyStringMsg;

public class ChatterPublisher : MonoBehaviour
{
    
    private ROSConnection ros;

    // 初始化时被调用
    void Start()
    {
    
        // 向ROS连接注册Topic话题
        ros = ROSConnection.instance;
        ros.RegisterPublisher<MyStringMsg>("chatter");
    }

    // 每帧更新
    void FixedUpdate()
    {
    
        // 发送msg信息
        MyStringMsg msg = new MyStringMsg("Hello Unity!");
        ros.Send("chatter", msg);
    }
}
  1. 而接收者和发布者类似,都在Hierarchy窗口的“+→Create Empty”中创建空GameObject,命名为“Subscriber”。

  2. 在“Subscriber”中添加新的脚本“ChatterSubscriber”,编辑如下。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using MyStringMsg = RosMessageTypes.Hello.MyStringMsg;

public class ChatterSubscriber : MonoBehaviour{
    

    void Start(){
    
        // 向ROS连接注册Subscribe
        ROSConnection.instance.Subscribe<MyStringMsg>("chatter", Callback);
    }

    void Callback(MyStringMsg msg){
    
        Debug.Log(msg.data);
    }
}

同时我们可以在ROS当中订阅这些信息,运行

roscore
rosparam set ROS_IP 127.0.0.1
rosparam set ROS_TCP_PORT 10000
rosrun ros_tcp_endpoint default_server_endpoint.py
# roslauch ros_tcp_endpoint endpoint.launch tcp_ip:=127.0.0.1 tcp_port:=10000 # 将127.0.0.1

然后写一个listener.py的订阅器
在这里插入图片描述

4. Service话题

…详情请参照古月居

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lovely_yoshino/article/details/128204699

智能推荐

linux 分区简介,Linux硬盘分区知识简介-程序员宅基地

文章浏览阅读990次。Linux系统可以挂载多个不同接口类型的磁盘(disk),每一个磁盘又可以分成若干个分区(Partition),每个分区又可以拥有自己的文件系统类型(FileSystem)。Linux对于磁盘和分区又自己的一套标记方法。硬盘和分区的区分第一个SCSI(Small Computer System Interface)磁盘记为/dev/sda,第二个SCSI磁盘记为/dev/sdb;第一个SATA磁盘..._linux引导分区的标记可为

unity 网络游戏架构设计(第12课:网络游戏案例讲解)之美_网络游戏消息结构设计案例-程序员宅基地

文章浏览阅读656次。第12课:网络游戏案例讲解上章给读者介绍关于服务器之间的通信,本章通过案例给读者介绍如何将框架跟 Photon 结合起来,实现一个网络通信的框架设计。UI 架构设计模块已经介绍过,我们的 Demo 使用的 UI 是 UGUI,简单的用几个 Button 代替 Sprite,它们的原理是一样的。我们先创建一个 UI,如下图所示:这个 UI 主要有三个关键按钮,分别是 Create Roo..._网络游戏消息结构设计案例

Android-Gradle详解_grade编译运行安卓-程序员宅基地

文章浏览阅读548次。Android 构建系统非常灵活,可让你在不修改应用核心源代码文件的情况下执行自定义构建配置。本部分将介绍 Android 构建系统的工作原理,以及它如何帮助你对多个构建配置进行自定义和自动化处理。构建过程涉及许多将你的项目转换为 Android 应用程序包 (APK) 的工具和过程。构建过程非常灵活,因此了解一些幕后发生的事情很有用。下图为Android 应用模块的构建过程。Android 应用模块的构建过程(如上图所示)遵循以下一般步骤:1、编译器将你的源代码转换为 DEX(Dalv_grade编译运行安卓

linux网络配置后面加一条wheel,linux安全配置/etc/sudoers&wheel组-程序员宅基地

文章浏览阅读800次。/etc/sudoers 控制哪些用户能在哪些主机上以哪些用户的身份执行哪些命令。只有此文件权限为440时才能用户才能使用sudo命令,只有root用户才能使用visudo命令修改此文件。当然也可以先添加文件写权限,然后修改,再把文件权限改回来。此文件的一些配置规则定义别名:User_Alias UserName = user1,user2,kongoveHost_Alias HostName =..._%wheel all=(all) all

NO.15——使用Appium自动化测试爬取微信朋友圈数据_appium监测微信图片-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏27次。 一、解析过程本人使用锤子手机做测试,型号是YQ601,首先打开开发者模式确保手机能与mac相连,打开Appium客户端,配置参数如图可以理解为Appuim继承自web端的selenium,同样可以执行一些自动化操作。Appium自带了一个XPATH选择器,给用户提供了选择结果,如图这个选择器给出的结果太繁琐,所以可以改成通过查找ID的方式来构造爬虫程序。但是这里要注意,估计微信提升了自己..._appium监测微信图片

Spring boot注入静态变量_springboot注入静态变量-程序员宅基地

文章浏览阅读498次。给静态变量赋值_springboot注入静态变量

随便推点

交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装-程序员宅基地

文章浏览阅读8w次,点赞20次,收藏160次。aarch64-linux-gnu-gcc 是由 Linaro 公司基于 GCC 推出的的 ARM 交叉编译工具_aarch64-linux-gnu-gcc

数码管扫描显示verilog_如何开始Xilinx FPGA开发之旅 第二课 EGO1数码管与键盘-程序员宅基地

文章浏览阅读1.4k次。庚子年,我们的EGO1在疫情当中作为口袋实验平台成为了众多高校的复课利器。其中的成功案例更是得到了新华社网媒与CCTV教育频道的报道。借此东风,为了让更多的老师与学生熟悉了解Xilinx,更好的入门学习FPGA知识,我们的师资培训直播已开设EGO1专题直播,欢迎新老朋友跟踪关注。第二课---- EGO1数码管与键盘本周的直播我们将介绍EGO1的外设使用案例,介绍数码管扫描的原理和PS/2..._fpgaego1 键盘

python re库安装_python 库安装方法及常用库-程序员宅基地

文章浏览阅读3.6k次。python库安装方法:方法一:setpu.py1.下载库压缩包,解压,记录下路径:*:/**/……/2.运行cmd,切换到*:/**/……/目录下3.运行setup.py build4.然后输入python,进入python模块,验证是否安装成功方法二:1.Win + R 打开运行窗口,输入cmd回车2.找到pip安装路径——x:\Python xx\Scripts3. 在命令行中切换至该目录c..._rep库怎么安装

android listview fling,ListView优化: Fling(松开滑动) 过程中不加载数据-程序员宅基地

文章浏览阅读189次。1.Adapter增加滑动结束以后刷新方法//定义当前listview是否在滑动状态private boolean isScrolling = false;public void setScrolling(boolean scrolling) {this.isScrolling = scrolling;}public void refreshOnScrollEnd(AdapterView list..._android listview fling

微信公众号JSAPI自费支付总结_微信自动续费api-程序员宅基地

文章浏览阅读535次。文章目录前言一、准备操作1.公众号ID2.商户号3.商户号密钥4.域名、服务器二、步入正题1. 支付流程2. 初始化订单数据2.读入数据总结前言本编章主要是通过运行一个自费测试demo使其能够快速了解微信自费支付的实现流程,也是个人实现微信自费demo之后的记录、总结官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1一、准备操作进行微信自费支付之前请先获得以下几项必要条件,公众号和商户号需要绑定名称_微信自动续费api

java byte 字节负数-程序员宅基地

文章浏览阅读2w次。由于通讯协议中长度使用byte字节来表示,但在java中长度超过127的时候会变成负数,所以需要保证得到的长度是正数byte b & 0xFFhttp://www.blogjava.net/orangelizq/archive/2008/07/20/216228.html在剖析该问题前请看如下代码public static String bytes2HexString(

推荐文章

热门文章

相关标签