ROS学习(28)Web GUI

2023-05-16

文章目录

  • 前言
  • 一、rosbridge_suite元功能包
  • 二、roslibjs、ros2djs、ros3djs功能包
  • 三、tf2_web_republisher功能包
  • 四、创建web应用
  • 五、使用web浏览器控制机器人


前言

  ROS Web tools社区开发了很多功能强大的web功能包。针对本篇文章,创建新的工作空间catkin_js_ws,并进行初始化等操作。

一、rosbridge_suite元功能包

  rosbridge_suite功能包用于完成web浏览器和ROS之间的数据交互,是一种中间件,屏蔽了ROS中复杂的算法、接口、消息传递机制等,使用socket序列化协议为机器人应用提供更为简单的接口。
  rosbridge_suite允许使用html5 web sockets或者标准的posix ip sockets进行ros的消息传送。
安装,命令如下:

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

该元功能包包含如下三个功能包:

  1. rosbridge_library:提供ROS消息与JSON消息之间转换的python API
  2. rosbridge_server:提供websocket服务
  3. rosapi:通过服务调用来获取ROS中的Topic和Parameters

二、roslibjs、ros2djs、ros3djs功能包

ROS web tools开发了一系列rosbridge的客户端功能包,可以通过web浏览器发送JSON命令,在不同场景中实现ROS丰富的功能。

  1. roslibjs:实现了ROS中的部分功能,例如Topic、Server、actionlib、TF、URDF等。
  2. ros2djs:在roslibjs的基础上提供二维可视化管理工具,例如在web浏览器中可视化显示二维地图。
  3. ros3djs:提供三维可视化工具,可以基于web创建一个rviz实例,三维显示URDF、TF等信息。

这三个功能包需要通过源码编译的方式进行安装,命令如下:

git clone https://github.com/RobotWebTools/roslibjs.git
git clone https://github.com/RobotWebTools/ros2djs.git
git clone https://github.com/RobotWebTools/ros3djs.git

下载源码到catkin_ws工作空间,即可使用catkin_make命令进行编译。

三、tf2_web_republisher功能包

该功能包可以计算TF数据,并且发送到ros3djs客户端,实现机器人的运动。
需要通过源码编译的方式进行安装,命令如下:

sudo apt-get install ros-kinetic-tf2-ros
git clone https://github.com/RobotWebTools/tf2_web_republisher

工作空间src目录,如图所示:
在这里插入图片描述
然后执行编译命令,编译成功,如下:
请添加图片描述

四、创建web应用

功能描述:通过web远程控制机器人运动,并且显示机器人的三维模型。
实现原理:使用keyboardteleopjs功能包,通过JavaScript实现浏览器中对键盘按键的识别,并且发布Twist消息。Twist消息会由rosbridge的客户端使用JSON命令通过web sockets发送到服务器,然后服务器负责解析消息,通过controller控制机器人移动。而tf2_web_republisher会将机器人的TF数据通过rosbridge发送到客户端,在ros3djs的可视化显示中更新机器人状态。
创建功能包web_gui,创建keyboardteleop.html文件,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-3.5.1.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-3.5.1.slim.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.12.4.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.12.4.min.js"></script>
    <script src="http://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/blitzer/jquery-ui.css">
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/cupertino/jquery-ui.css">
    <script src="https://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script>
    <script src="https://static.robotwebtools.org/roslibjs/current/roslib.js"></script>
    <script src="/home/zt/catkin_js_ws/src/ros3djs/build/ros3d.js"></script>
    <script src="/home/zt/catkin_js_ws/src/ros3djs/build/ros3d.min.js"></script>
    <script src="/home/zt/catkin_js_ws/src/web_gui/build/keyboardteleop.js"></script>

<script>
  /**
   * Setup all GUI elements when the page is loaded. 
   */

  var teleop_topic = '/cmd_vel'
  var base_frame = 'odom';

  var init_flag = false

function submit_values(){
  teleop_topic = document.getElementById("tele_topic").value;
  base_frame = document.getElementById("base_frame_name").value;

  init_flag = true;
  init();
}

