ARM架构可视化ROS消息方案部署

ARM架构可视化ROS消息方案部署

三种方案, 1. webviz 2. foxglove 3. rosviz

注: web要用firefox, chromimum用不了, 可能是因为取消了时间同步机制的原因

先说三种方案的优劣, webviz 延迟比较高, 但是部署相对简单, foxglove 部署比较费劲, 但是效果不错, 延迟低, 本文会尽量描述清楚如何部署, 去掉目前我发现的这个缺点 , rosvizweb 就算了, 可以但没必要, 功能太简陋了

先从最靠谱的foxglove说起

foxglove

前置条件

sudo apt update
sudo apt install npm git-lfs nodejs -y
# 安装最新的nodejs
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
# 更换镜像源
npm config set registry https://registry.npmmirror.com
sudo npm install -g yarn

安装foxglove开发的类似于rosbridge的ros包, 如果不下的话, 就需要自己考虑去实现foxglove的传输协议, 这一点可以看ws-protocal, 在V0.23.1之后就开始使用该协议了, 如果实在不想下载这个包也不想实现该协议, 可以考虑下载0.23.1版本, 不过这个版本我没研究怎么从源码编译(其实是失败了)

sudo apt install ros-<distro>-foxglove-bridge

注: 以下所有过程建议在代理模式下进行, 否则可能多次失败, 因为在依赖的安装时, 十分依赖github

git clone https://github.com/foxglove/studio.git # 这步可以通过 git clone https://mirror.ghproxy.com/https://github.com/foxglove/studio.git 偷渡
cd studio
sudo corepack enable
git lfs install
git lfs pull
yarn install

运行

cd /path/to/studio
yarn web:serve

效果图:

Screenshot from 2024-01-30 08-39-57

webviz

建议全程在代理环境下进行! 加代理都麻烦的要死, 无代理建议换个方式, linux就用rviz, windows考虑用foxglove吧

此外, 我尝试在arm架构使用webviz, 但是尽管编译成功, 但是出不了图, 看不到相关消息, 如果有大佬知道为什么还请不吝赐教!

git clone https://github.com/cruise-automation/webviz.git
cd webviz
sudo apt install npm
npm run bootstrap
npm run build-static-webviz# 运行webviz
npm run serve-static-webviz 

TroubleShooting

报错 /usr/bin/git ls-remote -h -t + 仓库名
npm ERR! Error while executing:
npm ERR! /usr/bin/git ls-remote -h -t ssh://git@github.com/davidswinegar/chartjs-plugin-datalabels.git

解决:

cd packages/webviz-core
vim package-lock.json

使用/git+ssh 查找所有带git+ssh的字段, 切换为 https://

举个例子

git+ssh://git@github.com/troygibb/react-mosaic.git#860c8d70ba3c723be07bc6208f0d05e2c3f2915f
# 把前面的 git+ssh://git@ 换成 https://
https://github.com/troygibb/react-mosaic.git#860c8d70ba3c723be07bc6208f0d05e2c3f2915f
报错 sha 512 xxxxxxxx 验证不通过
cd packages/webviz-core
vim package-lock.json

通过/chart.js 查找 chart.js并将括号中的验证行(integrity)删掉, 删除完成以后大概长这个样子

Screenshot from 2024-01-24 10-21-16

报错 path = process.cwd(); Error: ENOENT: no such file or directory, uv_cwd

原因: nodejs版本太低, 10.19不行, 要升级到12

# 在下面这行命令执行的过程中会有警告, 因为12也是老版本, 需要等待20s以后才执行该命令, 再等60s以后才开始正式刷新源
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

webviz显示实时运行的信息

主要就是需要一个rosbridge的协助, rosbridge默认的端口为0.0.0.0:9090, 需要修改的话, 建议自建一个rosbridge.launch

# 下载rosbridge
sudo apt update
sudo apt install ros-<rosdistro>-rosbridge-suite# 不需要改端口直接按下面的指令就可以
roslaunch <自己的包> <自己的launch>
roslaunch rosbridge_server rosbridge_websocket.launch # 在0.0.0.0:9090启动rosbridge
cd /path/to/webviz #切换到webviz目录
npm run serve-static-webviz 

如果需要修改ip以及端口, 示例launch文件如下, 这是默认的rosbridge_websocket.launch, 只是修改了地址, 建议不要改端口, 因为webviz监听的是9090, 而我不知道怎么改webviz的端口emmmm

注: rosapi这个node不要删, 因为webviz会通过rosapi去获取消息的类型, 从而显示在浏览器上

