ros2与web通信实例

ros2与web通信实例

最近需要进行ros2与web端进行通信操作,目标是ros2发送的消息web端能够显示在界面,并且前端能够发布数据,最终实例如下:
ros2与web交互
然而网上查的的资料如古月居的:

利用Websocket实现ROS与Web的交互
https://www.guyuehome.com/5386

包括ros官网上以及目前网上绝大部分资料都是ros1与web交互的
http://wiki.ros.org/roslibjs/Tutorials/BasicRosFunctionality

使用它们的资料将会出现非常多的麻烦,本人经过艰难的查找和验证终于成功实现ros2与web交互,记录如何在前人ros1的基础上进行修改,实现ros2与web交互

1、下载rosbridge-suite

介绍以下所需要的工具包:rosbridge_suite功能包,roslibjs,ros2djs,ros3djs。
rosbridge_suite:实现Web浏览器与ROS之间的数据交互;

roslibjs:实现了ROS中的部分功能,如Topic,Service,URDF等;

ros2djs:提供了二维可视化的管理工具,可以用来在Web浏览器中显示二维地图;

ros3djs:提供了三维可视化的管理工具,可以在Web端显示三维模型。

在这几个功能包中,rosbridge_suite是最重要的,它是Web和ROS沟通的桥梁,roslibjs也是必须的,它能实现ROS中最基本的功能,下面的例程就是用它来实现的,至于ros2djs和ros3djs是后期开发所需要的,对于新手来说可以暂时不用下载。它们的下载安装方法如下,在终端中分别输入以下指令:

请注意第一句的:

sudo apt-get install ros-kinetic-rosbridge-suite

kinetic是ros的不同版本,请换成自己的ros版本,本人使用的是humble版本的

sudo apt-get install ros-kinetic-rosbridge-suite
git clone https://github.com/RobotWebTools/roslibjs.git
git clone https://github.com/RobotWebTools/ros2djs
git clone https://github.com/RobotWebTools/ros3djs

2、再运行launch文件

ros1的命令如下
roslaunch rosbridge_server rosbridge_websocket.launch

但是rosbridge是经过更新的,没有rosbridge_websocket.launch
ros2的命令应该改成如下形式:

ros2 launch rosbridge_server rosbridge_websocket_launch.xml

3、打开example.html

运行了这个launch文件后,只需要在浏览器中打开我们设计的html文件就能够实现Web端与ROS的交互了。下面来看一个简单的example.html的例子。

 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" /><script type="text/javascript" src="http://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script>
<script type="text/javascript" src="http://static.robotwebtools.org/roslibjs/current/roslib.min.js"></script><script type="text/javascript" type="text/javascript">// Connecting to ROSvar ros = new ROSLIB.Ros({url : 'ws://localhost:9090'});//判断是否连接成功并输出相应的提示消息到web控制台ros.on('connection', function() {console.log('Connected to websocket server.');});ros.on('error', function(error) {console.log('Error connecting to websocket server: ', error);});ros.on('close', function() {console.log('Connection to websocket server closed.');});// Publishing a Topicvar cmdVel = new ROSLIB.Topic({ros : ros,name : '/cmd_vel',messageType : 'geometry_msgs/Twist'});//创建一个topic,它的名字是'/cmd_vel',,消息类型是'geometry_msgs/Twist'var twist = new ROSLIB.Message({linear : {x : 0.1,y : 0.2,z : 0.3},angular : {x : -0.1,y : -0.2,z : -0.3}});//创建一个messagefunction func()//在点击”Publish”按钮后发布消息,并对消息进行更改{cmdVel.publish(twist);//发布twist消息twist.linear.x = twist.linear.x + 0.1;twist.linear.y = twist.linear.y + 0.1;twist.linear.z = twist.linear.z + 0.1;twist.angular.x = twist.angular.x + 0.1;twist.angular.y = twist.angular.y + 0.1;twist.angular.z = twist.angular.z + 0.1;}// Subscribing to a Topicvar listener = new ROSLIB.Topic({ros : ros,name : '/chatter',messageType : 'std_msgs/String'});//创建一个topic,它的名字是'/chatter',,消息类型是'std_msgs/String'function subscribe()//在点击”Subscribe”按钮后订阅'/chatter'的消息,并将其显示到网页中{listener.subscribe(function(message) {document.getElementById("output").innerHTML = ('Received message on ' + listener.name + ': ' + message.data);});}function unsubscribe()//在点击”Unsubscribe”按钮后取消订阅'/chatter'的消息{listener.unsubscribe();}</script>
</head><body><h1>Simple roslib Example</h1><p>Check your Web Console for output.</p><p id = "output"></p><button onclick = "func()">Publish</button><button onclick = "subscribe()">Subscribe</button><button onclick = "unsubscribe()">Unsubscribe</button><br />
</body>
</html>