function init() {

	if(init_flag == true)
	{
		// Connecting to ROS.
		var ros = new ROSLIB.Ros({
			url : 'ws://localhost:9090'
		});


		// Initialize the teleop.
		var teleop = new KEYBOARDTELEOP.Teleop({
			ros : ros,
			topic : teleop_topic
		});

	////////////////////////////////////////////////////////////////////////////////////////////////////////
		var viewer = new ROS3D.Viewer({
			background : 000,
			divID : 'urdf',
			width : 1280,
			height : 600,
			antialias : true

		});

		// Add a grid.
		viewer.addObject(new ROS3D.Grid());

		// Setup a client to listen to TFs.
		var tfClient = new ROSLIB.TFClient({
			ros : ros,
			fixedFrame : base_frame,
			angularThres : 0.01,
			transThres : 0.01,
			rate : 10.0
		});

		// Setup the URDF client.

		var urdfClient = new ROS3D.UrdfClient({
			ros : ros,
			tfClient : tfClient,
			path : 'http://resources.robotwebtools.org/',
			rootObject : viewer.scene,
			loader : ROS3D.COLLADA_LOADER
		});


	///////////////////////////////////////////////////////////////////////////////////////////////////

		// Create a UI slider using JQuery UI.
		$('#speed-slider').slider({
			range : 'min',
			min : 0,
			max : 100,
			value : 90,
			slide : function(event, ui) {
				// Change the speed label.
				$('#speed-label').html('Speed: ' + ui.value + '%');
				// Scale the speed.
				teleop.scale = (ui.value / 100.0);
			}
		});

		// Set the initial speed .
		$('#speed-label').html('Speed: ' + ($('#speed-slider').slider('value')) + '%');
		teleop.scale = ($('#speed-slider').slider('value') / 100.0);

		init_flag = false;
	}
}

</script>
</head>

<body onload="init()">
  <h1>Web-browser keyboard teleoperation</h1>

	<form >
		Teleop topic:<br>
		<input type="text" name="Teleop Topic" id='tele_topic' value="/cmd_vel">
		<br>
		Base frame:<br>
		<input type="text" name="Base frame" id='base_frame_name' value="/odom">
		<br>
	 <input type="button" onmousedown="submit_values()" value="Submit"> 
	</form> 

  <p>Run the following commands in the terminal then refresh this page. Check the JavaScript
    console for the output.</p>
  <ol>
    <li><tt>roslaunch mrobot_gazebo view_mrobot_with_kinect_gazebo.launch </tt></li>
    <li><tt>rosrun tf2_web_republisher tf2_web_republisher </tt></li>
    <li><tt>roslaunch rosbridge_server rosbridge_websocket.launch</tt></li>
    <li>Use WASD on your keyboard to move the robot (must have this browser window focused).</li>
  </ol>
  <div id="speed-label"></div>
  <div id="speed-slider"></div>
  <div id="urdf"></div>
</body>

</html>

关键代码解释如下:

var ros = new ROSLIB.Ros({
			url : 'ws://localhost:9090'
		});

创建一个ROSLIB.Ros对象用于连接rosbridge_server,如果rosbridge_server位于本机,IP使用localhost,否则需要修改为相应的IP地址。

var teleop = new KEYBOARDTELEOP.Teleop({
			ros : ros,
			topic : teleop_topic
		});

创建一个KEYBOARDTELEOP.Teleop对象,用来识别键盘按键并且发布消息,发布的话题通过变量teleop_topic设置,也就是”/cmd_vel“,设置了ROS的节点对象ros。

var viewer = new ROS3D.Viewer({
			background : 000,
			divID : 'urdf',
			width : 1280,
			height : 600,
			antialias : true

		});
viewer.addObject(new ROS3D.Grid());

创建一个ROS3D.Viewer的可视化对象,用于显示机器人的URDF模型,同时设置了可视化区域的分辨率尺寸,还通过addObject方法在可视化区域中添加了背景网格。

	var tfClient = new ROSLIB.TFClient({
			ros : ros,
			fixedFrame : base_frame,
			angularThres : 0.01,
			transThres : 0.01,
			rate : 10.0
		});

创建一个TF客户端,订阅tf2_web_republisher功能包发布的TF数据,更新可视化对象中的机器人状态。其中有一个似曾相识的参数——fixedFrame,与rviz中的属性相同。

	var urdfClient = new ROS3D.UrdfClient({
			ros : ros,
			tfClient : tfClient,
			path : 'http://resources.robotwebtools.org/',
			rootObject : viewer.scene,
			loader : ROS3D.COLLADA_LOADER
		});

