ros2与web通信实例

news2025/3/1 1:11:42

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 ROS
  var 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 Topic
  var 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
    }
  });//创建一个message

  function 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 Topic
  var 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 published
        parameter:
          1.topic name
          2.QOS(Quality of Service) message queue length
        return:publish object pointer
      */
      publisher_ = this->create_publisher<std_msgs::msg::String>("/chatter",10);
      // 3-2 create a timer
      /*
        parameter:
          1.time interval
          2.callback function
        return: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 them
      auto 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 client
    rclcpp::init(argc,argv);
    // 4.call the spin function and pass in the node object pointer
    rclcpp::spin(std::make_shared<MinimalPublisher>());
    // 5.release resources
    rclcpp::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.coloradmin.cn/o/1026867.html

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

相关文章

Appilot发布:打造面向DevOps场景的开源AI助手

今日&#xff0c;数澈软件Seal &#xff08;以下简称“Seal”&#xff09;宣布推出面向 DevOps 场景的 AI 助手 Appilot&#xff0c;这款产品将充分利用 AI 大语言模型的能力为用户提供变革性的部署和应用管理体验。Seal 此次发布的 Appilot 项目&#xff0c;可以让用户直接输入…

使用 sklearn 进行数学建模的通用模板

前言 无论是本科和研究生都会有的数学建模含金量还是很高的&#xff0c;下面将介绍一下进行数学建模的一些基本操作方法&#xff0c;这里主要是利用sklearn 进行建模&#xff0c;包括前期的一些数据预处理以及一些常用的机器学习模型以及一些简单粗暴的通用建模步骤&#xff0…

论文阅读_大语言模型_Llama2

英文名称: Llama 2: Open Foundation and Fine-Tuned Chat Models 中文名称: Llama 2&#xff1a;开源的基础模型和微调的聊天模型 文章: http://arxiv.org/abs/2307.09288 代码: https://github.com/facebookresearch/llama 作者: Hugo Touvron 日期: 2023-07-19 引用次数: 11…

PHP8的类与对象的基本操作之成员变量-PHP8知识详解

成员变量是指在类中定义的变量。在类中可以声明多个变量&#xff0c;所以对象中可以存在多个成员变量&#xff0c;每个变量将存储不同的对象属性信息。 例如以下定义&#xff1a; public class Goods { 关键字 $name; //类的成员变量 }成员属性必须使用关键词进行修饰&#xf…

淘宝分布式文件存储系统(一) -TFS

淘宝分布式文件存储系统( 一 ) ->>TFS 目录 : 什么是文件系统文件存储的一些概念文件的结构系统读取文件的方式为什么采用大文件结构的原因 文件系统 : 将我们的数据整合成目录或者文件,提供对文件的存取接口,基于文件的权限进行访问,简单的说,文件系统就是对文件进行…

List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

系列文章目录 SpringBootVue3实现登录验证码功能 Java实现发送邮件&#xff08;定时自动发送邮件&#xff09; 换个角度使用Redis去解决跨域存取Session问题 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 更多该系列文章请查看我的主页哦 文章目录…

Vue路由与nodejs环境搭建

目录 一、Vue路由 1.1 SPA简介 1.2 路由简介 1.3 路由实现思路 1.3.1 引入vue-router的js依赖 1.3.2 定义组件 1.3.3 定义路由 1.3.4 组装路由器 1.3.5 将路由挂载根实例 1.3.6 定义触发路由的按钮 1.3.7 定义锚点 1.4 示例 二、nodejs环境搭建 2.1 nodejs简介 2…

MATLAB配置编译器(包括vs和mingw)

版本&#xff1a;matlab2022b&#xff0c;VS2022&#xff0c;mingw&#xff1a;8.1.0 之前安装好了matlab和vs后&#xff0c;在matlab的命令行输入 mex -setup时&#xff0c;自动找到并且配置好了vs编译器&#xff0c;可能是应为二者安装在了同一个根目录下&#xff0c;比如都在…

支付宝开发问题:很抱歉,系统监测到你的支付宝账号有异常,入驻失败,如需帮助请拨打热线

想开发个支付宝小程序&#xff0c;结果困难重重啊 妹的&#xff0c;这一个星期一直都被这个问题困扰&#xff0c;找了一个个体户资质&#xff0c;一直失败&#xff0c;专门去注册了一个公司&#xff0c;还是提交失败。 给支付宝客服打电话&#xff0c;跟没打一样&#xff0c;…

Kafka核心原理

一、kafka安装步骤 &#xff08;1&#xff09;配置profile文件 vim /etc/profile// KAFKA export KAFKA_HOME/opt/soft/kafka212 export PATH$KAFKA_HOME/bin:$PATHsource /etc/profile &#xff08;2&#xff09;创建kfkdata目录 cd /opt/soft/kafka212/ mkdir kfkdata …

OpenCV实现图像去水印功能(inpaint)

水印定位 需要根据图像特征获取水印的位置。 如图所示&#xff0c;图像左下角、右下角有水印。第一步&#xff0c;我们首先得定位水印所在位置。 Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);//图像二值化&#xff0c;筛选出白色区域部分Mat thresh;threshold(gray, thres…

可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享

实战与案例分析——投资案例研究 股票量化程序化自动交易接口 一、成功的可转债投资案例 成功的可转债投资案例提供了有价值的经验教训&#xff0c;以下是一个典型的成功案例&#xff1a; 案例&#xff1a;投资者B的成功可转债投资 投资者B是一位懂得风险管理的投资者&#…

LLM各层参数详细分析(以LLaMA为例)

网上大多分析LLM参数的文章都比较粗粒度&#xff0c;对于LLM的精确部署不太友好&#xff0c;在这里记录一下分析LLM参数的过程。 首先看QKV。先上transformer原文 也就是说&#xff0c;当h&#xff08;heads&#xff09; 1时&#xff0c;在默认情况下&#xff0c; W i Q W_i…

RabbitMQ - 死信、TTL原理、延迟队列安装和配置

目录 一、死信交换机 1.1、什么是死信交换机 1.2、TTL 1.2.1、什么是 TTL 1.2.2、通过 TTL 模拟触发死信 二、延迟队列 2.1、什么是延迟队列 2.2、配置延迟队列插件 2.2.1、延迟队列配置 a&#xff09;下载镜像 b&#xff09;运行容器 c&#xff09;刚刚设定的Rabb…

jmeter下载安装教程

一、下载安装jdk&#xff08;jmeter需要&#xff09; 1、首页下载jdk&#xff0c;地址&#xff1a;Java Downloads | Oracle 2、下载se&#xff0c;注意需要oracle账号&#xff0c;注册即可 这里的8u384代表JDK 8版本&#xff0c;384代表子版本&#xff0c;u是update(更新)的…

flink集群与资源@k8s源码分析-运行时

1 运行时 运行时提供了Flink作业运行过程依赖的基础执行环境,包含Dispatcher、ResourceManager、JobManager和TaskManager等核心组件,本节分析资源相关运行时组件构建和启动。 flink没有使用spring,缺少ioc的构建过程相当复杂,所有依赖手动关联和置入,为了共享组件,fli…

jenkins容器内配置python项目运行环境(Python3.7.3)

目录 1.查看启动的容器2.进入jenkins容器内部3.使用wget&#xff1a;提示没有wget命令4.查看jenkins容器系统版本5.换成国内源&#xff08;阿里&#xff09;5.更新apt-get6.安装wget7.创建python存放目录8.下载python9.解压10.安装依赖11.运行脚本configure12.make编译make ins…

汽车三高试验离不开的远程试验管理平台-TFM

随着信息技术的高速发展&#xff0c;企业对远程试验实时监控与数据管理的需求日益增强。而利用远程试验信息协同技术&#xff0c;可突破部门与地域的限制&#xff0c;并把试验现场的车辆状态信息、试验数据和分析结果实时传输给数据分析部门和设计部门等&#xff0c;从而缩短时…

什么是HTTP/2?它与HTTP/1.1相比有什么改进?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTTP/2 简介⭐ 主要的改进和特点1. 多路复用&#xff08;Multiplexing&#xff09;2. 头部压缩&#xff08;Header Compression&#xff09;3. 服务器推送&#xff08;Server Push&#xff09;4. 二进制传输&#xff08;Binary Protocol&…

12基于MATLAB的短时傅里叶变换( STFT),连续小波变换( CWT),程序已调通,可以直接运行。

基于MATLAB的短时傅里叶变换( STFT),连续小波变换( CWT),程序已调通&#xff0c;可以直接运行