ami-iit / yarp-openmct

Repo for YARP and OpenMCT integration.
BSD 3-Clause "New" or "Revised" License
6 stars 1 forks source link

We can't see the Yarplogger messages right away as they are received on the yarpjs input port #147

Closed nunoguedelha closed 1 year ago

nunoguedelha commented 2 years ago

Refer to [issue 3] in the issue recap below:

Test Report

Objectives

The tests focused on checking the data pipe and overall functionality related to the Yarp Text Logging of the yarprobotinterface process running on the robot head and the module WalkingModule running on some other machine connected to the robot network. The related telemetry domain entries in the Open MCT Visualiser, yarprobotinterface process logging through yarplogger and WalkingModule process logging through yarplogger under the telemetry folder Process Logging: image

Test Sequence, Outcome and Issues

  • Installation went smoothly.
  • [Issue 1]: Running the telemetry server from the folder ./iCubTelemVizServer and node command fails:

    $> cd iCubTelemVizServer
    $> node iCubTelemVizServer.js
    ...
    /Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:282
               this.state[id].ori.roll = sensorSample[3][0][0][0];
                                                           ^
    
    TypeError: Cannot read property '0' of undefined
       at ICubTelemetry.parseFromId (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:282:57)
       at Object.<anonymous> (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:166:31)
       at /Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/iCubTelemVizServer.js:74:56
       at /Users/nunoguedelha/dev/yarp-openmct/node_modules/YarpJS/yarp.js:188:13
    $>
    Full log ``` iCub Telemetry server launched! [INFO] |yarp.os.Port|/yarpjs/inertial:i| Port /yarpjs/inertial:i active at tcp://192.168.1.70:10130/ [INFO] |yarp.os.Port|/yarpjs/head/inertials:i| Port /yarpjs/head/inertials:i active at tcp://192.168.1.70:10131/ [INFO] |yarp.os.Port|/yarpjs/leftArm/inertials:i| Port /yarpjs/leftArm/inertials:i active at tcp://192.168.1.70:10132/ [INFO] |yarp.os.Port|/yarpjs/rightArm/inertials:i| Port /yarpjs/rightArm/inertials:i active at tcp://192.168.1.70:10133/ [INFO] |yarp.os.Port|/yarpjs/leftLeg/inertials:i| Port /yarpjs/leftLeg/inertials:i active at tcp://192.168.1.70:10134/ [INFO] |yarp.os.Port|/yarpjs/rightLeg/inertials:i| Port /yarpjs/rightLeg/inertials:i active at tcp://192.168.1.70:10135/ [INFO] |yarp.os.Port|/yarpjs/leftFoot/inertials:i| Port /yarpjs/leftFoot/inertials:i active at tcp://192.168.1.70:10136/ [INFO] |yarp.os.Port|/yarpjs/rightFoot/inertials:i| Port /yarpjs/rightFoot/inertials:i active at tcp://192.168.1.70:10137/ [INFO] |yarp.os.Port|/yarpjs/left_leg/stateExt:o| Port /yarpjs/left_leg/stateExt:o active at tcp://192.168.1.70:10138/ [INFO] |yarp.os.Port|/yarpjs/right_leg/stateExt:o| Port /yarpjs/right_leg/stateExt:o active at tcp://192.168.1.70:10139/ [INFO] |yarp.os.Port|/yarpjs/left_arm/stateExt:o| Port /yarpjs/left_arm/stateExt:o active at tcp://192.168.1.70:10140/ [INFO] |yarp.os.Port|/yarpjs/right_arm/stateExt:o| Port /yarpjs/right_arm/stateExt:o active at tcp://192.168.1.70:10141/ [INFO] |yarp.os.Port|/yarpjs/torso/stateExt:o| Port /yarpjs/torso/stateExt:o active at tcp://192.168.1.70:10142/ [INFO] |yarp.os.Port|/yarpjs/head/stateExt:o| Port /yarpjs/head/stateExt:o active at tcp://192.168.1.70:10143/ [INFO] |yarp.os.Port|/yarpjs/camLeftEye:i| Port /yarpjs/camLeftEye:i active at tcp://192.168.1.70:10144/ [INFO] |yarp.os.Port|/yarpjs/camRightEye:i| Port /yarpjs/camRightEye:i active at tcp://192.168.1.70:10145/ [INFO] |yarp.os.Port|/yarpjs/left_arm/cartesianEndEffectorWrench:i| Port /yarpjs/left_arm/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10146/ [INFO] |yarp.os.Port|/yarpjs/right_arm/cartesianEndEffectorWrench:i| Port /yarpjs/right_arm/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10147/ [INFO] |yarp.os.Port|/yarpjs/left_upper_leg/cartesianEndEffectorWrench:i| Port /yarpjs/left_upper_leg/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10148/ [INFO] |yarp.os.Port|/yarpjs/left_lower_leg/cartesianEndEffectorWrench:i| Port /yarpjs/left_lower_leg/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10149/ [INFO] |yarp.os.Port|/yarpjs/right_upper_leg/cartesianEndEffectorWrench:i| Port /yarpjs/right_upper_leg/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10150/ [INFO] |yarp.os.Port|/yarpjs/right_lower_leg/cartesianEndEffectorWrench:i| Port /yarpjs/right_lower_leg/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10151/ [INFO] |yarp.os.Port|/yarpjs/left_foot_front/cartesianEndEffectorWrench:i| Port /yarpjs/left_foot_front/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10152/ [INFO] |yarp.os.Port|/yarpjs/left_foot_rear/cartesianEndEffectorWrench:i| Port /yarpjs/left_foot_rear/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10153/ [INFO] |yarp.os.Port|/yarpjs/right_foot_front/cartesianEndEffectorWrench:i| Port /yarpjs/right_foot_front/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10154/ [INFO] |yarp.os.Port|/yarpjs/right_foot_rear/cartesianEndEffectorWrench:i| Port /yarpjs/right_foot_rear/cartesianEndEffectorWrench:i active at tcp://192.168.1.70:10155/ [INFO] |yarp.os.Port|/yarpjs/left_arm/FT:i| Port /yarpjs/left_arm/FT:i active at tcp://192.168.1.70:10156/ [INFO] |yarp.os.Port|/yarpjs/right_arm/FT:i| Port /yarpjs/right_arm/FT:i active at tcp://192.168.1.70:10157/ [INFO] |yarp.os.Port|/yarpjs/left_leg_hip/FT:i| Port /yarpjs/left_leg_hip/FT:i active at tcp://192.168.1.70:10158/ [INFO] |yarp.os.Port|/yarpjs/right_leg_hip/FT:i| Port /yarpjs/right_leg_hip/FT:i active at tcp://192.168.1.70:10159/ [INFO] |yarp.os.Port|/yarpjs/left_foot_heel_tiptoe/FT:i| Port /yarpjs/left_foot_heel_tiptoe/FT:i active at tcp://192.168.1.70:10160/ [INFO] |yarp.os.Port|/yarpjs/right_foot_heel_tiptoe/FT:i| Port /yarpjs/right_foot_heel_tiptoe/FT:i active at tcp://192.168.1.70:10161/ [INFO] |yarp.os.Port|/yarpjs/battery/data:i| Port /yarpjs/battery/data:i active at tcp://192.168.1.70:10162/ [INFO] |yarp.os.Port|/yarpjs/walking-coordinator-logger/data:i| Port /yarpjs/walking-coordinator-logger/data:i active at tcp://192.168.1.70:10163/ [INFO] |yarp.os.Port|/yarpjs/proc-yarprobotinterface-yarptextlogging:i| Port /yarpjs/proc-yarprobotinterface-yarptextlogging:i active at tcp://192.168.1.70:10164/ [INFO] |yarp.os.Port|/yarpjs/proc-walkingmodule-yarptextlogging:i| Port /yarpjs/proc-walkingmodule-yarptextlogging:i active at tcp://192.168.1.70:10165/ [INFO] |yarp.os.Port|/yarpjs/sysCmdsGenerator/rpc| Port /yarpjs/sysCmdsGenerator/rpc active at tcp://192.168.1.70:10166/ { status: 'OK', message: 'Opem-MCT static server process started.' } info:Yarp command successfully started... ICubTelemetry History Server listening on http://192.168.1.70:8081/history ICubTelemetry Realtime Server listening on ws://192.168.1.70:8081/realtime Control Console Server listening on http://192.168.1.70:3000 Yarp port names retrieval completed successfully (0) [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/inertial:i| Receiving input from /icubSim/inertial to /yarpjs/inertial:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/head/inertials:i| Receiving input from /icubSim/head/inertials/measures:o to /yarpjs/head/inertials:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/left_leg/stateExt:o| Receiving input from /icubSim/left_leg/stateExt:o to /yarpjs/left_leg/stateExt:o using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/right_leg/stateExt:o| Receiving input from /icubSim/right_leg/stateExt:o to /yarpjs/right_leg/stateExt:o using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/left_arm/stateExt:o| Receiving input from /icubSim/left_arm/stateExt:o to /yarpjs/left_arm/stateExt:o using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/right_arm/stateExt:o| Receiving input from /icubSim/right_arm/stateExt:o to /yarpjs/right_arm/stateExt:o using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/torso/stateExt:o| Receiving input from /icubSim/torso/stateExt:o to /yarpjs/torso/stateExt:o using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/head/stateExt:o| Receiving input from /icubSim/head/stateExt:o to /yarpjs/head/stateExt:o using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/left_arm/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/left_arm/cartesianEndEffectorWrench:o to /yarpjs/left_arm/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/right_arm/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/right_arm/cartesianEndEffectorWrench:o to /yarpjs/right_arm/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/left_upper_leg/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/left_upper_leg/cartesianEndEffectorWrench:o to /yarpjs/left_upper_leg/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/left_lower_leg/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/left_lower_leg/cartesianEndEffectorWrench:o to /yarpjs/left_lower_leg/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/right_upper_leg/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/right_upper_leg/cartesianEndEffectorWrench:o to /yarpjs/right_upper_leg/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/right_lower_leg/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/right_lower_leg/cartesianEndEffectorWrench:o to /yarpjs/right_lower_leg/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/left_foot_front/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/left_foot_front/cartesianEndEffectorWrench:o to /yarpjs/left_foot_front/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/left_foot_rear/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/left_foot_rear/cartesianEndEffectorWrench:o to /yarpjs/left_foot_rear/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/right_foot_front/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/right_foot_front/cartesianEndEffectorWrench:o to /yarpjs/right_foot_front/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/right_foot_rear/cartesianEndEffectorWrench:i| Receiving input from /wholeBodyDynamics/right_foot_rear/cartesianEndEffectorWrench:o to /yarpjs/right_foot_rear/cartesianEndEffectorWrench:i using tcp [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/proc-yarprobotinterface-yarptextlogging:i| Receiving input from /log/iiticublap199/yarprobotinterfa[yarprobotinterface]/85559 to /yarpjs/proc-yarprobotinterface-yarptextlogging:i using tcp [OPEN-MCT STATIC SERVER] ipc: {"pid":85881} [INFO] |yarp.os.impl.PortCoreInputUnit|/yarpjs/proc-walkingmodule-yarptextlogging:i| Receiving input from /log/iiticublap199/WalkingModule-0.[walkingModule]/85560 to /yarpjs/proc- walkingmodule-yarptextlogging:i using tcp /Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:282 this.state[id].ori.roll = sensorSample[3][0][0][0]; ^ TypeError: Cannot read property '0' of undefined at ICubTelemetry.parseFromId (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:282:57) at Object. (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:166:31) at /Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/iCubTelemVizServer.js:74:56 at /Users/nunoguedelha/dev/yarp-openmct/node_modules/YarpJS/yarp.js:188:13 ```
  • The app could be launched without issues from the repo root:
    npm start
  • [Issue 2]: As soon as the server starts, it crashes with the following issue:

    /Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:404
       this.history[id].push(telemetrySample); // update history
                        ^
    
    TypeError: Cannot read property 'push' of undefined
       at ICubTelemetry.generateTelemetry (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:404:22)
       at ICubTelemetry.<anonymous> (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:183:18)
       at Array.forEach (<anonymous>)
       at ICubTelemetry.<anonymous> (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:182:33)
       at listOnTimeout (internal/timers.js:555:17)
       at processTimers (internal/timers.js:498:7)
    Extended log ``` NEW CONNECTION!! CLOSE CONNECTION [OPEN-MCT STATIC SERVER] stdout: CLOSE CONNECTION NEW CONNECTION!! CLOSE CONNECTION [INFO] |yarp.os.impl.PortCoreInputUnit| Removing input from /log/iiticublap199/WalkingModule-0.[walkingModule]/85560 to /yarpjs/proc-walkingmodule-yarptextlogging:i [INFO] |yarp.os.impl.PortCoreInputUnit| Receiving input from /icubSim/left_foot_heel_tiptoe/measures:o to /yarpjs/left_foot_heel_tiptoe/FT:i using tcp /Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:404 this.history[id].push(telemetrySample); // update history ^ TypeError: Cannot read property 'push' of undefined at ICubTelemetry.generateTelemetry (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:404:22) at ICubTelemetry. (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:183:18) at Array.forEach () at ICubTelemetry. (/Users/nunoguedelha/dev/yarp-openmct/iCubTelemVizServer/icubtelemetry.js:182:33) at listOnTimeout (internal/timers.js:555:17) at processTimers (internal/timers.js:498:7) npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! yarp-openmct@1.0.0 start: `cd iCubTelemVizServer && node ${NODE_DEBUG_OPTION} iCubTelemVizServer.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the yarp-openmct@1.0.0 start script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /Users/nunoguedelha/.npm/_logs/2022-10-04T08_39_39_709Z-debug.log ```
  • The issue was fixed with a debug branch debug/test-with-stefano pushed to the remote repository. Meanwhile, the robot had to go to maintenance.
  • [Issue 3]: Later in the day, @S-Dafarra ran another trial with the debug branch. The issue observed earlier was fixed, no crash ever occurred. We could see the expected Yarplogger messages on the visualiser, but there was a glitch though:
    • As we ran some rpc command (e.g. calib all 300) triggering Yarplogger messages we could not see the messages right away.
    • Later on, we could only see the messages if we clicked on another entry in the left pane, then on the Yarp Text Logging entry back again.
    • There is no log for this issue.

Issues recap

  • [ ] [Issue 1]: Running the telemetry server from the folder ./iCubTelemVizServer with the node command fails
  • [ ] [Issue 2]: Telemetry server crashes at startup when parsing <robot>/left_foot_heel_tiptoe/measures:o port FT data.
  • [ ] [Issue 3]: We can't see the Yarplogger messages right away as they are received on the yarpjs input port, unless we click away from the Yarp Text Logging entry and back again.

_Originally posted by @nunoguedelha in https://github.com/ami-iit/component_ANA-Avatar-XPRIZE/issues/760#issuecomment-1266616475_

nunoguedelha commented 2 years ago

@S-Dafarra reported that:

We shall test together tomorrow with some prints in the code for further analysis.

nunoguedelha commented 1 year ago

I could finally reproduce the issue on my setup by chance. Analysing...

nunoguedelha commented 1 year ago

When the issue occurs, we get the following error on the console twice, for the unsubscribe and for the subscribe events:

WebSocket is already in CLOSING or CLOSED state.
For the SUBSCRIBE event ``` unsubscribe realtim…lemetry-plugin.js:25 unsubscribe TelemetryAPI.js:382 onDestroy PlotSeries.js:116 emit index.js:136 destroy Model.js:64 eval Collection.js:105 forEach Collection.js:56 destroy Collection.js:104 onDestroy PlotConfigurationModel.js:118 emit index.js:115 destroy Model.js:64 ConfigStore.deleteStore ConfigStore.js:29 destroy MctPlot.vue:1054 boundFn vue.js:195 beforeDestroy MctPlot.vue:280 callHook vue.js:2872 Vue.$destroy vue.js:2657 destroy vue.js:4063 invokeDestroyHook vue.js:5590 invokeDestroyHook vue.js:5595 invokeDestroyHook vue.js:5595 patch vue.js:5913 Vue.$destroy vue.js:2680 destroy vue.js:4063 invokeDestroyHook vue.js:5590 patch vue.js:5913 Vue.$destroy vue.js:2680 destroy PlotViewProvider.js:87 clear ObjectView.vue:120 boundFn vue.js:195 updateView ObjectView.vue:203 boundFn vue.js:194 show ObjectView.vue:287 boundFn vue.js:193 viewObject Browse.js:41 onParamsChanged Browse.js:34 emit index.js:144 doParamsChange ApplicationRouter.js:344 handleLocationChange ApplicationRouter.js:371 setQueryString ApplicationRouter.js:405 updateParams ApplicationRouter.js:260 eval Browse.js:95 Async call from Promise.then navigateToPath Browse.js:61 eval Browse.js:20 doPathChange ApplicationRouter.js:314 handleLocationChange ApplicationRouter.js:366 navigate ApplicationRouter.js:136 navigateOrPreview ObjectLabel.vue:78 boundFn vue.js:194 handleClick tree-item.vue:149 boundFn vue.js:194 !click tree-item.vue:20 invoker vue.js:1989 fn._withTask.fn._withTask vue.js:1787 realtim…lemetry-plugin.js:22 ```
For the UNSUBSCRIBE event ``` subscribe realtim…lemetry-plugin.js:22 TelemetryAPI.subscribe TelemetryAPI.js:365 fetch PlotSeries.js:179 load PlotSeries.js:301 eval MctPlot.vue:372 forEach Collection.js:56 loadMoreData MctPlot.vue:369 boundFn vue.js:193 updateDisplayBounds MctPlot.vue:477 boundFn vue.js:194 followTimeContext MctPlot.vue:292 boundFn vue.js:195 setTimeContext MctPlot.vue:288 boundFn vue.js:195 mounted MctPlot.vue:270 callHook vue.js:2872 insert vue.js:4043 invokeInsertHook vue.js:5792 patch vue.js:6011 Vue._update vue.js:2617 updateComponent vue.js:2745 get vue.js:3086 Watcher vue.js:3075 mountComponent vue.js:2749 Vue$3.$mount vue.js:8317 Vue$3.$mount vue.js:10641 Vue._init vue.js:4514 Vue$3 vue.js:4599 show PlotViewProvider.js:66 viewObject.show ViewRegistry.js:95 updateView ObjectView.vue:242 boundFn vue.js:194 show ObjectView.vue:287 boundFn vue.js:193 viewObject Browse.js:41 onParamsChanged Browse.js:34 emit index.js:144 doParamsChange ApplicationRouter.js:344 handleLocationChange ApplicationRouter.js:371 setQueryString ApplicationRouter.js:405 updateParams ApplicationRouter.js:260 eval Browse.js:95 Async call from Promise.then navigateToPath Browse.js:61 eval Browse.js:20 doPathChange ApplicationRouter.js:314 handleLocationChange ApplicationRouter.js:366 navigate ApplicationRouter.js:136 navigateOrPreview ObjectLabel.vue:78 boundFn vue.js:194 handleClick tree-item.vue:149 boundFn vue.js:194 !click tree-item.vue:20 invoker vue.js:1989 fn._withTask.fn._withTask vue.js:1787 ```

The websocket used to subscribe to the telemetry relatime server crashed/closed for some reason unknown to me. Refreshing the client visualizer page restores the websocket. As a workaround, I'll add a warning in the console or on the browser for notifying the user and suggesting to refresh the page.

Ping @S-Dafarra .

nunoguedelha commented 1 year ago

Ciao @S-Dafarra , could you run a test on your side just to check if the issue is still present after re-installing yarp-openmct from scratch?

S-Dafarra commented 1 year ago

Yes, the robot is currently under maintenance, but it should be back shortly. I will pull main and check

S-Dafarra commented 1 year ago

Unfortunately, it seems to be still occurring. I launch the WalkingModule with

YARP_LOG_PROCESS_LABEL=WalkingModule YARP_FORWARD_LOG_ENABLE=1 WalkingModule

then I need to refresh the page (so far so good). Then, I keep sending prepareRobot via RPC to generate an error, but the list of errors is updated only after clinking on another entry. Interestingly, I see the same effect also in the IMU Overlay plot (which, by the way, has only the roll entry repeated three times)

https://user-images.githubusercontent.com/18591940/207129380-9249d3c0-5568-48b9-b328-b610dc39aff9.mp4

If it can be helpful, here the screen recording with the terminal

https://user-images.githubusercontent.com/18591940/207130356-af4dd066-0d0b-4e55-a35d-824d2208b3c8.mp4

nunoguedelha commented 1 year ago

Thanks @S-Dafarra , indeed it seems to be an issue with the realtime updates and the "subscribe" mechanism. Every time you click on the entry, there is an immediate update with the already buffered values, then no further updates.

From that point on, if you refresh the page, does it restore the plot flow (at least for some time until next failure) or do you see the plot curve freezed?

S-Dafarra commented 1 year ago

When refreshing, it hangs without displaying anything

https://user-images.githubusercontent.com/18591940/207356918-e4d11a0f-58de-485a-96fd-0bab544a5e69.mp4

nunoguedelha commented 1 year ago

Ciao @S-Dafarra , I guess you are on commit fbd69b24de04b631ad86016161c69d6414c830fd, right? was this an install from scratch?

S-Dafarra commented 1 year ago

Ciao @S-Dafarra , I guess you are on commit fbd69b2, right?

Yes, you can see the panels on the right.

was this an install from scratch?

I used npm clean-install

nunoguedelha commented 1 year ago

For your info...

Here's how the IMU Overlay in the saved panels is rendered: https://user-images.githubusercontent.com/6848872/207684992-fa96e125-d7b1-44f0-93a2-2ad0bfde1966.mp4

Here is my `npm ls` output: ``` $ npm ls yarp-openmct@1.0.0 /Users/nunoguedelha/dev/yarp-openmct-test-2 ├─┬ express@4.18.2 │ ├─┬ accepts@1.3.8 │ │ ├─┬ mime-types@2.1.34 │ │ │ └── mime-db@1.51.0 │ │ └── negotiator@0.6.3 │ ├── array-flatten@1.1.1 │ ├─┬ body-parser@1.20.1 │ │ ├── bytes@3.1.2 │ │ ├── content-type@1.0.4 deduped │ │ ├── debug@2.6.9 deduped │ │ ├── depd@2.0.0 deduped │ │ ├── destroy@1.2.0 │ │ ├── http-errors@2.0.0 deduped │ │ ├─┬ iconv-lite@0.4.24 │ │ │ └── safer-buffer@2.1.2 │ │ ├── on-finished@2.4.1 deduped │ │ ├── qs@6.11.0 deduped │ │ ├─┬ raw-body@2.5.1 │ │ │ ├── bytes@3.1.2 deduped │ │ │ ├── http-errors@2.0.0 deduped │ │ │ ├── iconv-lite@0.4.24 deduped │ │ │ └── unpipe@1.0.0 deduped │ │ ├── type-is@1.6.18 deduped │ │ └── unpipe@1.0.0 │ ├─┬ content-disposition@0.5.4 │ │ └── safe-buffer@5.2.1 deduped │ ├── content-type@1.0.4 │ ├── cookie@0.5.0 │ ├── cookie-signature@1.0.6 │ ├─┬ debug@2.6.9 │ │ └── ms@2.0.0 │ ├── depd@2.0.0 │ ├── encodeurl@1.0.2 │ ├── escape-html@1.0.3 │ ├── etag@1.8.1 │ ├─┬ finalhandler@1.2.0 │ │ ├── debug@2.6.9 deduped │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── on-finished@2.4.1 deduped │ │ ├── parseurl@1.3.3 deduped │ │ ├── statuses@2.0.1 deduped │ │ └── unpipe@1.0.0 deduped │ ├── fresh@0.5.2 │ ├─┬ http-errors@2.0.0 │ │ ├── depd@2.0.0 deduped │ │ ├── inherits@2.0.4 │ │ ├── setprototypeof@1.2.0 deduped │ │ ├── statuses@2.0.1 deduped │ │ └── toidentifier@1.0.1 │ ├── merge-descriptors@1.0.1 │ ├── methods@1.1.2 │ ├─┬ on-finished@2.4.1 │ │ └── ee-first@1.1.1 │ ├── parseurl@1.3.3 │ ├── path-to-regexp@0.1.7 │ ├─┬ proxy-addr@2.0.7 │ │ ├── forwarded@0.2.0 │ │ └── ipaddr.js@1.9.1 │ ├─┬ qs@6.11.0 │ │ └─┬ side-channel@1.0.4 │ │ ├─┬ call-bind@1.0.2 │ │ │ ├── function-bind@1.1.1 │ │ │ └── get-intrinsic@1.1.3 deduped │ │ ├─┬ get-intrinsic@1.1.3 │ │ │ ├── function-bind@1.1.1 deduped │ │ │ ├─┬ has@1.0.3 │ │ │ │ └── function-bind@1.1.1 deduped │ │ │ └── has-symbols@1.0.3 │ │ └── object-inspect@1.12.2 │ ├── range-parser@1.2.1 │ ├── safe-buffer@5.2.1 │ ├─┬ send@0.18.0 │ │ ├── debug@2.6.9 deduped │ │ ├── depd@2.0.0 deduped │ │ ├── destroy@1.2.0 deduped │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── etag@1.8.1 deduped │ │ ├── fresh@0.5.2 deduped │ │ ├── http-errors@2.0.0 deduped │ │ ├── mime@1.6.0 │ │ ├── ms@2.1.3 │ │ ├── on-finished@2.4.1 deduped │ │ ├── range-parser@1.2.1 deduped │ │ └── statuses@2.0.1 deduped │ ├─┬ serve-static@1.15.0 │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── parseurl@1.3.3 deduped │ │ └── send@0.18.0 deduped │ ├── setprototypeof@1.2.0 │ ├── statuses@2.0.1 │ ├─┬ type-is@1.6.18 │ │ ├── media-typer@0.3.0 │ │ └── mime-types@2.1.34 deduped │ ├── utils-merge@1.0.1 │ └── vary@1.1.2 ├─┬ express-ws@4.0.0 │ └─┬ ws@5.2.3 │ └── async-limiter@1.0.1 ├── jquery@3.6.2 ├── openmct@1.7.8 (git+https://github.com/ami-iit/openmct.git#3e76cbb9aa2620a4660a03639ee0463cade3343f) ├─┬ socket.io@1.5.1 │ ├─┬ debug@2.2.0 │ │ └── ms@0.7.1 │ ├─┬ engine.io@1.7.2 │ │ ├─┬ accepts@1.3.3 │ │ │ ├── mime-types@2.1.34 deduped │ │ │ └── negotiator@0.6.1 │ │ ├── base64id@0.1.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ ├─┬ engine.io-parser@1.3.1 │ │ │ ├── after@0.8.1 │ │ │ ├── arraybuffer.slice@0.0.6 │ │ │ ├── base64-arraybuffer@0.1.5 │ │ │ ├── blob@0.0.4 │ │ │ ├─┬ has-binary@0.1.6 │ │ │ │ └── isarray@0.0.1 deduped │ │ │ └── wtf-8@1.0.0 │ │ └─┬ ws@1.1.1 │ │ ├── options@0.0.6 │ │ └── ultron@1.0.2 │ ├─┬ has-binary@0.1.7 │ │ └── isarray@0.0.1 │ ├─┬ socket.io-adapter@0.4.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ └─┬ socket.io-parser@2.2.2 │ │ ├── benchmark@1.0.0 │ │ ├── component-emitter@1.1.2 deduped │ │ ├── debug@0.7.4 │ │ ├── isarray@0.0.1 deduped │ │ └── json3@3.2.6 │ ├─┬ socket.io-client@1.5.1 │ │ ├── backo2@1.0.2 │ │ ├── component-bind@1.0.0 deduped │ │ ├── component-emitter@1.2.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ ├─┬ engine.io-client@1.7.2 │ │ │ ├── component-emitter@1.1.2 deduped │ │ │ ├── component-inherit@0.0.3 │ │ │ ├─┬ debug@2.2.0 │ │ │ │ └── ms@0.7.1 │ │ │ ├── engine.io-parser@1.3.1 deduped │ │ │ ├── has-cors@1.1.0 │ │ │ ├── indexof@0.0.1 deduped │ │ │ ├─┬ parsejson@0.0.1 │ │ │ │ └── better-assert@1.0.2 deduped │ │ │ ├─┬ parseqs@0.0.2 │ │ │ │ └── better-assert@1.0.2 deduped │ │ │ ├── parseuri@0.0.4 deduped │ │ │ ├─┬ ws@1.1.1 │ │ │ │ ├── options@0.0.6 deduped │ │ │ │ └── ultron@1.0.2 deduped │ │ │ ├── xmlhttprequest-ssl@1.5.1 │ │ │ └── yeast@0.1.2 │ │ ├── has-binary@0.1.7 deduped │ │ ├── indexof@0.0.1 │ │ ├── object-component@0.0.3 │ │ ├─┬ parseuri@0.0.4 │ │ │ └─┬ better-assert@1.0.2 │ │ │ └── callsite@1.0.0 │ │ ├── socket.io-parser@2.3.1 deduped │ │ └── to-array@0.1.4 │ └─┬ socket.io-parser@2.3.1 │ ├── component-emitter@1.1.2 │ ├─┬ debug@2.2.0 │ │ └── ms@0.7.1 │ ├── isarray@0.0.1 deduped │ └── json3@3.3.2 ├─┬ socket.io-stream@0.9.1 │ ├── component-bind@1.0.0 │ └─┬ debug@2.2.0 │ └── ms@0.7.1 ├── ws@7.5.7 └─┬ YarpJS@1.5.0 (git+https://github.com/robotology/yarp.js.git#08c9c2cd6b6957f45ffb58779bc998252d7c5269) ├─┬ cmake-js@6.3.0 │ ├─┬ axios@0.21.4 │ │ └── follow-redirects@1.14.9 │ ├─┬ debug@4.3.3 │ │ └── ms@2.1.2 │ ├─┬ fs-extra@5.0.0 │ │ ├── graceful-fs@4.2.9 │ │ ├─┬ jsonfile@4.0.0 │ │ │ └── graceful-fs@4.2.9 deduped │ │ └── universalify@0.1.2 │ ├── is-iojs@1.1.0 │ ├── lodash@4.17.21 │ ├─┬ memory-stream@0.0.3 │ │ └─┬ readable-stream@1.0.34 │ │ ├── core-util-is@1.0.3 │ │ ├── inherits@2.0.4 deduped │ │ ├── isarray@0.0.1 deduped │ │ └── string_decoder@0.10.31 │ ├─┬ npmlog@1.2.1 │ │ ├── ansi@0.3.1 │ │ ├─┬ are-we-there-yet@1.0.6 │ │ │ ├── delegates@1.0.0 │ │ │ └─┬ readable-stream@2.3.7 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@2.0.1 │ │ │ ├── safe-buffer@5.1.2 │ │ │ ├─┬ string_decoder@1.1.1 │ │ │ │ └── safe-buffer@5.1.2 deduped │ │ │ └── util-deprecate@1.0.2 deduped │ │ └─┬ gauge@1.2.7 │ │ ├── ansi@0.3.1 deduped │ │ ├── has-unicode@2.0.1 │ │ ├── lodash.pad@4.5.1 │ │ ├── lodash.padend@4.6.1 │ │ └── lodash.padstart@4.6.1 │ ├─┬ rc@1.2.8 │ │ ├── deep-extend@0.6.0 │ │ ├── ini@1.3.8 │ │ ├── minimist@1.2.5 │ │ └── strip-json-comments@2.0.1 │ ├── semver@5.7.1 │ ├── splitargs@0.0.7 │ ├─┬ tar@4.4.19 │ │ ├── chownr@1.1.4 │ │ ├─┬ fs-minipass@1.2.7 │ │ │ └── minipass@2.9.0 deduped │ │ ├─┬ minipass@2.9.0 │ │ │ ├── safe-buffer@5.2.1 deduped │ │ │ └── yallist@3.1.1 deduped │ │ ├─┬ minizlib@1.3.3 │ │ │ └── minipass@2.9.0 deduped │ │ ├─┬ mkdirp@0.5.5 │ │ │ └── minimist@1.2.5 deduped │ │ ├── safe-buffer@5.2.1 deduped │ │ └── yallist@3.1.1 │ ├─┬ unzipper@0.8.14 │ │ ├── big-integer@1.6.51 │ │ ├─┬ binary@0.3.0 │ │ │ ├── buffers@0.1.1 │ │ │ └─┬ chainsaw@0.1.0 │ │ │ └── traverse@0.3.9 │ │ ├── bluebird@3.4.7 │ │ ├── buffer-indexof-polyfill@1.0.2 │ │ ├─┬ duplexer2@0.1.4 │ │ │ └─┬ readable-stream@2.3.7 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@2.0.1 deduped │ │ │ ├── safe-buffer@5.1.2 │ │ │ ├─┬ string_decoder@1.1.1 │ │ │ │ └── safe-buffer@5.1.2 deduped │ │ │ └── util-deprecate@1.0.2 deduped │ │ ├─┬ fstream@1.0.12 │ │ │ ├── graceful-fs@4.2.9 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── mkdirp@0.5.5 deduped │ │ │ └─┬ rimraf@2.7.1 │ │ │ └─┬ glob@7.2.0 │ │ │ ├── fs.realpath@1.0.0 │ │ │ ├─┬ inflight@1.0.6 │ │ │ │ ├── once@1.4.0 deduped │ │ │ │ └── wrappy@1.0.2 │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├─┬ minimatch@3.1.2 │ │ │ │ └─┬ brace-expansion@1.1.11 │ │ │ │ ├── balanced-match@1.0.2 │ │ │ │ └── concat-map@0.0.1 │ │ │ ├─┬ once@1.4.0 │ │ │ │ └── wrappy@1.0.2 deduped │ │ │ └── path-is-absolute@1.0.1 │ │ ├── listenercount@1.0.1 │ │ ├─┬ readable-stream@2.1.5 │ │ │ ├── buffer-shims@1.0.0 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@1.0.7 │ │ │ ├── string_decoder@0.10.31 deduped │ │ │ └── util-deprecate@1.0.2 │ │ └── setimmediate@1.0.5 │ ├── url-join@0.0.1 │ ├─┬ which@1.3.1 │ │ └── isexe@2.0.0 │ └─┬ yargs@3.32.0 │ ├── camelcase@2.1.1 │ ├─┬ cliui@3.2.0 │ │ ├── string-width@1.0.2 deduped │ │ ├─┬ strip-ansi@3.0.1 │ │ │ └── ansi-regex@2.1.1 │ │ └─┬ wrap-ansi@2.1.0 │ │ ├── string-width@1.0.2 deduped │ │ └── strip-ansi@3.0.1 deduped │ ├── decamelize@1.2.0 │ ├─┬ os-locale@1.4.0 │ │ └─┬ lcid@1.0.0 │ │ └── invert-kv@1.0.0 │ ├─┬ string-width@1.0.2 │ │ ├── code-point-at@1.1.0 │ │ ├─┬ is-fullwidth-code-point@1.0.0 │ │ │ └── number-is-nan@1.0.1 │ │ └── strip-ansi@3.0.1 deduped │ ├── window-size@0.1.4 │ └── y18n@3.2.2 ├── express@4.18.2 deduped ├── jquery@3.6.2 deduped ├── nan@2.15.0 ├─┬ socket.io@4.4.1 │ ├── accepts@1.3.8 deduped │ ├── base64id@2.0.0 │ ├─┬ debug@4.3.3 │ │ └── ms@2.1.2 │ ├─┬ engine.io@6.1.3 │ │ ├── @types/cookie@0.4.1 │ │ ├── @types/cors@2.8.12 │ │ ├── @types/node@17.0.21 │ │ ├── accepts@1.3.8 deduped │ │ ├── base64id@2.0.0 deduped │ │ ├── cookie@0.4.2 │ │ ├─┬ cors@2.8.5 │ │ │ ├── object-assign@4.1.1 │ │ │ └── vary@1.1.2 deduped │ │ ├── debug@4.3.3 deduped │ │ ├─┬ engine.io-parser@5.0.3 │ │ │ └── @socket.io/base64-arraybuffer@1.0.2 │ │ └── ws@8.2.3 │ ├── socket.io-adapter@2.3.3 │ └─┬ socket.io-parser@4.0.4 │ ├── @types/component-emitter@1.2.11 │ ├── component-emitter@1.3.0 │ └── debug@4.3.3 deduped ├── socket.io-stream@0.9.1 deduped └── three@0.138.0 ```

More particularly:

$ npm ls | grep yarp.js
└─┬ YarpJS@1.5.0 (git+https://github.com/robotology/yarp.js.git#08c9c2cd6b6957f45ffb58779bc998252d7c5269)

$ npm ls | grep openmct
yarp-openmct@1.0.0 /Users/nunoguedelha/dev/yarp-openmct-test-2
├── openmct@1.7.8 (git+https://github.com/ami-iit/openmct.git#3e76cbb9aa2620a4660a03639ee0463cade3343f)

Although the openmct tag appears to be 1.7.8, the commit actually matches the tag 1.7.8-iit, which is the expected one.

S-Dafarra commented 1 year ago

I guess that there are some issues on the robot laptop side.

Here the npm ls output

``` icub@icub-console-xps:/usr/local/src/robot/yarp-openmct$ npm ls yarp-openmct@1.0.0 /usr/local/src/robot/yarp-openmct ├── UNMET DEPENDENCY express@latest ├─┬ express-ws@4.0.0 │ └─┬ ws@5.2.3 │ └── async-limiter@1.0.1 ├── UNMET DEPENDENCY jquery@latest ├── UNMET DEPENDENCY openmct@git+https://github.com/ami-iit/openmct.git#7e67bdba9ff7d6c4a98fa952ce484b3d0f474584 ├─┬ socket.io@1.5.1 │ ├─┬ debug@2.2.0 │ │ └── ms@0.7.1 │ ├─┬ engine.io@1.7.2 │ │ ├─┬ accepts@1.3.3 │ │ │ ├── mime-types@2.1.34 deduped │ │ │ └── negotiator@0.6.1 │ │ ├── base64id@0.1.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ ├─┬ engine.io-parser@1.3.1 │ │ │ ├── after@0.8.1 │ │ │ ├── arraybuffer.slice@0.0.6 │ │ │ ├── base64-arraybuffer@0.1.5 │ │ │ ├── blob@0.0.4 │ │ │ ├─┬ has-binary@0.1.6 │ │ │ │ └── isarray@0.0.1 deduped │ │ │ └── wtf-8@1.0.0 │ │ └─┬ ws@1.1.1 │ │ ├── options@0.0.6 │ │ └── ultron@1.0.2 │ ├─┬ has-binary@0.1.7 │ │ └── isarray@0.0.1 │ ├─┬ socket.io-adapter@0.4.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ └─┬ socket.io-parser@2.2.2 │ │ ├── benchmark@1.0.0 │ │ ├── component-emitter@1.1.2 deduped │ │ ├── debug@0.7.4 │ │ ├── isarray@0.0.1 deduped │ │ └── json3@3.2.6 │ ├─┬ socket.io-client@1.5.1 │ │ ├── backo2@1.0.2 │ │ ├── component-bind@1.0.0 deduped │ │ ├── component-emitter@1.2.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ ├─┬ engine.io-client@1.7.2 │ │ │ ├── component-emitter@1.1.2 deduped │ │ │ ├── component-inherit@0.0.3 │ │ │ ├─┬ debug@2.2.0 │ │ │ │ └── ms@0.7.1 │ │ │ ├── engine.io-parser@1.3.1 deduped │ │ │ ├── has-cors@1.1.0 │ │ │ ├── indexof@0.0.1 deduped │ │ │ ├─┬ parsejson@0.0.1 │ │ │ │ └── better-assert@1.0.2 deduped │ │ │ ├─┬ parseqs@0.0.2 │ │ │ │ └── better-assert@1.0.2 deduped │ │ │ ├── parseuri@0.0.4 deduped │ │ │ ├─┬ ws@1.1.1 │ │ │ │ ├── options@0.0.6 deduped │ │ │ │ └── ultron@1.0.2 deduped │ │ │ ├── xmlhttprequest-ssl@1.5.1 │ │ │ └── yeast@0.1.2 │ │ ├── has-binary@0.1.7 deduped │ │ ├── indexof@0.0.1 │ │ ├── object-component@0.0.3 │ │ ├─┬ parseuri@0.0.4 │ │ │ └─┬ better-assert@1.0.2 │ │ │ └── callsite@1.0.0 │ │ ├── socket.io-parser@2.3.1 deduped │ │ └── to-array@0.1.4 │ └─┬ socket.io-parser@2.3.1 │ ├── component-emitter@1.1.2 │ ├─┬ debug@2.2.0 │ │ └── ms@0.7.1 │ ├── isarray@0.0.1 deduped │ └── json3@3.3.2 ├── UNMET DEPENDENCY socket.io-stream@latest ├── ws@7.5.7 └─┬ UNMET DEPENDENCY YarpJS@git+https://github.com/robotology/yarp.js.git#08c9c2cd6b6957f45ffb58779bc998252d7c5269 ├─┬ cmake-js@6.3.0 │ ├─┬ axios@0.21.4 │ │ └── follow-redirects@1.14.9 │ ├─┬ debug@4.3.3 │ │ └── ms@2.1.2 │ ├─┬ fs-extra@5.0.0 │ │ ├── graceful-fs@4.2.9 │ │ ├─┬ jsonfile@4.0.0 │ │ │ └── graceful-fs@4.2.9 deduped │ │ └── universalify@0.1.2 │ ├── is-iojs@1.1.0 │ ├── lodash@4.17.21 │ ├─┬ memory-stream@0.0.3 │ │ └─┬ readable-stream@1.0.34 │ │ ├── core-util-is@1.0.3 │ │ ├── inherits@2.0.4 │ │ ├── isarray@0.0.1 deduped │ │ └── string_decoder@0.10.31 │ ├─┬ npmlog@1.2.1 │ │ ├── ansi@0.3.1 │ │ ├─┬ are-we-there-yet@1.0.6 │ │ │ ├── delegates@1.0.0 │ │ │ └─┬ readable-stream@2.3.7 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@2.0.1 │ │ │ ├── safe-buffer@5.1.2 │ │ │ ├─┬ string_decoder@1.1.1 │ │ │ │ └── safe-buffer@5.1.2 deduped │ │ │ └── util-deprecate@1.0.2 deduped │ │ └─┬ gauge@1.2.7 │ │ ├── ansi@0.3.1 deduped │ │ ├── has-unicode@2.0.1 │ │ ├── lodash.pad@4.5.1 │ │ ├── lodash.padend@4.6.1 │ │ └── lodash.padstart@4.6.1 │ ├─┬ rc@1.2.8 │ │ ├── deep-extend@0.6.0 │ │ ├── ini@1.3.8 │ │ ├── minimist@1.2.5 │ │ └── strip-json-comments@2.0.1 │ ├── semver@5.7.1 │ ├── splitargs@0.0.7 │ ├─┬ tar@4.4.19 │ │ ├── chownr@1.1.4 │ │ ├─┬ fs-minipass@1.2.7 │ │ │ └── minipass@2.9.0 deduped │ │ ├─┬ minipass@2.9.0 │ │ │ ├── safe-buffer@5.2.1 deduped │ │ │ └── yallist@3.1.1 deduped │ │ ├─┬ minizlib@1.3.3 │ │ │ └── minipass@2.9.0 deduped │ │ ├─┬ mkdirp@0.5.5 │ │ │ └── minimist@1.2.5 deduped │ │ ├── safe-buffer@5.2.1 deduped │ │ └── yallist@3.1.1 │ ├─┬ unzipper@0.8.14 │ │ ├── big-integer@1.6.51 │ │ ├─┬ binary@0.3.0 │ │ │ ├── buffers@0.1.1 │ │ │ └─┬ chainsaw@0.1.0 │ │ │ └── traverse@0.3.9 │ │ ├── bluebird@3.4.7 │ │ ├── buffer-indexof-polyfill@1.0.2 │ │ ├─┬ duplexer2@0.1.4 │ │ │ └─┬ readable-stream@2.3.7 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@2.0.1 deduped │ │ │ ├── safe-buffer@5.1.2 │ │ │ ├─┬ string_decoder@1.1.1 │ │ │ │ └── safe-buffer@5.1.2 deduped │ │ │ └── util-deprecate@1.0.2 deduped │ │ ├─┬ fstream@1.0.12 │ │ │ ├── graceful-fs@4.2.9 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── mkdirp@0.5.5 deduped │ │ │ └─┬ rimraf@2.7.1 │ │ │ └─┬ glob@7.2.0 │ │ │ ├── fs.realpath@1.0.0 │ │ │ ├─┬ inflight@1.0.6 │ │ │ │ ├── once@1.4.0 deduped │ │ │ │ └── wrappy@1.0.2 │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├─┬ minimatch@3.1.2 │ │ │ │ └─┬ brace-expansion@1.1.11 │ │ │ │ ├── balanced-match@1.0.2 │ │ │ │ └── concat-map@0.0.1 │ │ │ ├─┬ once@1.4.0 │ │ │ │ └── wrappy@1.0.2 deduped │ │ │ └── path-is-absolute@1.0.1 │ │ ├── listenercount@1.0.1 │ │ ├─┬ readable-stream@2.1.5 │ │ │ ├── buffer-shims@1.0.0 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@1.0.7 │ │ │ ├── string_decoder@0.10.31 deduped │ │ │ └── util-deprecate@1.0.2 │ │ └── setimmediate@1.0.5 │ ├── url-join@0.0.1 │ ├─┬ which@1.3.1 │ │ └── isexe@2.0.0 │ └─┬ yargs@3.32.0 │ ├── camelcase@2.1.1 │ ├─┬ cliui@3.2.0 │ │ ├── string-width@1.0.2 deduped │ │ ├─┬ strip-ansi@3.0.1 │ │ │ └── ansi-regex@2.1.1 │ │ └─┬ wrap-ansi@2.1.0 │ │ ├── string-width@1.0.2 deduped │ │ └── strip-ansi@3.0.1 deduped │ ├── decamelize@1.2.0 │ ├─┬ os-locale@1.4.0 │ │ └─┬ lcid@1.0.0 │ │ └── invert-kv@1.0.0 │ ├─┬ string-width@1.0.2 │ │ ├── code-point-at@1.1.0 │ │ ├─┬ is-fullwidth-code-point@1.0.0 │ │ │ └── number-is-nan@1.0.1 │ │ └── strip-ansi@3.0.1 deduped │ ├── window-size@0.1.4 │ └── y18n@3.2.2 ├─┬ express@4.17.3 │ ├── accepts@1.3.8 deduped │ ├── array-flatten@1.1.1 │ ├─┬ body-parser@1.19.2 │ │ ├── bytes@3.1.2 │ │ ├── content-type@1.0.4 deduped │ │ ├── debug@2.6.9 deduped │ │ ├── depd@1.1.2 deduped │ │ ├─┬ http-errors@1.8.1 │ │ │ ├── depd@1.1.2 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── setprototypeof@1.2.0 deduped │ │ │ ├── statuses@1.5.0 deduped │ │ │ └── toidentifier@1.0.1 │ │ ├─┬ iconv-lite@0.4.24 │ │ │ └── safer-buffer@2.1.2 │ │ ├── on-finished@2.3.0 deduped │ │ ├── qs@6.9.7 deduped │ │ ├─┬ raw-body@2.4.3 │ │ │ ├── bytes@3.1.2 deduped │ │ │ ├── http-errors@1.8.1 deduped │ │ │ ├── iconv-lite@0.4.24 deduped │ │ │ └── unpipe@1.0.0 deduped │ │ └── type-is@1.6.18 deduped │ ├─┬ content-disposition@0.5.4 │ │ └── safe-buffer@5.2.1 deduped │ ├── content-type@1.0.4 │ ├── cookie@0.4.2 │ ├── cookie-signature@1.0.6 │ ├─┬ debug@2.6.9 │ │ └── ms@2.0.0 │ ├── depd@1.1.2 │ ├── encodeurl@1.0.2 │ ├── escape-html@1.0.3 │ ├── etag@1.8.1 │ ├─┬ finalhandler@1.1.2 │ │ ├── debug@2.6.9 deduped │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── on-finished@2.3.0 deduped │ │ ├── parseurl@1.3.3 deduped │ │ ├── statuses@1.5.0 deduped │ │ └── unpipe@1.0.0 │ ├── fresh@0.5.2 │ ├── merge-descriptors@1.0.1 │ ├── methods@1.1.2 │ ├─┬ on-finished@2.3.0 │ │ └── ee-first@1.1.1 │ ├── parseurl@1.3.3 │ ├── path-to-regexp@0.1.7 │ ├─┬ proxy-addr@2.0.7 │ │ ├── forwarded@0.2.0 │ │ └── ipaddr.js@1.9.1 │ ├── qs@6.9.7 │ ├── range-parser@1.2.1 │ ├── safe-buffer@5.2.1 │ ├─┬ send@0.17.2 │ │ ├── debug@2.6.9 deduped │ │ ├── depd@1.1.2 deduped │ │ ├── destroy@1.0.4 │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── etag@1.8.1 deduped │ │ ├── fresh@0.5.2 deduped │ │ ├── http-errors@1.8.1 deduped │ │ ├── mime@1.6.0 │ │ ├── ms@2.1.3 │ │ ├── on-finished@2.3.0 deduped │ │ ├── range-parser@1.2.1 deduped │ │ └── statuses@1.5.0 deduped │ ├─┬ serve-static@1.14.2 │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── parseurl@1.3.3 deduped │ │ └── send@0.17.2 deduped │ ├── setprototypeof@1.2.0 │ ├── statuses@1.5.0 │ ├─┬ type-is@1.6.18 │ │ ├── media-typer@0.3.0 │ │ └── mime-types@2.1.34 deduped │ ├── utils-merge@1.0.1 │ └── vary@1.1.2 ├── jquery@3.6.0 ├── nan@2.15.0 ├─┬ UNMET DEPENDENCY socket.io@4.4.1 │ ├─┬ accepts@1.3.8 │ │ ├─┬ mime-types@2.1.34 │ │ │ └── mime-db@1.51.0 │ │ └── negotiator@0.6.3 │ ├── UNMET DEPENDENCY base64id@2.0.0 │ ├─┬ UNMET DEPENDENCY debug@4.3.3 │ │ └── UNMET DEPENDENCY ms@2.1.2 │ ├─┬ UNMET DEPENDENCY engine.io@6.1.3 │ │ ├── @types/cookie@0.4.1 │ │ ├── @types/cors@2.8.12 │ │ ├── @types/node@17.0.21 │ │ ├── accepts@1.3.8 deduped │ │ ├── UNMET DEPENDENCY base64id@2.0.0 │ │ ├── cookie@0.4.2 deduped │ │ ├─┬ cors@2.8.5 │ │ │ ├── object-assign@4.1.1 │ │ │ └── vary@1.1.2 deduped │ │ ├── UNMET DEPENDENCY debug@4.3.3 │ │ ├─┬ UNMET DEPENDENCY engine.io-parser@5.0.3 │ │ │ └── @socket.io/base64-arraybuffer@1.0.2 │ │ └── UNMET DEPENDENCY ws@8.2.3 │ ├── UNMET DEPENDENCY socket.io-adapter@2.3.3 │ └─┬ UNMET DEPENDENCY socket.io-parser@4.0.4 │ ├── @types/component-emitter@1.2.11 │ ├── UNMET DEPENDENCY component-emitter@1.3.0 │ └── UNMET DEPENDENCY debug@4.3.3 ├─┬ socket.io-stream@0.9.1 │ ├── component-bind@1.0.0 │ └─┬ debug@2.2.0 │ └── ms@0.7.1 └── three@0.138.0 npm ERR! missing: openmct@git+https://github.com/ami-iit/openmct.git#fix/imagery-flickering, required by yarp-openmct@1.0.0 npm ERR! missing: YarpJS@git+https://github.com/robotology/yarp.js.git, required by yarp-openmct@1.0.0 npm ERR! missing: express@latest, required by yarp-openmct@1.0.0 npm ERR! missing: jquery@latest, required by yarp-openmct@1.0.0 npm ERR! missing: socket.io-stream@latest, required by yarp-openmct@1.0.0 npm ERR! extraneous: openmct@git+https://github.com/ami-iit/openmct.git#7e67bdba9ff7d6c4a98fa952ce484b3d0f474584 /usr/local/src/robot/yarp-openmct/node_modules/openmct npm ERR! missing: socket.io@4.4.1, required by YarpJS@git+https://github.com/robotology/yarp.js.git#08c9c2cd6b6957f45ffb58779bc998252d7c5269 npm ERR! missing: base64id@2.0.0, required by socket.io@4.4.1 npm ERR! missing: debug@4.3.3, required by socket.io@4.4.1 npm ERR! missing: engine.io@6.1.3, required by socket.io@4.4.1 npm ERR! missing: socket.io-adapter@2.3.3, required by socket.io@4.4.1 npm ERR! missing: socket.io-parser@4.0.4, required by socket.io@4.4.1 npm ERR! missing: ms@2.1.2, required by debug@4.3.3 npm ERR! missing: base64id@2.0.0, required by engine.io@6.1.3 npm ERR! missing: debug@4.3.3, required by engine.io@6.1.3 npm ERR! missing: engine.io-parser@5.0.3, required by engine.io@6.1.3 npm ERR! missing: ws@8.2.3, required by engine.io@6.1.3 npm ERR! missing: component-emitter@1.3.0, required by socket.io-parser@4.0.4 npm ERR! missing: debug@4.3.3, required by socket.io-parser@4.0.4 ```

How do I fix the unmet dependencies?

S-Dafarra commented 1 year ago

How do I fix the unmet dependencies?

I have removed the node_modules folder and launched npm install. This fixed the dependencies issue:

npm ls ``` yarp-openmct@1.0.0 /usr/local/src/robot/yarp-openmct ├─┬ express@4.18.2 │ ├─┬ accepts@1.3.8 │ │ ├─┬ mime-types@2.1.34 │ │ │ └── mime-db@1.51.0 │ │ └── negotiator@0.6.3 │ ├── array-flatten@1.1.1 │ ├─┬ body-parser@1.20.1 │ │ ├── bytes@3.1.2 │ │ ├── content-type@1.0.4 deduped │ │ ├── debug@2.6.9 deduped │ │ ├── depd@2.0.0 deduped │ │ ├── destroy@1.2.0 │ │ ├── http-errors@2.0.0 deduped │ │ ├─┬ iconv-lite@0.4.24 │ │ │ └── safer-buffer@2.1.2 │ │ ├── on-finished@2.4.1 deduped │ │ ├── qs@6.11.0 deduped │ │ ├─┬ raw-body@2.5.1 │ │ │ ├── bytes@3.1.2 deduped │ │ │ ├── http-errors@2.0.0 deduped │ │ │ ├── iconv-lite@0.4.24 deduped │ │ │ └── unpipe@1.0.0 deduped │ │ ├── type-is@1.6.18 deduped │ │ └── unpipe@1.0.0 │ ├─┬ content-disposition@0.5.4 │ │ └── safe-buffer@5.2.1 deduped │ ├── content-type@1.0.4 │ ├── cookie@0.5.0 │ ├── cookie-signature@1.0.6 │ ├─┬ debug@2.6.9 │ │ └── ms@2.0.0 │ ├── depd@2.0.0 │ ├── encodeurl@1.0.2 │ ├── escape-html@1.0.3 │ ├── etag@1.8.1 │ ├─┬ finalhandler@1.2.0 │ │ ├── debug@2.6.9 deduped │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── on-finished@2.4.1 deduped │ │ ├── parseurl@1.3.3 deduped │ │ ├── statuses@2.0.1 deduped │ │ └── unpipe@1.0.0 deduped │ ├── fresh@0.5.2 │ ├─┬ http-errors@2.0.0 │ │ ├── depd@2.0.0 deduped │ │ ├── inherits@2.0.4 │ │ ├── setprototypeof@1.2.0 deduped │ │ ├── statuses@2.0.1 deduped │ │ └── toidentifier@1.0.1 │ ├── merge-descriptors@1.0.1 │ ├── methods@1.1.2 │ ├─┬ on-finished@2.4.1 │ │ └── ee-first@1.1.1 │ ├── parseurl@1.3.3 │ ├── path-to-regexp@0.1.7 │ ├─┬ proxy-addr@2.0.7 │ │ ├── forwarded@0.2.0 │ │ └── ipaddr.js@1.9.1 │ ├─┬ qs@6.11.0 │ │ └─┬ side-channel@1.0.4 │ │ ├─┬ call-bind@1.0.2 │ │ │ ├── function-bind@1.1.1 │ │ │ └── get-intrinsic@1.1.3 deduped │ │ ├─┬ get-intrinsic@1.1.3 │ │ │ ├── function-bind@1.1.1 deduped │ │ │ ├─┬ has@1.0.3 │ │ │ │ └── function-bind@1.1.1 deduped │ │ │ └── has-symbols@1.0.3 │ │ └── object-inspect@1.12.2 │ ├── range-parser@1.2.1 │ ├── safe-buffer@5.2.1 │ ├─┬ send@0.18.0 │ │ ├── debug@2.6.9 deduped │ │ ├── depd@2.0.0 deduped │ │ ├── destroy@1.2.0 deduped │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── etag@1.8.1 deduped │ │ ├── fresh@0.5.2 deduped │ │ ├── http-errors@2.0.0 deduped │ │ ├── mime@1.6.0 │ │ ├── ms@2.1.3 │ │ ├── on-finished@2.4.1 deduped │ │ ├── range-parser@1.2.1 deduped │ │ └── statuses@2.0.1 deduped │ ├─┬ serve-static@1.15.0 │ │ ├── encodeurl@1.0.2 deduped │ │ ├── escape-html@1.0.3 deduped │ │ ├── parseurl@1.3.3 deduped │ │ └── send@0.18.0 deduped │ ├── setprototypeof@1.2.0 │ ├── statuses@2.0.1 │ ├─┬ type-is@1.6.18 │ │ ├── media-typer@0.3.0 │ │ └── mime-types@2.1.34 deduped │ ├── utils-merge@1.0.1 │ └── vary@1.1.2 ├─┬ express-ws@4.0.0 │ └─┬ ws@5.2.3 │ └── async-limiter@1.0.1 ├── jquery@3.6.2 ├── openmct@1.7.8 (git+https://github.com/ami-iit/openmct.git#3e76cbb9aa2620a4660a03639ee0463cade3343f) ├─┬ socket.io@1.5.1 │ ├─┬ debug@2.2.0 │ │ └── ms@0.7.1 │ ├─┬ engine.io@1.7.2 │ │ ├─┬ accepts@1.3.3 │ │ │ ├── mime-types@2.1.34 deduped │ │ │ └── negotiator@0.6.1 │ │ ├── base64id@0.1.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ ├─┬ engine.io-parser@1.3.1 │ │ │ ├── after@0.8.1 │ │ │ ├── arraybuffer.slice@0.0.6 │ │ │ ├── base64-arraybuffer@0.1.5 │ │ │ ├── blob@0.0.4 │ │ │ ├─┬ has-binary@0.1.6 │ │ │ │ └── isarray@0.0.1 deduped │ │ │ └── wtf-8@1.0.0 │ │ └─┬ ws@1.1.1 │ │ ├── options@0.0.6 │ │ └── ultron@1.0.2 │ ├─┬ has-binary@0.1.7 │ │ └── isarray@0.0.1 │ ├─┬ socket.io-adapter@0.4.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ └─┬ socket.io-parser@2.2.2 │ │ ├── benchmark@1.0.0 │ │ ├── component-emitter@1.1.2 deduped │ │ ├── debug@0.7.4 │ │ ├── isarray@0.0.1 deduped │ │ └── json3@3.2.6 │ ├─┬ socket.io-client@1.5.1 │ │ ├── backo2@1.0.2 │ │ ├── component-bind@1.0.0 deduped │ │ ├── component-emitter@1.2.0 │ │ ├─┬ debug@2.2.0 │ │ │ └── ms@0.7.1 │ │ ├─┬ engine.io-client@1.7.2 │ │ │ ├── component-emitter@1.1.2 deduped │ │ │ ├── component-inherit@0.0.3 │ │ │ ├─┬ debug@2.2.0 │ │ │ │ └── ms@0.7.1 │ │ │ ├── engine.io-parser@1.3.1 deduped │ │ │ ├── has-cors@1.1.0 │ │ │ ├── indexof@0.0.1 deduped │ │ │ ├─┬ parsejson@0.0.1 │ │ │ │ └── better-assert@1.0.2 deduped │ │ │ ├─┬ parseqs@0.0.2 │ │ │ │ └── better-assert@1.0.2 deduped │ │ │ ├── parseuri@0.0.4 deduped │ │ │ ├─┬ ws@1.1.1 │ │ │ │ ├── options@0.0.6 deduped │ │ │ │ └── ultron@1.0.2 deduped │ │ │ ├── xmlhttprequest-ssl@1.5.1 │ │ │ └── yeast@0.1.2 │ │ ├── has-binary@0.1.7 deduped │ │ ├── indexof@0.0.1 │ │ ├── object-component@0.0.3 │ │ ├─┬ parseuri@0.0.4 │ │ │ └─┬ better-assert@1.0.2 │ │ │ └── callsite@1.0.0 │ │ ├── socket.io-parser@2.3.1 deduped │ │ └── to-array@0.1.4 │ └─┬ socket.io-parser@2.3.1 │ ├── component-emitter@1.1.2 │ ├─┬ debug@2.2.0 │ │ └── ms@0.7.1 │ ├── isarray@0.0.1 deduped │ └── json3@3.3.2 ├─┬ socket.io-stream@0.9.1 │ ├── component-bind@1.0.0 │ └─┬ debug@2.2.0 │ └── ms@0.7.1 ├── ws@7.5.7 └─┬ YarpJS@1.5.0 (git+https://github.com/robotology/yarp.js.git#08c9c2cd6b6957f45ffb58779bc998252d7c5269) ├─┬ cmake-js@6.3.0 │ ├─┬ axios@0.21.4 │ │ └── follow-redirects@1.14.9 │ ├─┬ debug@4.3.3 │ │ └── ms@2.1.2 │ ├─┬ fs-extra@5.0.0 │ │ ├── graceful-fs@4.2.9 │ │ ├─┬ jsonfile@4.0.0 │ │ │ └── graceful-fs@4.2.9 deduped │ │ └── universalify@0.1.2 │ ├── is-iojs@1.1.0 │ ├── lodash@4.17.21 │ ├─┬ memory-stream@0.0.3 │ │ └─┬ readable-stream@1.0.34 │ │ ├── core-util-is@1.0.3 │ │ ├── inherits@2.0.4 deduped │ │ ├── isarray@0.0.1 deduped │ │ └── string_decoder@0.10.31 │ ├─┬ npmlog@1.2.1 │ │ ├── ansi@0.3.1 │ │ ├─┬ are-we-there-yet@1.0.6 │ │ │ ├── delegates@1.0.0 │ │ │ └─┬ readable-stream@2.3.7 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@2.0.1 │ │ │ ├── safe-buffer@5.1.2 │ │ │ ├─┬ string_decoder@1.1.1 │ │ │ │ └── safe-buffer@5.1.2 deduped │ │ │ └── util-deprecate@1.0.2 deduped │ │ └─┬ gauge@1.2.7 │ │ ├── ansi@0.3.1 deduped │ │ ├── has-unicode@2.0.1 │ │ ├── lodash.pad@4.5.1 │ │ ├── lodash.padend@4.6.1 │ │ └── lodash.padstart@4.6.1 │ ├─┬ rc@1.2.8 │ │ ├── deep-extend@0.6.0 │ │ ├── ini@1.3.8 │ │ ├── minimist@1.2.5 │ │ └── strip-json-comments@2.0.1 │ ├── semver@5.7.1 │ ├── splitargs@0.0.7 │ ├─┬ tar@4.4.19 │ │ ├── chownr@1.1.4 │ │ ├─┬ fs-minipass@1.2.7 │ │ │ └── minipass@2.9.0 deduped │ │ ├─┬ minipass@2.9.0 │ │ │ ├── safe-buffer@5.2.1 deduped │ │ │ └── yallist@3.1.1 deduped │ │ ├─┬ minizlib@1.3.3 │ │ │ └── minipass@2.9.0 deduped │ │ ├─┬ mkdirp@0.5.5 │ │ │ └── minimist@1.2.5 deduped │ │ ├── safe-buffer@5.2.1 deduped │ │ └── yallist@3.1.1 │ ├─┬ unzipper@0.8.14 │ │ ├── big-integer@1.6.51 │ │ ├─┬ binary@0.3.0 │ │ │ ├── buffers@0.1.1 │ │ │ └─┬ chainsaw@0.1.0 │ │ │ └── traverse@0.3.9 │ │ ├── bluebird@3.4.7 │ │ ├── buffer-indexof-polyfill@1.0.2 │ │ ├─┬ duplexer2@0.1.4 │ │ │ └─┬ readable-stream@2.3.7 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@2.0.1 deduped │ │ │ ├── safe-buffer@5.1.2 │ │ │ ├─┬ string_decoder@1.1.1 │ │ │ │ └── safe-buffer@5.1.2 deduped │ │ │ └── util-deprecate@1.0.2 deduped │ │ ├─┬ fstream@1.0.12 │ │ │ ├── graceful-fs@4.2.9 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── mkdirp@0.5.5 deduped │ │ │ └─┬ rimraf@2.7.1 │ │ │ └─┬ glob@7.2.0 │ │ │ ├── fs.realpath@1.0.0 │ │ │ ├─┬ inflight@1.0.6 │ │ │ │ ├── once@1.4.0 deduped │ │ │ │ └── wrappy@1.0.2 │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├─┬ minimatch@3.1.2 │ │ │ │ └─┬ brace-expansion@1.1.11 │ │ │ │ ├── balanced-match@1.0.2 │ │ │ │ └── concat-map@0.0.1 │ │ │ ├─┬ once@1.4.0 │ │ │ │ └── wrappy@1.0.2 deduped │ │ │ └── path-is-absolute@1.0.1 │ │ ├── listenercount@1.0.1 │ │ ├─┬ readable-stream@2.1.5 │ │ │ ├── buffer-shims@1.0.0 │ │ │ ├── core-util-is@1.0.3 deduped │ │ │ ├── inherits@2.0.4 deduped │ │ │ ├── isarray@1.0.0 │ │ │ ├── process-nextick-args@1.0.7 │ │ │ ├── string_decoder@0.10.31 deduped │ │ │ └── util-deprecate@1.0.2 │ │ └── setimmediate@1.0.5 │ ├── url-join@0.0.1 │ ├─┬ which@1.3.1 │ │ └── isexe@2.0.0 │ └─┬ yargs@3.32.0 │ ├── camelcase@2.1.1 │ ├─┬ cliui@3.2.0 │ │ ├── string-width@1.0.2 deduped │ │ ├─┬ strip-ansi@3.0.1 │ │ │ └── ansi-regex@2.1.1 │ │ └─┬ wrap-ansi@2.1.0 │ │ ├── string-width@1.0.2 deduped │ │ └── strip-ansi@3.0.1 deduped │ ├── decamelize@1.2.0 │ ├─┬ os-locale@1.4.0 │ │ └─┬ lcid@1.0.0 │ │ └── invert-kv@1.0.0 │ ├─┬ string-width@1.0.2 │ │ ├── code-point-at@1.1.0 │ │ ├─┬ is-fullwidth-code-point@1.0.0 │ │ │ └── number-is-nan@1.0.1 │ │ └── strip-ansi@3.0.1 deduped │ ├── window-size@0.1.4 │ └── y18n@3.2.2 ├── express@4.18.2 deduped ├── jquery@3.6.2 deduped ├── nan@2.15.0 ├─┬ socket.io@4.4.1 │ ├── accepts@1.3.8 deduped │ ├── base64id@2.0.0 │ ├─┬ debug@4.3.3 │ │ └── ms@2.1.2 │ ├─┬ engine.io@6.1.3 │ │ ├── @types/cookie@0.4.1 │ │ ├── @types/cors@2.8.12 │ │ ├── @types/node@17.0.21 │ │ ├── accepts@1.3.8 deduped │ │ ├── base64id@2.0.0 deduped │ │ ├── cookie@0.4.2 │ │ ├─┬ cors@2.8.5 │ │ │ ├── object-assign@4.1.1 │ │ │ └── vary@1.1.2 deduped │ │ ├── debug@4.3.3 deduped │ │ ├─┬ engine.io-parser@5.0.3 │ │ │ └── @socket.io/base64-arraybuffer@1.0.2 │ │ └── ws@8.2.3 │ ├── socket.io-adapter@2.3.3 │ └─┬ socket.io-parser@4.0.4 │ ├── @types/component-emitter@1.2.11 │ ├── component-emitter@1.3.0 │ └── debug@4.3.3 deduped ├── socket.io-stream@0.9.1 deduped └── three@0.138.0 ```
S-Dafarra commented 1 year ago

How do I fix the unmet dependencies?

I have removed the node_modules folder and launched npm install. This fixed the dependencies issue:

This fixed the issue with the IMU plot stopping. I was also able to see the three components :rocket:

Unfortunately, the issue with the logging remains. I can see the new messages only after clicking on another entry.

nunoguedelha commented 1 year ago

Sorry for the late reply @S-Dafarra . It's really great that you got rid of the side issues and we can now focus on the original one. At first glance we seem to have the same npm ls output, at least for the main critical components.

In order for me to reproduce the same setup as much as possible on my machine, could you please tell me which superbuild tag and options you are selecting?

S-Dafarra commented 1 year ago

In order for me to reproduce the same setup as much as possible on my machine, could you please tell me which superbuild tag and options you are selecting?

Just to understand, why do you think it is related to the superbuild? Isn't it depending only on yarp?

nunoguedelha commented 1 year ago

The yarp-openmct has a dependency with Yarp only indeed, I just assumed you were building it with the superbuild. So the Yarp version or even commit suffice.

S-Dafarra commented 1 year ago

The yarp-openmct has a dependency with Yarp only indeed, I just assumed you were building it with the superbuild. So the Yarp version or even commit suffice.

We are on v3.7.2 tag at the moment

nunoguedelha commented 1 year ago

mine is 3.7.2+9-20220908.4+gitb6b13ec5c, commit b6b13ec5cd140f37f7f632f5ac0053cba0a34790.

nunoguedelha commented 1 year ago

Analysis on my setup on the main branch

Process console stdout

[WARNING] wholeBodyDynamics : calibStanding ignoring calib_code  all
[INFO] wholeBodyDynamics: Offset for sensor  l_arm_ft_sensor   0.139563 -0.192468 0.867377  0.00205042 -0.0288921 -0.0565025
[INFO] wholeBodyDynamics: obtained assuming a measurement of  16.7978 16.9138 23.0232 -2.9501 2.21231 0.432722   and an estimated ft of  16.6582 17.1063 22.1558 -2.95215 2.2412 0.489224
[INFO] wholeBodyDynamics: Offset for sensor  r_arm_ft_sensor   0.087036 -0.311485 -0.659271  0.0123236 0.00776771 -0.0080614
[INFO] wholeBodyDynamics: obtained assuming a measurement of  16.4273 -17.1213 21.1105 2.93785 2.21921 -0.496337   and an estimated ft of  16.3402 -16.8098 21.7698 2.92553 2.21144 -0.488276
[INFO] wholeBodyDynamics: Offset for sensor  l_leg_ft_sensor   0.474879 2.73448 195.573  -23.1804 16.4473 0.0447365
[INFO] wholeBodyDynamics: obtained assuming a measurement of  0.531987 2.85784 -154.994 -0.397776 -2.89242 0.0376742   and an estimated ft of  0.0571078 0.123359 -350.567 22.7826 -19.3397 -0.00706231
[INFO] wholeBodyDynamics: Offset for sensor  l_foot_front_ft_sensor   0.534032 -0.222507 -113.87  2.91129 2.57221 0.0064752
[INFO] wholeBodyDynamics: obtained assuming a measurement of  0.533739 -0.223028 -112.116 2.91144 2.57222 0.00647711   and an estimated ft of  -0.000293361 -0.000521004 1.75365 0.000142905 1.21507e-05 1.90716e-06
[INFO] wholeBodyDynamics: Offset for sensor  l_foot_rear_ft_sensor   2.30875 1.11375 309.891  27.78 -13.7213 0.0204486
[INFO] wholeBodyDynamics: obtained assuming a measurement of  2.43386 1.19187 -139.075 0.993804 1.5419 0.0104681   and an estimated ft of  0.12511 0.0781202 -448.966 -26.7862 15.2632 -0.0099805
[INFO] wholeBodyDynamics: Offset for sensor  r_leg_ft_sensor   2.38609 -2.64694 -196.943  0.755242 -2.70461 -0.211887
[INFO] wholeBodyDynamics: obtained assuming a measurement of  2.45691 -2.64455 -159.916 -0.0823162 -3.25203 -0.212323   and an estimated ft of  0.0708203 0.00238504 37.0268 -0.837558 -0.547417 -0.000436473
[INFO] wholeBodyDynamics: Offset for sensor  r_foot_front_ft_sensor   0.368228 1.00459 -118.867  3.72457 0.987084 -0.035494
[INFO] wholeBodyDynamics: obtained assuming a measurement of  0.367637 1.0039 -117.107 3.72349 0.987465 -0.0354924   and an estimated ft of  -0.000591456 -0.00069555 1.76031 -0.00107435 0.000381909 1.65166e-06
[INFO] wholeBodyDynamics: Offset for sensor  r_foot_rear_ft_sensor   -3.18271 -0.396829 -79.8358  2.23825 1.72455 -0.0458248
[INFO] wholeBodyDynamics: obtained assuming a measurement of  -3.21245 -0.320878 -141.499 1.38158 -0.559318 -0.0462589   and an estimated ft of  -0.0297399 0.0759509 -61.6628 -0.856666 -2.28387 -0.00043412
[INFO]  : calibration ended.

Yarp read /log port

$ yarp read ... /log/iiticublap199.lan/yarprobotinterfa[YarpJS_WholeBodyDynamics]/33280

"[/log/iiticublap199.lan/yarprobotinterfa[YarpJS_WholeBodyDynamics]/33280]" "(level WARNING) (systemtime 271715.840681944973767) (networktime 1749.92699999999990723) (message \"wholeBodyDynamics : calibStanding ignoring calib_code  all\")"
"[/log/iiticublap199.lan/yarprobotinterfa[YarpJS_WholeBodyDynamics]/33280]" "(level INFO) (systemtime 271718.883475867973175) (networktime 1752.92100000000004911) (message \"wholeBodyDynamics: Offset for sensor  l_arm_ft_sensor   0.139563 -0.192468 0.867377  0.00205042 -0.0288921 -0.0565025 \")"
"[/log/iiticublap199.lan/yarprobotinterfa[YarpJS_WholeBodyDynamics]/33280]" "(level INFO) (systemtime 271718.883664958004374) (networktime 1752.92100000000004911) (message \"wholeBodyDynamics: Offset for sensor  l_foot_front_ft_sensor   0.534032 -0.222507 -113.87  2.91129 2.57221 0.0064752 \")"
"[/log/iiticublap199.lan/yarprobotinterfa[YarpJS_WholeBodyDynamics]/33280]" "(level INFO) (systemtime 271718.88435693201609) (networktime 1752.92200000000002547) (message \"wholeBodyDynamics: Offset for sensor  r_leg_ft_sensor   2.38609 -2.64694 -196.943  0.755242 -2.70461 -0.211887 \")"
"[/log/iiticublap199.lan/yarprobotinterfa[YarpJS_WholeBodyDynamics]/33280]" "(level INFO) (systemtime 271718.884524972003419) (networktime 1752.92200000000002547) (message \"wholeBodyDynamics: Offset for sensor  r_foot_front_ft_sensor   0.368228 1.00459 -118.867  3.72457 0.987084 -0.035494 \")"
"[/log/iiticublap199.lan/yarprobotinterfa[YarpJS_WholeBodyDynamics]/33280]" "(level INFO) (systemtime 271718.884748503973242) (networktime 1752.92200000000002547) (message \"wholeBodyDynamics: obtained assuming a measurement of  -3.21245 -0.320878 -141.499 1.38158 -0.559318 -0.0462589   and an estimated ft of  -0.0297399 0.0759509 -61.6628 -0.856666 -2.28387 -0.00043412 \")"

Visualizer

The Yarp-OpenMCT visualiser output matches exactly the messages read on the /log port where the running process (yarprobotinterface) forwards the logging messages.

Note: There are missing INFO messages in the /log port read data w.r.t. the messages displayed on the console output, but this is not an yarp-openmct.

nunoguedelha commented 1 year ago

Unfortunately, the issue with the logging remains. I can see the new messages only after clicking on another entry.

Ciao @S-Dafarra , could you please provide the following information collected on the logging of the yarprobotinterface process instead of the walking module, while running "[calibStanding] Calibrate FT sensors" command from the control console (:3000) [^1]:

If you don't have time, we'll do it during our scheduled meeting.

[^1]: "[calibStanding] Calibrate FT sensors" command from the control console:

image
S-Dafarra commented 1 year ago

I have launched the robot interface adding the environmental variable YARP_LOG_PROCESS_LABEL=yarprobotinterface and it seems to be working fine

https://user-images.githubusercontent.com/18591940/208113918-2f090eb9-42cf-4675-9334-6b632604dda1.mp4

S-Dafarra commented 1 year ago

Interestingly, I still have issues with the WalkingModule log, but only on Firefox. I have opened openMCT from Chrome on my PC and I did not have issues (as @nunoguedelha suggested by the way).

S-Dafarra commented 1 year ago

Even more interestingly, after refreshing on Chrome, I started having issues also there

S-Dafarra commented 1 year ago

After restarting yarp-openmct, I was able to restore the continuous stream of messages. Is it possible that previous connections do not get removed when refreshing the page?

nunoguedelha commented 1 year ago

We discussed this directly on Teams and ran some tests together, and after the tests we ran together...

Summary

Observed behaviour

  • Right after starting the server and opening the visualiser page URL on a new tab, the yarp logging messages are displayed properly, as they are received from the /log/... port.
  • After we refresh the page by clicking on the browser refresh icon, we can't see anymore the messages being displayed as we trigger commands generating these messages (e.g. rpc command "calibstanding").
  • If we force-refresh the page by re-typing the URL in the address box and pressing enter, the previously cached data is cleaned and the yarp logging messages are properly displayed again when we run the rpc command "calibstanding".

Probable cause

  • The websocket used for sending realtime updates to the client app every 10ms is not properly restored after the page refresh, as the history buffer data is displayed, then subsequent updates are not => 100% sure
  • This websocket problem is due to a kind of race condition or mis-synch between the Yarp ports de-connection, re-connection completion, followed by the Yarp-openMCT internal data pipe rewiring, and the "realtime" websocket creation by the client app after the index.html file is sent to the browser.

Proposed soludion

Send the index.html file to the browser only after the Yarp - telemetry server connections are completed. Typically we can use a Promise pattern in this case, with the resolve callback sending the index.html file, and the reject callback sending a warning to the console or browser window, or even terminating the server process.

Notes

We discussed about the Yarp logging depth being eventually too short: Stefano is ok with the current depth for now.

Actions

  • Provide a fix tentative for next Monday => Nuno (Fix suggested. Implementation ongoing)
  • if fix is not successful, update the README specifying the workaround (force-refresh by re-entering the page URL) => Nuno
nunoguedelha commented 1 year ago

Tentative fix by #166 .

nunoguedelha commented 1 year ago

Hi @S-Dafarra , for the record and some further clarifications on the issue, I´m just posting here a recording of the issue you described me, which I reproduced on the main branch prior the fix.

https://user-images.githubusercontent.com/6848872/214201049-e4ad02cb-f628-41c2-8328-e9f91e3294d8.mp4

For reproducing the issue observed in the recording, I´ve added a breakpoint in the callback which refreshes the ports after you click on the page refresh button. https://github.com/ami-iit/yarp-openmct/blob/aa499a6dd984ce8dec807a431fba07b22b32c748/iCubTelemVizServer/iCubTelemVizServer.js#L198 The breakpoint delays the yarp name list command and the ports refresh that follows, leading to the observed issue.

What we observe in the recording

We list below the steps leading to the issue:

  1. The last selection in the BROWSE left pane tree is "Legacy IMU sensor measurements" and the plot real time data is updated properly.
  2. We refresh the page by clicking on the browser reload icon. The server process execution stops on the code breakpoint.
  3. We deactivate the breakpoints and resume the process execution. We can see that the plot canvas is empty, with the "waiting to load" wheel, until we click on any other telemetry entry (e.g. "Left leg joint state measurements"), which plot is displayed without issues: proper history and real time loaded.
  4. We click back on "Legacy IMU sensor measurements". This time, the history data is reloaded and plotted, but we see no further real time updates. Meanwhile, if we click on the any other telemetry entry, we can see the plot real time data being updated normally.
  5. If we go back to the faulty telemetry entry, and click the page reload button again (while the breakpoints are still deactivated), the plot refreshes and the real time data are updated normally again.

We initially thought that The websocket used for sending real time updates to the client app every 10ms is not properly restored/opened after the page refresh, as mentioned in comment https://github.com/ami-iit/yarp-openmct/issues/147#issuecomment-1355885945, but this assumption was wrong.

In fact, that websocket is opened correctly and indeed conveys properly the real time data to the other telemetry entries. Nevertheless, it turned out that there is a race condition with respect to the websocket, not because it is faulty, but because it was still connecting when we try to send the first subscription. Further details in the below analysis.

Analysis

Using the debugger and conveniently chosen breakpoints, we can see that when the issue occurs, no subscription is received nor sent for the faulty telemetry entry, although the OpenMCT API calls the subscribe function from the last domain object provider installed by the RealtimeTelemetryPlugin. https://github.com/ami-iit/yarp-openmct/blob/aa499a6dd984ce8dec807a431fba07b22b32c748/openmctStaticServer/plugins/realtime-telemetry-plugin.js#L16-L22

Note

Initially, debugging with Webstorm, by attaching its debugger to the Chrome process where we load the page, mislead the analysis as we thought the subscribe function from the provider object was never called, and this due to a bad initialisation in TelemetryAPI.prototype.subscribe. The analysis below was then completed using the debugger from Chrome developer tools.

For identifying the issue, we need to understand how the subscription works from the OpenMCT TelemetryAPI subscribe method standpoint: https://github.com/ami-iit/openmct/blob/3e76cbb9aa2620a4660a03639ee0463cade3343f/src/api/telemetry/TelemetryAPI.js#L349-L386

`TelemetryAPI.prototype.subscribe` details: ``` TelemetryAPI.prototype.subscribe = function (domainObject, callback, options) { const provider = this.findSubscriptionProvider(domainObject); if (!this.subscribeCache) { this.subscribeCache = {}; } const keyString = objectUtils.makeKeyStringSkipIndex(domainObject.identifier); let subscriber = this.subscribeCache[keyString]; if (!subscriber) { subscriber = this.subscribeCache[keyString] = { callbacks: [callback] }; if (provider) { subscriber.unsubscribe = provider .subscribe(domainObject, function (value) { subscriber.callbacks.forEach(function (cb) { cb(value); }); }, options); } else { subscriber.unsubscribe = function () {}; } } else { subscriber.callbacks.push(callback); } return function unsubscribe() { subscriber.callbacks = subscriber.callbacks.filter(function (cb) { return cb !== callback; }); if (subscriber.callbacks.length === 0) { subscriber.unsubscribe(); delete this.subscribeCache[keyString]; } }.bind(this); }; ```

Expected behaviour

So what went wrong?…

As we enter the function TelemetryAPI.prototype.subscribe after a page refresh, subscribeCache is always undefined, and is then initialised to an empty list. We fall into the case where we’re adding the first callback to a given key, and thus provider.subscribe is called. Although socket.send is executed, no request is received on the server side and the plot canvas stays empty. https://github.com/ami-iit/yarp-openmct/blob/aa499a6dd984ce8dec807a431fba07b22b32c748/openmctStaticServer/plugins/realtime-telemetry-plugin.js#L22

I later noticed that socket.send(…) actually fails with the error…

{
    "stack": "Error: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\n    at Object.subscribe (http://192.168.1.96:8080/plugins/realtime-telemetry-plugin.js:22:24)\n    at TelemetryAPI.subscribe (webpack-internal:///./src/api/telemetry/TelemetryAPI.js:365:22)\n    at PlotSeries.fetch (webpack-internal:///./src/plugins/plot/configuration/PlotSeries.js:186:18)\n    at PlotSeries.load (webpack-internal:///./src/plugins/plot/configuration/PlotSeries.js:308:21)\n    at eval (webpack-internal:///./node_modules/vue-loader/lib/index.js?!./src/plugins/plot/MctPlot.vue?vue&type=script&lang=js&:384:28)\n    at Array.forEach (<anonymous>)\n    at SeriesCollection.forEach (webpack-internal:///./src/plugins/plot/configuration/Collection.js:59:21)\n    at VueComponent.loadMoreData (webpack-internal:///./node_modules/vue-loader/lib/index.js?!./src/plugins/plot/MctPlot.vue?vue&type=script&lang=js&:381:32)\n    at VueComponent.boundFn [as loadMoreData] (webpack-internal:///./node_modules/vue/dist/vue.js:192:14)\n    at VueComponent.updateDisplayBounds (webpack-internal:///./node_modules/vue-loader/lib/index.js?!./src/plugins/plot/MctPlot.vue?vue&type=script&lang=js&:489:22)"
}

This explains why the plot canvas stays empty after clicking on the page reload button.

Why clicking on other telemetry entry and then back to the initial one does not restore the plot…

When socket.send(…) fails, provider.subscribe does not return and neither does TelemetryAPI.prototype.subscribe. As a consequence:

If no breakpoint pauses the telemetry server…

In such case the websocket re-connection can be fast enough for avoiding the socket.send failure described above, and further subscriptions and unsubscriptions are sent as expected.

How the fix implemented in Yarp-OpenMCT goes around the problem

The breakpoint or normal processing delay occurring within the code section refreshing the ports, thus before the sending of the requested index.html, that pause or delay become irrelevant. The chances for the issue to occur are not null, depending processor load of the machine running the telemetry server.

A proper, robust fix would be to properly address any eventual failure of the socket.send method.

Proposed Fix

Since provider.subscribe implements the subscription request and the implementation details are unknown to the caller TelemetryAPI.prototype.subscribe, we should handle the failure (e.g. with a try/catch) the provider.subscribe. https://github.com/ami-iit/yarp-openmct/blob/c430ddc83104148522a691c55af20daa515cef1e/openmctStaticServer/plugins/realtime-telemetry-plugin.js#L20-L33

Recording obtained with the fix improvement (commit c430ddc) and after moving the sending of index.html before the ports refresh for reproducing the issue conditions.

https://user-images.githubusercontent.com/6848872/214274961-262abd1f-1038-4be7-a465-4ceee059f100.mp4

S-Dafarra commented 1 year ago

Awesome debugging @nunoguedelha!

nunoguedelha commented 1 year ago

Actually, the report is not complete, I'm still editing. It got more clear and the explanation consistent as I used the Chrome "developper tools" to debug the client code instead of Webstorm (Webstorm is more performant for Node.js code debugging).

nunoguedelha commented 1 year ago

Done.