创建一个URDF客户端,加载机器人模型,设置ROS节点、TF客户端模型加载路径,使用ROS3D.COLLADA_LOADER加载器,通过ROS中的robot_description参数将模型加载到COLLADA文件中。

		$('#speed-slider').slider({
			range : 'min',
			min : 0,
			max : 100,
			value : 90,
			slide : function(event, ui) {
				// Change the speed label.
				$('#speed-label').html('Speed: ' + ui.value + '%');
				// Scale the speed.
				teleop.scale = (ui.value / 100.0);
			}
		});

		// Set the initial speed .
		$('#speed-label').html('Speed: ' + ($('#speed-slider').slider('value')) + '%');
		teleop.scale = ($('#speed-slider').slider('value') / 100.0);

创建一个滑动条,控制机器人的速度大小。

	<form >
		Teleop topic:<br>
		<input type="text" name="Teleop Topic" id='tele_topic' value="/cmd_vel">
		<br>
		Base frame:<br>
		<input type="text" name="Base frame" id='base_frame_name' value="/odom">
		<br>
	 <input type="button" onmousedown="submit_values()" value="Submit"> 
	</form> 

创建两个输入框,用于设置速度控制的话题名和基坐标系名,创建确认按钮,点击后会提交输入框的表单,修改程序中的变量值。

五、使用web浏览器控制机器人

这里使用之前自定义的机器人模型,启动机器人模型,命令如下:

roslaunch robot_sim_gazebo robot.launch

启动成功,RVIZ效果如下:
在这里插入图片描述
gazebo效果如下:
在这里插入图片描述
仿真器启动成功后,就可以启动tf2_web_republisher和rosbridge_server了,命令如下:

rosrun tf2_web_republisher tf2_web_republisher
roslaunch rosbridge_server rosbridge_websocket.launch

现在,服务器的节点全部启动成功。以网页的形式打开keyboardteleop.html,效果如下:
请添加图片描述
  点击submit按钮后,下方会出现速度滑动条和三维可视化界面,机器人很快就在界面中加载出现,类似于RVIZ中的可视化区域。
  如果要使用键盘按键控制机器人的移动,请确保鼠标点在网页上。然后我们就可以使用键盘上的W、A、S、D键控制gazebo仿真器中的机器人前后左右移动,web浏览器中的机器人状态也会更新。
  在以后的学习中,还可以基于web功能包实现web浏览器中的SLAM、导航、语音控制等复杂功能。http://robotwebtools.org/这个网站上提供了很多库用来开发和ROS相关的web应用。

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