请注意上面这两个 .js 链接已经失效了,需要自己换成新的连接或下载到本地下面是最新的地址,本人是直接下载到本地的

http://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js
http://static.robotwebtools.org/roslibjs/current/roslib.min.js

最新的两个.js下载地址如下:

https://github.com/RobotWebTools/roslibjs
https://github.com/EventEmitter2/EventEmitter2

这是本人下载到本地后调用的修改,注意改成自己的地址

<script type="text/javascript" src="/root/myjs/EventEmitter2-master/lib/eventemitter2.js"></script>
<script type="text/javascript" src="/root/myjs/roslibjs-develop/build/roslib.min.js"></script>

4、启动talker

原文的这一步也有问题,建议修改成自己编写的talker

rosrun  roscpp_tutorials  talker

本人自己写的talker如下:

/*send "hello wordl!" with a fixed-frequency and add 1 to the number for each data sent
*/
// 1.include header files
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using namespace std::chrono_literals;
// 3.define node class
class MinimalPublisher: public rclcpp:: Node{public:MinimalPublisher(): Node("minimal_publisher"),count(0){RCLCPP_INFO(this->get_logger(),"create the publish node!");// 3-1 create a publisher/*template:the type of messages publishedparameter:1.topic name2.QOS(Quality of Service) message queue lengthreturn:publish object pointer*/publisher_ = this->create_publisher<std_msgs::msg::String>("/chatter",10);// 3-2 create a timer/*parameter:1.time interval2.callback functionreturn:timer object pointer*/timer_ = this->create_wall_timer(1s, std::bind(&MinimalPublisher::timer_callback,this));}private:void timer_callback(){// 3-3 organize messages and publish themauto message = std_msgs::msg::String();message.data = "Hello world!" + std::to_string(count++);RCLCPP_INFO(this->get_logger(), "Published message: '%s'",message.data.c_str());publisher_->publish(message);}rclcpp::TimerBase::SharedPtr timer_;rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;size_t count;
};
int main(int argc,char const *argv[]){// 2.initialize ROS2 clientrclcpp::init(argc,argv);// 4.call the spin function and pass in the node object pointerrclcpp::spin(std::make_shared<MinimalPublisher>());// 5.release resourcesrclcpp::shutdown();return 0;
}

点击web上的Subscribe后可以看到web的订阅话题,自己对着这个话题编写ros2发布方程序就可以了

在这里插入图片描述

5、启动listener

先运行

ros2 topic list

然后点击web端的Publish就可以从web端发送信息到ros2
在这里插入图片描述
参考链接:

古月居的利用Websocket实现ROS与Web的交互
https://www.guyuehome.com/5386

ros官网
http://wiki.ros.org/roslibjs/Tutorials/BasicRosFunctionality

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

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

相关文章

子网掩码的作用

1.子网掩码的作用 子网掩码是用来给ip划分网络位和主机位的。 子网掩码是为了给ip确定谁是网络地址、谁是主机地址的。子网掩码的二进制位是1的对应的是网络地址&#xff0c;子网掩码的二进制位是0的对应的是主机地址。

Ribbon负载均衡器

两种&#xff1a; 1.1 集中式负载均衡&#xff0c;服务端负载均衡 硬件 nginx 轮询、负载、哈希、随机、权重 为什么要做负载均衡&#xff1f; 1.2 客户端负载均衡器 用客户端 负载均衡器 很多机制可以自定义 小知识&#xff1a;不想让别人调自己&#xff0c;只想用别人的…

使用Arduino简单测试HC-08蓝牙模块

目录 模块简介模块测试接线代码测试现象 总结 模块简介 HC-08 蓝牙串口通信模块是新一代的基于 Bluetooth Specification V4.0 BLE 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM&#xff0c;调制方式是 GFSK。模块最大发射功率为4dBm&#xff0c;接收灵度-93dBm&#xff0c…

51单片机光照强度检测自动路灯开关仿真( proteus仿真+程序+报告+讲解视频)

51单片机光照强度检测自动路灯开关仿真( proteus仿真程序报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0052 讲解视频 基于51单片机的光照检测自动路灯控制仿真设计( proteus仿…

如何搭建游戏平台?

搭建游戏平台是一个复杂的任务&#xff0c;涉及多个方面的工作。下面是一些关键步骤和注意事项&#xff0c;以帮助您搭建游戏平台&#xff1a; 平台开发&#xff1a;开发游戏平台的关键部分&#xff0c;包括网站或应用程序的开发、数据库设计、用户界面设计、游戏上传和管理工具…

加速新药问世,药企如何利用云+网的优势?

随着计算能力的不断提高和人工智能技术的迅速发展&#xff0c;药物研发领域正迎来一场革命。云端强大的智能算法正成为药物研发企业的得力助手&#xff0c;推动着药物的精确设计和固相筛选。这使得药物设计、固相筛选以及药物制剂开发的时间大幅缩短&#xff0c;有望加速新药物…

MyBatis之增删查改功能

文章目录 一、创建各种类二、MyBatis的各种功能 1、查询<select>2、增加<insert>3、修改<update>4、删除<delete>三、总结 前言 在MyBatis项目中编写代码实现对MySql数据库的增删查改 一、创建各种类 1、在Java包的mapper文件下创建一个接口 我创建…

vmware NAT模式配置方式

VMware在NAT模式下宿主机与多台虚拟机互相访问&#xff0c;可连接外网 虚拟机的网络连接类型的选择&#xff0c;网络连接类型一共有桥接、NAT、仅主机和不联网四种。 桥接&#xff1a;选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系&#xff0c;相当于连接在同一交换机…

滚雪球学Java(25):动态代理

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

SpringBoot配置加载优先级

1.SpringBoot配置文件 SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件。支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的YAML的文件配置。 以设置应用端口为例: properties文件示例(application.properties)&#xff1a; server.port80 Y…

pytorch学习2

分类问题 手写数字数据集 其中&#xff0c;每个数字图片大小是28 x 28&#xff0c;矩阵中每个元素的大小为[0&#xff0c;1]区间的灰度值&#xff0c;将二维矩阵拉平(flat)为一维784&#xff0c;数据量不变&#xff0c;这样能忽略上下位置相关性&#xff0c;甚至左右位置相关性…

编译opencv-3.4.5 [交叉编译]

在unbuntu20.04环境下编译opencv3.4.5&#xff0c; cmake 版本&#xff1a;3.27.4 gcc 版本&#xff1a;11.4.0 g版本&#xff1a;11.4.0 在此环境下编译opencv4.5.4正常。 1. 编译时遇到的问题 &#xff08;1&#xff09; Built target libprotobuf make: *** [Makefile:163…

Linux开发工具之编辑器-vim

vim简单来说就是一款文本编辑器&#xff0c;用于写代码&#xff0c;更是一款多模式编辑器 vim的基本概念 vim有许多种模式&#xff0c;但是铁三角是以下三种模式&#xff1a;命令模式&#xff0c;插入模式&#xff0c;底行模式 1 正常/普通/命令模式&#xff08;默认打开&…

mySQL 安装

一、windows安装包下载 mysql官网提供了两种安装方式&#xff0c;一个是zip安装&#xff0c;另一个是msi安装&#xff0c;这里简绍第一种安装方式&#xff0c;第二种简单&#xff0c;不再简绍 官网下载&#xff0c;根据自己需要选择版本&#xff1a;MySQL :: MySQL Community…

ReactNative中升级IOS 17版本Crash解决

ReactNative中升级IOS 17版本Crash解决 ReactNative中升级IOS 17版本Crash解决一、问题描述二、原因分析三、解决方案决策3.1 设置宽高为非零值3.2 使用新的UIGraphicsImageRenderer替换就版本的UIGraphicsBeginImageContext 四、可能使用到该API的三方库4.1 react-native-fast…

反转单链表

思路图1&#xff1a; 代码&#xff1a; struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…

高云FPGA系列教程(8):ARM串口数据接收(中断和轮询方式)

文章目录 [toc]1. GW1NSR-4C串口外设简介2. FPGA配置3. 常用函数4. 轮询方式接收数据5. 中断方式接收数据 本文是高云FPGA系列教程的第8篇文章。 本篇文章介绍片上ARM Cortex-M3硬核处理器串口外设的使用&#xff0c;演示轮询方式和中断方式接收串口数据&#xff0c;并进行回环…

安卓机型固件系统分区的基础组成 手机启动规律初步常识 各分区的基本含义与说明

此贴为基本常识。感兴趣的友友可以了解手机的启动顺序和各模式的基本操作与意义。另外了解手机系统分区各文件夹的含义 分区说明对应贴&#xff1a;安卓机型固件中分区对应说明 手机开机基本启动顺序 当我们按下手机开机键的时候。基本的启动顺序为 注意&#xff1a;该结构图…

Facebook最佳聊单工具--SaleSmartly,智能回复+控评+群控分流

关于SaleSmartlySaleSmartly--全渠道客户沟通平台,它可以帮助企业实现聊天自动化、智能化&#xff0c;提高员工效率&#xff0c;降低人工成本&#xff0c;提升客服质量。 在管理facebook时&#xff0c;你遇到的痛点&#xff1a; &#xff08;1&#xff09;FB聊单如何实现业务最…

大麦订单生成器最新版 大麦订单一键生成截图

1.可以一键添加&#xff0c;生成的假订单没有水印&#xff0c;界面也很真实。 2.在软件中输入生成的信息&#xff0c;这是产品信息&#xff0c;选择生成的产品图像&#xff0c;最后生成它。 后台一键生成&#xff0c;独立后台管理 教程&#xff1a;解压源码&#xff0c;修改…