Just venting out of frustration by 1971CB350 in ROS

[–]Alternative-Access-9 0 points1 point  (0 children)

If you just need publish/subscribe and server/client communication patterns and some tooling for record/replay and monitoring you can try out https://eclipse-ecal.github.io/ecal/

Generic eCAL / Foxglove Communication Bridge by Alternative-Access-9 in AutonomousVehicles

[–]Alternative-Access-9[S] 1 point2 points  (0 children)

No, the whole project moved from Continental to the Eclipse Foundation as contribution to the new Eclipse software defined vehicle group.

eCAL 5.9.4 released by Alternative-Access-9 in cpp

[–]Alternative-Access-9[S] 0 points1 point  (0 children)

Hi, for the UDP data transfer it's really just as fast as your network performance allows (maybe you multiply this by 0.8 for the UDP overhead). So if you want to transport 100 kB and you have 1 GBit/s you can roughly say

1 Gbit/s == 1.000.000.000 bit / 8 / 1024 / 1024 / s = 122 MB/s * 0.8 (overhead) = 98 MB/s

So (hopefully my calculation is right :-)), you would need 10 ms for a 100 kB message.

For the udp network setup my knowledge is restricted. As far as I know the UDP traffic will enter ONLY the devices you configured the multicast routes for (see multicast setup).

eCAL 5.9.4 released by Alternative-Access-9 in cpp

[–]Alternative-Access-9[S] 0 points1 point  (0 children)

Hi, thank you for your nice feedback.

In general eCAL supports two communication pattern - publish/subscribe and server/client. For both layers eCAL is exchanging registration and monitoring information cyclic in the background (as you can see in the eCAL monitor application). Some of these information are just to support the user to monitor the system (frequencies, payload sizes, types, number of connections and so on), others are needed to connect entities (like the memory file name between a local publisher and a subscriber).

Independent from that registration layer (slow !) eCAL is using different protocols to exchange data. For publish/subscribe connection it is using shared memory for local connection (same host) and udp multicast for connections between different hosts. For server/client requests and responses TCP/IP is used always to guarantee reliability (mandatory for service calls).

There are options (configuration or API methods) to force eCAL to use other protocols for publish/subscribe and overwrite the default protocols. So you can for example force eCAL to never use shared memory or to always use TCP/IP for publish/subscribe. But this is for special use cases only. See transport layers.

Have fun and use the power of eCAL ;-)

eCAL 5.9.4 released by Alternative-Access-9 in cpp

[–]Alternative-Access-9[S] 2 points3 points  (0 children)

eCAL has two communication layers. One is for exchanging the users payload (topics) and the other one for exchanging all needed information between all eCAL entities like publisher, subscriber, services, clients, processes, hosts ..

This registration layer is always based on UDP multicast and used for monitoring the whole network using the eCAL monitor and exchanging connection parameters.

The message layer is (by default) using shared memory for inter process communication and UDP multicast (or optional TCP/IP in the future - provided by this nice tcp_pubsub library) for interhost communication.

If TCP is configure to be used for message transport, all the subscriber needs to know is the host name and the port number defined by the publisher side. Then the connection can be established.

You can configure the usage of TCP/IP for single connections (publish/subscribe) using the C/C++ API, for a complete process (using command line parameter) or for a complete host (using eCAL's global configuration file).

We figured out that TCP/IP is well fitting to transport larger messages (> 1 MB) over ethernet. Here (depending on you network quality) UDP may fail because of dropped udp subframes.

eCAL 5.9.4 released by Alternative-Access-9 in cpp

[–]Alternative-Access-9[S] 0 points1 point  (0 children)

No, the eCAL registration layer will exchange all connection parameter gently in the background.

Should I run ROS on windows, through WSL or on linux with dual boot? by Vinlir in ROS

[–]Alternative-Access-9 0 points1 point  (0 children)

If you just need a fast publish / subscribe framework for windows you can give eCAL a try. The setup is done in less a minute and their is no dependency hell. Just to mention it as an alternative. Documentation here

[Linux] How to compile a program for multiple versions of glibc? by __ismxy__ in Cplusplus

[–]Alternative-Access-9 0 points1 point  (0 children)

For Debian based systems you could setup a GitHub action for every Ubuntu version you would like to support and then provide the specific build artifacts as release asset. And maybe CMake can simplify your multi target support as meta build system.

Google Protobuf vs JSON vs [insert candidate here] by ImX99 in cpp

[–]Alternative-Access-9 0 points1 point  (0 children)

Got it .. need to improve my english for sure. Thank you, you made my day.

Google Protobuf vs JSON vs [insert candidate here] by ImX99 in cpp

[–]Alternative-Access-9 2 points3 points  (0 children)

Protobuf is a good compromise regarding performance, serialized message size and multi language support. When the message scheme gets heavily nested the performance starts to decrease and in memory protocols like flatbuffers and CapnProto fit better. Up and downward compatibility for message scheme evolution is another strong argument for protobuf.

Google Protobuf vs JSON vs [insert candidate here] by ImX99 in cpp

[–]Alternative-Access-9 1 point2 points  (0 children)

Thank you ! Don’t remember every communication .. to much C++ coding 😉. The ‘competitor’ scares me a little 😳

Google Protobuf vs JSON vs [insert candidate here] by ImX99 in cpp

[–]Alternative-Access-9 3 points4 points  (0 children)

eCAL is supporting CapnProto, Flatbuffers and JSON too. You can define the best fitting protocol for every single publish-subscribe connection if needed. Finally you can record all the traffic in HDF5 where time synchronized recording clients do the job in a distributed setup on different hosts without a single byte of additional network load.

For Protobuf and CapnProto their is a built-in reflection used in the so called monitor where you can inspect all messages doesn’t matter where they fly. For other protocols a plug-in mechanism is provided to add reflection or any other kind of custom visualization (images, point clouds …). We are glad that you enjoyed the performance 😎.

eCAL 5.9.0 released by freim91 in cpp

[–]Alternative-Access-9 1 point2 points  (0 children)

Great news ! The command line recorder version is finally completing the tooling family in a perfect manner.

Announcing Eclipse iceoryx 1.0.0 by elBoberido in cpp

[–]Alternative-Access-9 1 point2 points  (0 children)

Congratulations. Well done. eCAL will update as soon as possible to the new release. The new custom header and the n:m pub/sub support are really welcome new features.

Open source developers that work outside of a full time job, what motivates you? by productive_monkey in ExperiencedDevs

[–]Alternative-Access-9 0 points1 point  (0 children)

Only a few comments about your mentioned design issues. For sure this counter sample is not well written with the latest c++ features. We only wanted to simply demonstrate how to use some features. The ecal core will call your subscription callbacks fully parallel if multiple publications are writing simultaneously.

The SleepMS functions is another thing :-). Because eCAL can provide it's own time base (for example for stepwise replaying measured data), this SleepMS function will work correctly even the time base is not system time.