ROS学习(28)Web GUI 的相关文章

  • 使用 ASP.NET 进行卷曲请求

    我已经阅读了 Stack 上的其他一些帖子 但我无法让它工作 当我在Windows机器上的git中运行curl命令时 它在我的电脑上工作正常 但是当我将其转换为asp net时 它不起作用 private void BeeBoleReque
  • 如何访问随机网站? - Python

    如何生成随机但有效的网站链接 无论语言如何 事实上 它生成的网站语言越多样化越好 我一直在使用其他人网页上的脚本来做到这一点 我怎样才能不依赖这些随机站点转发脚本并制作自己的脚本 我一直这样做 import webbrowser from
  • Javascript - 事件属性的浏览器命名约定让我感到困惑

    我一直想知道为什么不同浏览器的 JavaScript 中事件的 target sourceElement 的属性名称存在差异 event srcElement in Internet Explorer event target in mos
  • Django 中的 Meta 到底是什么?

    我想简单地知道 Django 中的 Meta 类是什么以及它们的作用 from django db import models Class Author models Model first name models CharField ma
  • css位置固定根本不起作用

    我正在寻找一个页脚类型的东西布莱克霍利网站 http www blakehawley com它有一些不同的链接等 它应该是横幅样式 我的意思是它应该停留在底部并被修复 div 是 菜单 这是我的 HTML
  • 表单标签的 CSS 样式

    据我所知 一个
  • 允许获取请求但仅在我的域中?

    在我的网站上 我可以使用 GET 请求触发某些操作 例如隐藏或删除评论的功能 我不是很担心 但如果有人使用 img src url 设计攻击来删除评论或电子邮件 那会很烦人 有办法防止这种情况吗 我使用 httponlycookies 作为
  • Firebase 9(模块化 sdk web )替换 fieldPath

    我将以下代码与 Firebase SDK 8 一起使用 const db firebase firestore const collectionRef db collection collectionName var query colle
  • VM1550 installHook.js:1860 在控制台中记录为双行

    我正在使用反应应用程序并构建一个简单的应用程序 当我使用 console log 方法在控制台上记录某些内容时 控制台上会出现第二条日志 它似乎来自第 1860 行的文件名 installHook js 我已经尝试过寻找它 但我没有找到 我
  • 如何判断是哪个控件导致ViewState加载失败?

    我的页面面临 Viewstate 加载问题 页面有一个登录工具来登录管理员和非管理员用户 当非管理员用户登录页面并单击启用了自动回发的复选框时 会出现奇怪的行为 错误详情如下 后来我发现 在左侧的导航面板中 承载链接 侧边栏如下图所示 Se
  • 将网页中的表格导入 Excel

    我只有中高级的Excel水平和中级的VBA与Excel背景 我想要做的是从链接中显示的网页导入表格 http www admission unmsm edu pe res20130914 A 011 0 html http www admi
  • Ant Design Collapse - 关闭按钮

    我是 Ant Design 的初学者 在使用 Ant Design 库中的 Collapse 和 Form 时遇到了这个问题 我已经设置了我的页面 其中添加新项目的表单位于折叠中 并且折叠下方有一个项目列表
  • 网页编码,设置矛盾[重复]

    这个问题在这里已经有答案了 如果一个网页有 但http标头有 Content Type text html charset UTF 8 那么假设什么编码呢 在 HTML5 中 优先级定义为 用户浏览器设置 字节顺序标记 HTTP 标头 or
  • 执行预检请求时是否需要 Access-Control-Allow-Origin CORS 标头?

    我们在我们的网站上看到了著名的 CORS 错误 XMLHttpRequest 无法加载https my site com api https my site com api 请求的资源上不存在 Access Control Allow Or
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • JavaScript 中的对象解构[重复]

    这个问题在这里已经有答案了 gt a a true Statement lt a true 上面的语句是赋值true to a 为什么上面的语句在chrome控制台中没有报错 虽然下面的语句给出了错误 gt a a true Stateme
  • Jekyll 在子网站上生成静态网站?

    是否可以将 Jekyll 放在 GitHub 上托管的网站的单个部分上 即是否可以让 example github io 成为常规站点 而 example github io blog 由 Jekyll 静态生成 我相信可以通过创建另一个名
  • 从 Harp.js 中的 EJS 模板调用另一个文件上的 javascript 函数

    尝试使用 Harp js 制作一个网站 我使用 ejs 模板 并希望将一些有用的 javascript 函数存储在中央文件中 我怎么做 我尝试使用 但它不起作用 似乎js文件没有被解析 有任何想法吗 谢谢 尽管有多种方法 有时 可以实现这一
  • 如何在odoo中重写js函数

    我想加载 shop checkout url 函数是 odoo define change info order website sale change info order function require use strict oe w
  • 为什么要使用除 div 以外的任何东西? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • VS Code 常用设置集合

    常用设置 xff08 setting json xff09 34 editor parameterHints enabled 34 true 开启参数预览窗口 设置字体颜色 34 editor semanticTokenColorCusto
  • Arduino--LCD1602(IIC)

    xff08 1 xff09 简介 前篇文章介绍了LCD1602的四位数据线控制方法 xff1a https blog csdn net u011816009 article details 106573622 但是该方法还是需要较多的IO口
  • Px4 ULog文件详解

    Px4 ULog文件详解 简介数据类型文件组织文件头定义段消息标记位消息格式定义消息信息消息复合信息消息参数消息 数据段订阅消息取消订阅消息日志数据消息字符串消息同步消息丢失 附录 简介 ULog 是用于记录数据的文件格式 xff0c 该格
  • 开发日记(一)

    这是自己编程第二天 xff0c 自己解决了好几个问题 xff0c 觉得很有成就感 xff0c 决定写下以后开发中遇到的问题 1 在多个Activity中传递数据 xff0c 之前只学过绑定基本的putExtra xff0c 今天上网一搜 x
  • 源程序生成控制流图和du-path

    最近上 源代码分析技术 这个课 xff0c 老师让写一个程序 xff0c 由一段c代码 xff0c 生成生成控制流图和du path xff0c 控制流图不用解释了 xff0c 说一下du path xff0c 这个术语是针对变量来说的 x
  • pandas使用笔记

    DataFrame使用笔记 dates 61 pd date range span class hljs string 39 20160728 39 span periods 61 span class hljs number 6 span
  • keras

    大神笔记 xff0c 转载自http blog csdn net u012162613 article details 45397033 Keras简介 Keras是基于Theano的一个深度学习框架 xff0c 它的设计参考了Torch
  • gensim similarity计算文档相似度

    向量空间模型计算文档集合相似性 0 将原始输入的词转换为ID xff0c 词的id表示法简单易用 xff0c 但是无法预测未登记词 xff0c 难以挖掘词关系 xff1b 词汇鸿沟 1 任意两个词之间是独立的 xff0c 无法通过词的ID来
  • doc2vec计算文档相似度

    doc2vec是基于word2vec的 xff0c word2vec对于计算两个词语的相似度效率比较好 xff0c 修改了word2vec中的cbow和skip gram模型 xff0c paragraph vector直接得到doc向量
  • 多维中维度的理解

    项目有段时间了 xff0c 今天需要做一个需求查询调研 必须要照顾楼下业务人员理解的方式吧多维度表述清楚 还真不好讲 xff1a 原以为维度就是一个基准点 xff0c 一个看事情的角度 xff0c 静下来想 xff0c 要描述出来好像还真不
  • Spring注解

    注解介绍 注解有两个作用 xff1a 标注和注入 标注 xff1a 类路径下自动扫描 xff0c 减少在xml中配置bean 例如 64 Component 64 Service注入 xff1a 自动装配 xff0c 需要类的地方直接加注解
  • akka基础

    基本概念消息传递API 通用API消息传递方式 Future机制Actor生命周期处理状态和错误 监督kill actor生命周期监控和DeathWatch安全重启状态 纵向扩展 Router调度方式使用策略 横向扩展 订阅集群事件启动 退
  • ROS学习(9)自定义移动机器人模型Gazebo仿真

    文章目录 前言一 gazebo启动二 创建编译功能包三 更新xacro文件1 更新robot base xacro2 更新robot camera xacro3 更新robot lidar xacro4 更新robot xacro 四 更新
  • ROS学习(11)使用ROS创建地图

    文章目录 前言一 创建编译功能包二 更新启动文件三 启动模型四 保存地图五 加载地图六 总结 前言 创建地图是一件比较复杂的工作 xff0c ROS利用map server地图服务器 xff0c 借助激光雷达和机器人的里程信息来完成这项工作
  • ROS学习(12)使用ROS创建自定义地图

    文章目录 前言一 新建环境二 创建编译功能包三 新建 world文件四 新建world启动文件五 更新启动文件六 建图 前言 上一篇使用的是柳树车库环境 xff0c 实现完整建图工作比较复杂 xff0c 所以准备新建一个简单点的环境 xff
  • ROS学习(13)自定义机器人的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 运行启动文件六 为导航功能包集设置rviz七 导航仿真 前言 上一篇针对我家户型 xff0c 完成了自定义环境的建图工作 本篇主要完成对导航功
  • ROS学习(开篇)Ubuntu16.04安装ROS Kinetic详细教程

    文章目录 前言一 添加ROS软件源 xff08 sources list xff09 二 添加密钥三 更新apt功能包列表四 安装ROS五 初始化 rosdep六 将ROS环境变量添加到 bashrc文件中七 安装rosinstall等工具
  • ROS学习(14)自定义四轮小车的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 导航仿真六 总结 前言 本篇为自定义四轮小车的ROS导航仿真 xff0c 与前面自定义机器人导航类似 该篇源码非原创 xff0c 特此说明 x
  • ROS学习(24)plugin插件

    文章目录 前言一 工作原理二 具体实现1 创建基类2 创建plugin类3 注册插件4 编译插件的动态链接库5 将插件加入ROS6 调用插件7 运行效果 前言 ROS中的插件就是可以动态加载的扩展功能类 ROS中的pluginlib功能包提
  • ROS学习(28)Web GUI

    文章目录 前言一 rosbridge suite元功能包二 roslibjs ros2djs ros3djs功能包三 tf2 web republisher功能包四 创建web应用五 使用web浏览器控制机器人 前言 ROS Web too