Coder Social home page Coder Social logo

rosboard's Introduction

ROSboard

ROS node that runs a web server on your robot. Run the node, point your web browser at http://your-robot-ip:8888/ and you get nice visualizations.

ROS1/ROS2 compatible. This package will work in either ROS version.

Mobile friendly. Designed so you can walk around next to your robot with a phone while viewing ROS topics.

Light weight. Doesn't depending on much. Consumes extremely little resources when it's not actually being used.

Easily extensible. Easily code a visualization for a custom type by only adding only one .js file here and referncing it inside the top of index.js.

You can run it on your desktop too and play a ROS bag.

Also be sure to check out my terminal visualization tool, ROSshow.

screenshot

Prerequisites

sudo pip3 install tornado
sudo pip3 install simplejpeg  # recommended, but ROSboard can fall back to cv2 or PIL instead

If you intend to use this with melodic or earlier, you also need rospkg to allow python3 ROS1 nodes to work.

sudo pip3 install rospkg      # required for melodic and earlier distros

Running it the easy way (without installing it into a workspace)

source /opt/ros/YOUR_ROS1_OR_ROS2_DISTRO/setup.bash
./run

Point your web browser at http://localhost:8888 (or replace localhost with your robot's IP) and you're good to go.

Installing it as a ROS package

This ROS package should work in either ROS1 or ROS2. Simply drop it into your catkin_ws/src/ or colcon_ws/src/ and it should just work.

For ROS 1, run it with rosrun rosboard rosboard_node or put it in your launch file.

For ROS 2, run it with ros2 run rosboard rosboard_node or put it in your launch file.

FAQ

How do I write a visualizer for a custom type?

Just add a new viewer class that inherits from Viewer, following the examples of the default viewers. Then add it to the imports at the top of index.js and you're done.

How does this work in both ROS1 and ROS2?

I make use of rospy2, a shim library I wrote that behaves like ROS1's rospy but speaks ROS2 to the system, communicating with rclpy in the background. This allows using the same ros node code for both ROS1 and ROS2, and only needs slight differences in the package metadata files (package.xml and CMakeLists.txt, hence the configure scripts). It does mean that everything is written in ROS1 style, but it ensures compatibility with both ROS1 and ROS2 without having to maintain multiple branches or repos.

Why don't you use rosbridge-suite or Robot Web Tools?

They are a great project, I initially used it, but moved away from it in favor of a custom Tornado-based websocket bridge, for a few reasons:

  • It's less easy to be ROS1 and ROS2 compatible when depending on these libraries. The advantage of doing my own websocket implementation in Tornado is that the custom websocket API speaks exactly the same language regardless of whether the back-end is ROS1 or ROS2.

  • Custom implementation allows me to use lossy compression on large messages (e.g. Image or PointCloud2) before sending it over the websocket, robot-side timestamps on all messages, and possibly throttling in the future.

  • I don't want the browser to have "superuser" access to the ROS system, only have the functionality necessary for this to work.

  • I also want to add a basic username/password authorization at some point in the future.

  • Many times in the past, the robot web tools are not available immediately on apt-get when ROS distros are released, and one has to wait months. This depends on only some standard Python libraries like tornado and optionally PIL and does not depend on any distro-specific ROS packages, so it should theoretically work immediately when new ROS distros are released.

Credits

This project makes use of a number of open-source libraries which the author is extremely grateful of.

  • Tornado: Used as a web server and web socket server. Copyright (C) The Tornado Authors Apache 2.0 License

  • simplejpeg: Used for encoding and decoding JPEG format. Copyright (C) Joachim Folz MIT License

  • psutil - Used for monitoring system resource utilization. Copyright (C) Giampaolo Rodola BSD 3-clause license

  • Masonry: Used for laying out cards on the page. Copyright (C) David DeSandro MIT License

  • Leaflet.js: Used for rendering sensor_msgs/NavSatFix messages. Copyright (C) Vladimir Agafonkin CloudMade, BSD 2-clause license

  • Material Design Lite - Used for general UI theming and widgets of the web-based client. Copyright (C) Google, Inc. Apache 2.0 License

  • jQuery - Used for client-side DOM manipulation. Copyright (C) OpenJS Foundation MIT License

  • litegl.js - Used as a wrapper for the WebGL API for 3D visualizations. Copyright (C) Evan Wallace, Javi Agenjo MIT License

  • glMatrix - For Matrix manipulations for 3D visualizations. Copyright (C) Brandon Jones, Colin MacKenzie IV. MIT License

  • rosbag.js - Used for reading ROS 1 .bag files. Copyright (C) Cruise Automation MIT License

  • uPlot - Used for all time-series plots. Copyright (C) Leon Sorokin MIT License

  • JSON5 - Used for encoding/decoding JSON5 messages. Copyright (C) Aseem Kishore, and others. MIT License

  • JetBrains Mono - Used for all fixed-width text in the web UI. Copyright (C) The JetBrains Mono Project Authors SIL Open Font License 1.1

  • Titillium Web - Used for all variable-width text in the web UI. Copyright (C) Accademia di Belle Arti di Urbino and students of MA course of Visual design SIL Open Font License 1.1