<launch><arg name="port" default="9090" /><arg name="address" default="10.168.2.183" /><arg name="ssl" default="false" /><arg name="certfile" default=""/><arg name="keyfile" default="" /><arg name="retry_startup_delay" default="5" /><arg name="fragment_timeout" default="600" /><arg name="delay_between_messages" default="0" /><arg name="max_message_size" default="None" /><arg name="unregister_timeout" default="10" /><arg name="websocket_external_port" default="None" /><arg name="use_compression" default="false" /><arg name="authenticate" default="false" /><arg name="websocket_ping_interval" default="0" /><arg name="websocket_ping_timeout" default="30" /><arg name="websocket_null_origin" default="true" /><arg name="topics_glob" default="[*]" /><arg name="services_glob" default="[*]" /><arg name="params_glob" default="[*]" /><arg name="bson_only_mode" default="false" /><!-- Output: screen, log --><arg name="output" default="screen" /><!-- Valid options for binary_encoder are "default", "b64" and "bson". --><arg unless="$(arg bson_only_mode)" name="binary_encoder" default="default"/><group if="$(arg ssl)"><node name="rosbridge_websocket" pkg="rosbridge_server" type="rosbridge_websocket" output="$(arg output)"><param name="certfile" value="$(arg certfile)" /><param name="keyfile" value="$(arg keyfile)" /><param name="authenticate" value="$(arg authenticate)" /><param name="port" value="$(arg port)"/><param name="address" value="$(arg address)"/><param name="retry_startup_delay" value="$(arg retry_startup_delay)"/><param name="fragment_timeout" value="$(arg fragment_timeout)"/><param name="delay_between_messages" value="$(arg delay_between_messages)"/><param name="max_message_size" value="$(arg max_message_size)"/><param name="unregister_timeout" value="$(arg unregister_timeout)"/><param name="use_compression" value="$(arg use_compression)"/><param name="websocket_ping_interval" value="$(arg websocket_ping_interval)" /><param name="websocket_ping_timeout" value="$(arg websocket_ping_timeout)" /><param name="websocket_external_port" value="$(arg websocket_external_port)" /><param name="websocket_null_origin" value="$(arg websocket_null_origin)" /><param name="topics_glob" value="$(arg topics_glob)"/><param name="services_glob" value="$(arg services_glob)"/><param name="params_glob" value="$(arg params_glob)"/></node></group><group unless="$(arg ssl)"><node name="rosbridge_websocket" pkg="rosbridge_server" type="rosbridge_websocket" output="$(arg output)"><param name="authenticate" value="$(arg authenticate)" /><param name="port" value="$(arg port)"/><param name="address" value="$(arg address)"/><param name="retry_startup_delay" value="$(arg retry_startup_delay)"/><param name="fragment_timeout" value="$(arg fragment_timeout)"/><param name="delay_between_messages" value="$(arg delay_between_messages)"/><param name="max_message_size" value="$(arg max_message_size)"/><param name="unregister_timeout" value="$(arg unregister_timeout)"/><param name="use_compression" value="$(arg use_compression)"/><param name="websocket_ping_interval" value="$(arg websocket_ping_interval)" /><param name="websocket_ping_timeout" value="$(arg websocket_ping_timeout)" /><param name="websocket_external_port" value="$(arg websocket_external_port)" /><param name="topics_glob" value="$(arg topics_glob)"/><param name="services_glob" value="$(arg services_glob)"/><param name="params_glob" value="$(arg params_glob)"/><param name="bson_only_mode" value="$(arg bson_only_mode)"/></node></group><node name="rosapi" pkg="rosapi" type="rosapi_node" output="$(arg output)"><param name="topics_glob" value="$(arg topics_glob)"/><param name="services_glob" value="$(arg services_glob)"/><param name="params_glob" value="$(arg params_glob)"/></node></launch>

成品效果图:

Screenshot from 2024-01-24 10-43-40

rosviz

github仓库地址: https://github.com/jstnhuang/ros-rviz

User guide: https://github.com/jstnhuang/ros-rviz/wiki/User-guide

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

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

相关文章

常见的企业网络问题及SD-WAN解决方案

现在办公都离不开网络&#xff0c;网络问题的解决是企业高效办公的必要条件。目前SD-WAN组网是很多企业会选择的网络解决方案。那么SD-WAN好在哪&#xff1f;可以帮助企业解决哪些用网难题呢&#xff1f; 一.解决网络性能不佳问题 当您的WAN受到压力时&#xff0c;数据包开始下…

Swagger学习使用

swagger升级导致访问ui页面地址不一样 方式一 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.3.RELEASE</version> </parent> <dependen…

FUXA远程命令执行漏洞(CVE-2023-33831)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

C++弹球游戏:Jump Ball Game

一、下载压缩包 请查看网站C弹球游戏&#xff1a;Jump Ball Game并且下载&#xff0c;可以看到如下界面&#xff1a; 二、匹配图标 把压缩包解压了&#xff1a; 右键点击Jump Ball Game.lnk&#xff0c;点击“属性”它将会是我们要运行的文件。 点击“更改图标”&#xff0c;选…

