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
效果图:
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
)删掉, 删除完成以后大概长这个样子
报错 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>
成品效果图:
rosviz
github仓库地址: https://github.com/jstnhuang/ros-rviz
User guide: https://github.com/jstnhuang/ros-rviz/wiki/User-guide