rosboard's People

Contributors

brendanburns avatar dheera avatar hakuturu583 avatar iamphytan avatar jccurtis avatar m2-farzan avatar mjbogusz avatar pepisg avatar soraxas avatar timple avatar warenick avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rosboard's Issues

Initial Subscription of Specific Topics

I would like to know how do I display any specified topics by default? For example everytime I open rosboard, the Image topic will always show on the dashboard? Any help is much appreciated.

Issue with added custom visualizer

Hi, I'm trying to add a custom map viewer (to use my own map image) by creating a CustomMapViewer that inherits from Viewer and also imported it it in the index.js file.
I am able to subscribe to the custom topic but the custom map viewer is not being loaded.

image
image

Below is my CustomMapViewer.js:

"use strict";

class CustomMapViewer extends Viewer {
  /**
    * Gets called when Viewer is first initialized.
    * @override
  **/
  onCreate() {
    this.viewer = $('<div></div>')
      .css({'font-size': '11pt'
    , "filter": "invert(100%) saturate(50%)"})
      .appendTo(this.card.content);

    this.mapId = "map-" + Math.floor(Math.random()*10000);

    this.map = $('<div id="' + this.mapId + '"></div>')
      .css({
        "height": "1000px",
      })
      .appendTo(this.viewer);

    this.mapLeaflet = L.map(this.mapId, {
        crs: L.CRS.Simple
    })

    this.bounds = [[0,0], [1000,1000]];
    this.image = L.imageOverlay('/home/xxxx/catkin_ws/src/rosboard/rosboard/html/assets/my_map.jpeg', this.bounds).addTo(this.mapLeaflet);
    this.mapLeaflet.fitBounds(bounds)

    this.markers = [];
  }

  onData(msg) {
      this.card.title.text(msg._topic_name);
      if(msg.data.length > 0){
        this.markers = msg.data
      } else {
        this.markers = []
      }

      for(let i=0; i < this.marker.length; i++){
        this.mapLeaflet.removeLayer(this.marker[i]);
      }

      for(let i=0; i < msg.data.length; i++){
        L.marker([msg.data[i].y, msg.data[i].x]).addTo(this.mapLeaflet);
      }
  }
}

CustomMapViewer.friendlyName = "Custom Map";

CustomMapViewer.supportedTypes = [
    "test_msg/CoordArr",
];

CustomMapViewer.maxUpdateRate = 10.0;

Viewer.registerViewer(CustomMapViewer);

Can someone help to point out if there are any issue with my code or did I miss out any other places that need further configuration?

Crash on empty point_cloud2

Hi there, thanks for the great visualisation package!

I'm trying to visualise a point_cloud2 topic which occasionally contains no points (it is the output of a filtering operation, and sometimes all points are removed by the filter).

When rosboard receives the empty message it crashes with the error:

Traceback (most recent call last):
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/tmp/colcon_ws/build/rosboard/rosboard/rospy2/__init__.py", line 82, in _thread_spin_target
    rclpy.spin(_node)
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/__init__.py", line 191, in spin
    executor.spin_once()
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/executors.py", line 711, in spin_once
    raise handler.exception()
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/task.py", line 239, in __call__
    self._handler.send(None)
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/executors.py", line 426, in handler                                               await call_coroutine(entity, arg)
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/executors.py", line 351, in _execute_subscription
    await await_or_execute(sub.callback, msg)                                                                                           File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/executors.py", line 118, in await_or_execute
    return callback(*args)
  File "/tmp/colcon_ws/build/rosboard/rosboard/rospy2/__init__.py", line 245, in _ros2_callback                                           self.callback(msg, self.callback_args)
  File "/tmp/colcon_ws/build/rosboard/rosboard/rosboard.py", line 324, in on_ros_msg
    ros_msg_dict = ros2dict(msg)                                                                                                        File "/tmp/colcon_ws/build/rosboard/rosboard/serialization.py", line 66, in ros2dict
    rosboard.compression.compress_point_cloud2(msg, output)
  File "/tmp/colcon_ws/build/rosboard/rosboard/compression.py", line 278, in compress_point_cloud2
    xmax = np.max(xpoints)                                                                                                              File "<__array_function__ internals>", line 5, in amax
  File "/tmp/colcon_ws/venv/lib/python3.8/site-packages/numpy/core/fromnumeric.py", line 2733, in amax
    return _wrapreduction(a, np.maximum, 'max', axis, None, out,                                                                        File "/tmp/colcon_ws/venv/lib/python3.8/site-packages/numpy/core/fromnumeric.py", line 87, in _wrapreduction
    return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
ValueError: zero-size array to reduction operation maximum which has no identity

Looks like the issue is with calling np.max on an empty array.

My workaround was as follows, I confirmed this works for my case:

$ git rev-parse HEAD
7ac609d8ab321cddf098bbf503ec3dee12324f1e
$ git diff
diff --git a/rosboard/compression.py b/rosboard/compression.py
index 3f36590..a6cdbd5 100644
--- a/rosboard/compression.py
+++ b/rosboard/compression.py
@@ -273,6 +273,10 @@ def compress_point_cloud2(msg, output):
         idx = np.random.randint(points.size, size=65536)
         points = points[idx]

+    if points.size == 0:
+        output["_warn"] = "Received empty PointCloud2 - ignoring"
+        return
+
     xpoints = points['x'].astype(np.float32)
     xmax = np.max(xpoints)
     xmin = np.min(xpoints)

If you're OK with that change I can put it in a pull request. Otherwise I'm not sure what the best fix would be,

I added the following in `rosboard/rosboard.py` after line 135 and it works.

It fixed this error but now:

[INFO] [1695856654.803669864] [rosboard_node]: Subscribing to /scan
[WARN] [1695856654.804567837] [rosboard_node]: name 'HistoryPolicy' is not defined
Traceback (most recent call last):
File "/home/can/workspaces/rosboard_ws/install/rosboard/lib/python3.10/site-packages/rosboard/rosboard.py", line 264, in sync_subs
kwargs = {"qos": self.get_topic_qos(topic_name)}
File "/home/can/workspaces/rosboard_ws/install/rosboard/lib/python3.10/site-packages/rosboard/rosboard.py", line 137, in get_topic_qos
if(topic_info[0].qos_profile.history == HistoryPolicy.UNKNOWN):
NameError: name 'HistoryPolicy' is not defined
[INFO] [1695856655.809106101] [rosboard_node]: Subscribing to /scan
[WARN] [1695856655.812603795] [rosboard_node]: name 'HistoryPolicy' is not defined

          I added the following in `rosboard/rosboard.py` after line 135 and it works.
                if(topic_info[0].qos_profile.history == HistoryPolicy.UNKNOWN):
                    topic_info[0].qos_profile.history = HistoryPolicy.KEEP_LAST  

Originally posted by @HX2003 in #104 (review)

Feature request: set title

Currently the title is set to the hostname via socket.gethostname().

For us this is a random generated, so not very descriptive.
Ideally one can set this 'title' via a ROS parameter. Which can still default to the hostname of course.

Running it the easy way, doesn't appear to work.

Cool project. Browser can attach, websockets seem fine, but the subscribe appears to explode using the run script.
Exception below

System:
Ubuntu 22.04
ros2 humble

Cheers

[INFO] [1718838209.987495459] [rosboard_node]: Subscribing to /clock

[rcutils|error_handling.c:108] rcutils_set_error_state()
This error state is being overwritten:

'Unknown QoS history policy, at ./src/qos.cpp:61'

with this new error message:

'create_publisher() failed setting topic QoS, at ./src/subscription.cpp:221'

rcutils_reset_error() should be called after error handling to avoid this.
<<<

[rcutils|error_handling.c:108] rcutils_set_error_state()
This error state is being overwritten:

'create_publisher() failed setting topic QoS, at ./src/subscription.cpp:221, at ./src/rcl/subscription.c:109'

with this new error message:

'invalid allocator, at ./src/rcl/subscription.c:219'

rcutils_reset_error() should be called after error handling to avoid this.
<<<
invalid allocator, at ./src/rcl/subscription.c:219
dmesg: read kernel buffer failed: Operation not permitted
[WARN] [1718838210.018317523] [rosboard_node]: Failed to create subscription: invalid allocator, at ./src/rcl/subscription.c:219
Traceback (most recent call last):
File "/home/gperry/github/rosboard/rosboard/rosboard.py", line 261, in sync_subs
self.local_subs[topic_name] = rospy.Subscriber(
File "/home/gperry/github/rosboard/rosboard/rospy2/init.py", line 225, in init
self._sub = _node.create_subscription(topic_type, topic_name, self._ros2_callback, qos, event_callbacks = rclpy.qos_event.SubscriptionEventCallbacks())
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/node.py", line 1370, in create_subscription
subscription_object = _rclpy.Subscription(
rclpy._rclpy_pybind11.RCLError: Failed to create subscription: invalid allocator, at ./src/rcl/subscription.c:219
Exception ignored in: <function Subscriber.del at 0x7ce5c8a82e60>
Traceback (most recent call last):
File "/home/gperry/github/rosboard/rosboard/rospy2/init.py", line 231, in del
_node.destroy_subscription(self._sub)
AttributeError: 'Subscriber' object has no attribute '_sub'
[INFO] [1718838210.027604725] [rosboard_node]: Subscribing to /clock

[rcutils|error_handling.c:108] rcutils_set_error_state()
This error state is being overwritten:

'Unknown QoS history policy, at ./src/qos.cpp:61'

with this new error message:

'create_publisher() failed setting topic QoS, at ./src/subscription.cpp:221'

rcutils_reset_error() should be called after error handling to avoid this.
<<<

[rcutils|error_handling.c:108] rcutils_set_error_state()
This error state is being overwritten:

'create_publisher() failed setting topic QoS, at ./src/subscription.cpp:221, at ./src/rcl/subscription.c:109'

with this new error message:

'invalid allocator, at ./src/rcl/subscription.c:219'

rcutils_reset_error() should be called after error handling to avoid this.
<<<
invalid allocator, at ./src/rcl/subscription.c:219
[WARN] [1718838210.050833275] [rosboard_node]: Failed to create subscription: invalid allocator, at ./src/rcl/subscription.c:219
Traceback (most recent call last):
File "/home/gperry/github/rosboard/rosboard/rosboard.py", line 261, in sync_subs
self.local_subs[topic_name] = rospy.Subscriber(
File "/home/gperry/github/rosboard/rosboard/rospy2/init.py", line 225, in init
self._sub = _node.create_subscription(topic_type, topic_name, self._ros2_callback, qos, event_callbacks = rclpy.qos_event.SubscriptionEventCallbacks())
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/node.py", line 1370, in create_subscription
subscription_object = _rclpy.Subscription(
rclpy._rclpy_pybind11.RCLError: Failed to create subscription: invalid allocator, at ./src/rcl/subscription.c:219
Exception ignored in: <function Subscriber.del at 0x7ce5c8a82e60>
Traceback (most recent call last):
File "/home/gperry/github/rosboard/rosboard/rospy2/init.py", line 231, in del
_node.destroy_subscription(self._sub)
AttributeError: 'Subscriber' object has no attribute '_sub'
[INFO] [1718838210.063940514] [rosboard_node]: Subscribing to /clock

[rcutils|error_handling.c:108] rcutils_set_error_state()

Right mouse drag stop working when opening 2 cards

Hi,
first, thank you for this awesome project.
It’s very useful!

I have 2 PointCloud2 topics.
When I visualize both of them in 2 cards, the first card stop capture drag with right mouse click and recognize it as left mouse click. After I close the second card, the first one is working properly with left mouse click drag.
I have tried to debug the code in 3DSpaceViewer but couldn't understand why it's happening.

Cannot have more than 1 devices opening rosboard with publishers

Hi,

I implemented a publishers in rosboard for me to control the velocity of the robot. However I realised that if there are more than 1 devices opening the rosboard, both devices will publish to a different velocity, causing the velocity to fluctuate. So my question is, is there a way to filter the velocities published from all sides? I cannot use a ID to identify different nodes since the nodes are having the same name too (rosboard_node).

Can I get a UID in rosboard to publish to a different topic name so that I can filter the velocities? Or is there any other ways to deal with this issue? Any help or guidance is much appreciated.

Thank you.

unable to create subscriber with "AttributeError: 'Subscriber' object has no attribute '_sub'"

Hello,

I can run the rosboard, and the web page shows up, but when adding a topic, it gives the following error:

INFO] [1695774220.093828816] [rosboard_node]: Subscribing to /odom

[rcutils|error_handling.c:108] rcutils_set_error_state()
This error state is being overwritten:

'Unknown QoS history policy, at ./src/qos.cpp:61'

with this new error message:

'create_publisher() failed setting topic QoS, at ./src/subscription.cpp:221'

rcutils_reset_error() should be called after error handling to avoid this.
<<<

[rcutils|error_handling.c:108] rcutils_set_error_state()
This error state is being overwritten:

'create_publisher() failed setting topic QoS, at ./src/subscription.cpp:221, at ./src/rcl/subscription.c:108'

with this new error message:

'invalid allocator, at ./src/rcl/subscription.c:218'

rcutils_reset_error() should be called after error handling to avoid this.
<<<
invalid allocator, at ./src/rcl/subscription.c:218
[WARN] [1695774220.115531469] [rosboard_node]: Failed to create subscription: invalid allocator, at ./src/rcl/subscription.c:218
Traceback (most recent call last):
File "/home/can/rosboard_ws/install/rosboard/lib/python3.10/site-packages/rosboard/rosboard.py", line 261, in sync_subs
self.local_subs[topic_name] = rospy.Subscriber(
File "/home/can/rosboard_ws/install/rosboard/lib/python3.10/site-packages/rosboard/rospy2/init.py", line 225, in init
self._sub = _node.create_subscription(topic_type, topic_name, self._ros2_callback, qos, event_callbacks = rclpy.qos_event.SubscriptionEventCallbacks())
File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/node.py", line 1370, in create_subscription
subscription_object = _rclpy.Subscription(
rclpy._rclpy_pybind11.RCLError: Failed to create subscription: invalid allocator, at ./src/rcl/subscription.c:218
Exception ignored in: <function Subscriber.del at 0xffffa4e47be0>
Traceback (most recent call last):
File "/home/can/rosboard_ws/install/rosboard/lib/python3.10/site-packages/rosboard/rospy2/init.py", line 231, in del
_node.destroy_subscription(self._sub)
AttributeError: 'Subscriber' object has no attribute '_sub'

I have tried both on the robot and laptop to see if it was a QoS problem, but could not get around the error.

Best Regards,
C.A.

Allow fullscreen mode on android

Hello,

On the android version of firefox, on a normal website, the address bar disappears when you scroll down the page. However I don't observe this behaviour with rosboard, the address bar always stays there. Would there be a way to allow a fullscreen mode for rosboard on android ?
Thank you.

Unable to start rosboard

Hi,

I pulled the package, ran ./run, and went to localhost:8888. The browser tries to load (spinning semicircle in chrome) without sucess.
Using python 3.6.9

[Feature request] Add the option to change the QoS of a topic

When QoS doesn't match, nothing is received. For that an option to set up the QoS of the topic like in rviz2 would be very helful. For example for OccupancyGrid topics for static maps, normally the QoS is Durability: TRANSIENT_LOCAL, which currently doesn't work with rosboard.

Add Custom Panel with custom msg

Hi! I'm student and i'm trying make a custom panel with custom msg but i don't understand the flow, my first question what hierarchy i must have ( i have the rosboard package and workspace package in the same level),
i have my package with my custom message:
Custom.msg:

int32 example0
int32 example1
int32 example2
int32 example3
int32 example4
int32 example5

in my CMakeLists.txt i have added:

- find_package(std_msgs REQUIRED)
- find_package(rosidl_default_generators REQUIRED)
- ament_export_dependencies(rosidl_default_runtime)

in my package.xml i have added:

- <buildtool_depend>rosidl_default_generators</buildtool_depend>
- <depend>std_msgs</depend>
-<member_of_group>rosidl_interface_packages</member_of_group>

but i don't understand how to join de custom message to new panel, should I add the subscriber in the custom package or in the rosboard package(where i make the python file with the topic and the logic?
Here is my .js:

"use strict";

class VehicleDataViewer extends Viewer {
  onCreate() {
    this.card.title.text("Vehicle Data");
    this.viewerNode = $('<div></div>')
      .addClass('vehicle-data-viewer')
      .css({'font-size': '14pt', 'padding': '10px'})
      .appendTo(this.card.content);

    this.fields = [
          'example0',
          'example1',
          'example2',
          'example3',
          'example4',
          'example5'
];
    this.dataTable = $('<table></table>')
      .addClass('mdl-data-table')
      .addClass('mdl-js-data-table')
      .css({'width': '100%', 'table-layout': 'fixed' })
      .appendTo(this.viewerNode);
    this.fieldNodes = {};
    this.fields.forEach(field => {
      let tr = $('<tr></tr>').appendTo(this.dataTable);
      $('<td></td>')
        .text(this.fieldLabels[field])
        .css({'font-weight': 'bold'})
        .appendTo(tr);
      this.fieldNodes[field] = $('<td></td>').appendTo(tr);
    });

    super.onCreate();
  }

  onData(data) {
    this.fields.forEach(field => {
      this.fieldNodes[field].text(data[field] || 'N/A');
    });
  }
}

VehicleDataViewer.friendlyName = "Vehicle Data";

VehicleDataViewer.supportedTypes = [
    "std_msgs/msg/Int32.msg"
];

Viewer.registerViewer(VehicleDataViewer);

also i have imported to index.js.

[Feature request] Publishing data

Hello!

Some people already requested this, but is there an easy (and dirty?) way of publishing any data from rosboard to the local ROS program?
I stared writing my master-thesis and want to use your Webinterface to primarily view the topics data but also want to be able to publish simple messages (bool, int) ( e.g. by a button or checkbox) to other local nodes.
I'd also like to do some programming but im fairly new to ROS and Webdevelopment in general, so I don't really know on where to start. Maybe you can help me out or tell me where to implement such thing as publishing data.

I really appreciate any help you can provide.

Initialize pointcloud viewer to a default view

Hi,

I'm trying to initialize the point cloud viewer to a default orthographic view so it presents a top-down bird's eye view of the point cloud when messages start betting published on the subscribed topic. Can anyone guide me on how I could do that? Any help would be gretly appreciated.

Thanks

[Feature request] Add buttons for service calls

Is there any plan for adding buttons that will provide access to ROS Service calls or even topic publishers?

What would be the necessary steps for implementing such modules for rosboard?

hard coding message subscription and viewer type

Hi,

First of all this is excellent work! Thanks for sharing this with the community.

I am wondering if there's an easy way to run rosboard so that it always starts of subscribing to a fixed message with the appropriate viewer visible? I'm a Javascript newbie so I'm not sure how I could accomplish that by editing the index.js file.

Thanks for your help in advance.

Resizing of available windows

Hi, first of all rosboard is awesome.

I'm wondering is it possible to change default window size?

I would like to use only two windows, and currently, one of them is quite small as you can see from the image.

HMI

Thank you for your answer.

Installation simplification

You might not be aware, but <package format="3"> enables conditional dependencies in the package.xml. Like so

This could ease the installation procedure I think.

Once pointcloud support is there I will certainly give this dashboard a go. (And will create a PR for this if not already done so).

[Feature request] Support for external visualizers

Is there any plan for supporting outside visualizers?
This way updating to newer ROSboard version would be much easier.

Alternatively ROSboard could be converted into a library so that another package could use it as dependency and only provide additional visualizers (and possibly a simple entry point).

AttributeError: 'WebSocketProtocol13' object has no attribute 'is_closing'

Running on Ubuntu 20.04, ROS2 Galactic (configured as a ROS2 package in a workspace).

At first I thought it was because of the tornado installed from apt (python3-tornado), but the same error appeared after installing fresh tornado in a virtualenv.

Logs:

Error sending message: 'WebSocketProtocol13' object has no attribute 'is_closing'
Traceback (most recent call last):
  File "/home/mjbogusz/apcar_ws/install/rosboard/lib/python3.8/site-packages/rosboard/handlers.py", line 83, in broadcast
    if socket.ws_connection and not socket.ws_connection.is_closing():
AttributeError: 'WebSocketProtocol13' object has no attribute 'is_closing'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.