集合问题(并查集)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例1&#xff1a; 输入 4 5 9 2 3 4 5 输出 YES 0 0 1 1 样例2&#xff1a; 输入 3 3 4 1 2 4 输出 NO 思路&#xff1a; 这道题关键点在于。 当集合中有一个元素均存在于集合 A 和集合 B 的时…

嵌入式学习步骤

嵌入式行业是一个涉及广泛领域的行业&#xff0c;嵌入式、物联网、人工智能、智能与科学、电子信息工程、通信工程、自动化工程、测控、计算机科学等专业在嵌入式系统中使得软件和硬件的结合更加高效&#xff0c;适合从事嵌入式物联网开发。 嵌入式学习步骤总结如下&#xff1a…

将有逻辑关系的树形结构数组转换为扁平化的一维对象数组(包含PID、ID父子关系)(tree转换为List)

// 将有逻辑关系的树形结构数组转换为扁平化的一维对象数组 treeStructure2flatArray(arr) {let r [], r_ (ar, PID root) > ar.forEach(v > (v.children && (r_(v.children, v.ID), delete v.children), (v.PID PID, r.push(v))));r_(JSON.parse(JSON.strin…

2.2日总结

第一题&#xff1a;搭配购买 题解&#xff1a;一看就是很普通的01背包问题&#xff0c;但是和查并集一起考了&#xff0c;首先我们需要把每个有联系的链接起来&#xff0c;形成一个大背包&#xff0c;用来装他们的总金额和总价值&#xff0c;然后我们在看一个个的物品进行取或者…

LeetCode.2670. 找出不同元素数目差数组

题目 题目链接 分析 一种暴力的方法&#xff0c;枚举数组所有数字&#xff0c;分别计算当前元素前面不同的元素和后面不同的元素&#xff0c;然后相减即可。这样的话太暴力&#xff0c;前缀和后缀也需要分别遍历&#xff1a;O(N*2)了。 我们来优化一下&#xff1a; 根据这种…

STM32F407移植OpenHarmony笔记8

继上一篇笔记&#xff0c;成功开启了littlefs文件系统&#xff0c;能读写FLASH上的文件了。 今天继续研究网络功能&#xff0c;让控制台的ping命令能工作。 轻量级系统使用的是liteos_m内核lwip协议栈实现网络功能&#xff0c;需要进行配置开启lwip支持。 lwip的移植分为两部分…

Paper - 预测异源多聚体相互作用 Effective Virial Coefficient (有效节流系数) 算法

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135974780 论文&#xff1a;Predicting heteropolymer interactions: demixing and hypermixing of disordered protein sequences 预测异聚物相…

Mysql的BufferPool

Mysql的BufferPool Mysql是一个存储数据到磁盘的进程&#xff0c;但是磁盘的速度难以与CPU相比&#xff0c;所以InnoDB存储引擎在处理客户端的请求时&#xff0c;当需要访问某个页的数据时&#xff0c;就会把完整的页的数据全部加载到内存中。将整个页加载到内存中后就可以进行…

Vue3_基础使用_1

这节主要介绍&#xff1a; vue2与vue3的区别&#xff0c;创建响应式的数据&#xff0c;setup语法糖的使用&#xff0c;watch监听&#xff0c;及vue3创建项目。 vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对…

TryHackMe-Valley

靶场介绍 Boot the box and find a way in to escalate all the way to root! 启动盒子&#xff0c;找到一种方法&#xff0c;一路升级到root&#xff01; 信息收集&端口利用 使用nmap对靶机进行扫描 nmap 10.10.138.189开放22、80和37370端口&#xff0c;先访问80端口查…

Facebook未来展望:社交媒体的下一个篇章

社交媒体一直是连接人与人之间的纽带&#xff0c;而Facebook则一直在推动这一领域的发展。随着科技不断演进和社会需求的不断变迁&#xff0c;Facebook正积极筹谋社交媒体的下一个篇章。本文将深入剖析Facebook的未来展望&#xff0c;探讨其在社交媒体领域所迎接的新时代。 1. …

【开源】SpringBoot框架开发农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

【c语言】strcpy()和strncpy():字符串复制详解

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

TryHackMe-File Inclusion练习

本文相关的TryHackMe实验房间链接&#xff1a;TryHackMe | Why Subscribe 路径遍历(目录遍历) LocationDescription/etc/issue包含要在登录提示之前打印的消息或系统标识。/etc/profile控制系统范围的默认变量&#xff0c;例如导出&#xff08;Export&#xff09;变量、文件创…

Kotlin 协程1:深入理解withContext

Kotlin 协程1&#xff1a;深入理解withContext 引言 在现代编程中&#xff0c;异步编程已经变得非常重要。在 Kotlin 中&#xff0c;协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中&#xff0c;我们将深入探讨 Kotlin 协程中的一个重要函数&#xff1a;wi…

【JAVA】守护线程是什么?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 我的其他博客 正文 在计算机编程中&#xff0c;守护线程&#xff08;daemon thread&#xff09;是一种在程序运行时在后台提供服务的线程…