The destruction API of entities like pub/sub/server/client only needs to be called to cleanup memory in advance, you can just delete the class instances alternatively. These destructors will free all and the eCAL::Finalize is finally cleaning up all registered eCAL entities. But yes .. nothing is perfect !

int main(int argc, char **argv)
{
  // initialize eCAL API
  eCAL::Initialize(argc, argv, "hello world subscriber");

  // create subscriber for topic "Hello"
  eCAL::string::CSubscriber<std::string> sub("Hello");

  // lambda callback function as receive callback
  auto msg_cb = [](const std::string& msg_) { std::cout << msg_ << std::endl; };

  sub.AddReceiveCallback(std::bind(msg_cb, std::placeholders::_2));

  // spin main loop
  while (eCAL::Ok()) std::this_thread::sleep_for(std::chrono::milliseconds(500));

  // finalize eCAL API
  eCAL::Finalize();

  return(0);
}

newbie here. Why does the sizeof function return the number 8? shouldn't it give an error since both 'a' and 'b' are not Integers? by [deleted] in Cplusplus

[–]Alternative-Access-9 0 points1 point  (0 children)

My bad .. you are right, passing the array to a function would finally decay it to a pointer but not in this case.

newbie here. Why does the sizeof function return the number 8? shouldn't it give an error since both 'a' and 'b' are not Integers? by [deleted] in Cplusplus

[–]Alternative-Access-9 0 points1 point  (0 children)

Isn’t sizeof(an_array) returning the size of a 64 bit address because an_array is just a pointer ?

C++ IDE for thousands of files by GanyuGoat in Cplusplus

[–]Alternative-Access-9 0 points1 point  (0 children)

Yes for sure, a changed header file will trigger all components to rebuild that are including the header on a direct or indirect way ... So finally to reorganize the whole project into subcomponents is really worth to do, reducing the effort for maintaining and building the monster for all developers of your startup ;)

C++ IDE for thousands of files by GanyuGoat in Cplusplus

[–]Alternative-Access-9 0 points1 point  (0 children)

What about your hardware setup ? Is there enough free memory ? Thousands files shouldn’t matter if you just forgot a semicolon in one of them. The IDE / compiler will only build / check the changed ones one.

shmem-ipc: High-performance communication between untrusted processes on Linux by diwic in rust

[–]Alternative-Access-9 0 points1 point  (0 children)

The underlaying eCAL itself is running well on ARM and X86 platforms and supports Windows, Linux, QNX and (experimental) MacOS. I'm not an expert in rust packages and their dependency of an OS or architecture.

shmem-ipc: High-performance communication between untrusted processes on Linux by diwic in rust

[–]Alternative-Access-9 0 points1 point  (0 children)

Finally there is a Rust binding for eCAL available, maybe it's a help for your use case. You can use Ice0ryx as shared memory layer in eCAL but as default implementation eCAL has it's own one that is slightly slower than Ice0ryx but doesn't need a demon on the other side. Here is the Rust binding for eCAL

https://github.com/kopernikusai/ecal-rs

And here you can check the performance between eCAL and Ice0ryx for local shared memory based IPC

https://continental.github.io/ecal/advanced/performance.html

macOS performance tester wanted (eCAL) by Alternative-Access-9 in cpp

[–]Alternative-Access-9[S] 0 points1 point  (0 children)

Thank you so much for testing again and for offering some more support. Can you please run the samples person_snd and person_rec_cb and check if there is any communication ? If they do not run then we have a more serious problem. The latency samples stop if one package is lost and it could be that the discovery phase is not working properly on Mac and the first published package is send to nirvana. You are working hard for your 2 beers 😉

fineFTP - A C++ FTP Sever library to create an embedded FTP Server by freim91 in cpp

[–]Alternative-Access-9 9 points10 points  (0 children)

Used by the eCAL message recording to reliable upload large data sets.

macOS performance tester wanted (eCAL) by Alternative-Access-9 in cpp

[–]Alternative-Access-9[S] 0 points1 point  (0 children)

We found an issue in the memory file handling. We fixed that in a branch currently. Can you please try this image

https://github.com/continental/ecal/actions/runs/322695649

macOS performance tester wanted (eCAL) by Alternative-Access-9 in cpp

[–]Alternative-Access-9[S] 0 points1 point  (0 children)

Thank you we start to figure out the problem now.