Jump to content
OpenSplice DDS Forum


  • Content count

  • Joined

  • Last visited

About Pepijn

  • Rank

Profile Information

  • Company
    University of Twente
  1. Pepijn

    Video streaming over WiFi

    I'm trying to stream video using RTP over DDS connected via WiFi. This works great for a single subscriber, but breaks when two people try to watch the stream. When there are multiple subscribers, OpenSplice switches to multicast. As explained on wikipedia, mulitcast over WiFi causes more packet loss and a lower datarate. What would be the best way to allow multiple subscribers to work properly? I tried to set AllowMulticast to false, but this caused the entire node to not be discoverable. I assume this is because it uses multicast for discovery? I have not yet found how to disable it for data only. [edit] AllowMulticast changed from a boolean to a list of values, setting it to spdp allows sending data as unicast. The question that remains is if multicast can be used effectively over WiFi I also tried to connect the subscribers over wired LAN, hoping that there would be less conflicts in the multicast traffic. But even though IGMP snooping is enabled, the video is still broadcast over WiFi. I assume because the publisher is subscribed to the multicast group that it writes to. Is there a way to set up multicast such that traffic is not re-broabcast on the WiFi interface?
  2. I'm writing a desktop application that controls and monitors a DDS network (so I don't think standalone/single-proccess applies), and currently before starting the executable, you have to source the DDS environment. If you just click the executable, it crashes. I tried moving the shared libraries into the application, but then it still fails to start a domain participant. Is there a way to bundle OpenSplice with the executable, so that users can just click the app, rather than running commands in a terminal?
  3. I solved it in the end. It turns out that a DLL needs all its dependencies linked, while a SO is happy to find them at runtime. So after adding the DDS libraries as a dependency to the DLL in cmake, it worked. Well, kinda, you also need to export all the symbols.
  4. I have a CMake project that generates a shared library based on a IDL file. On linux this works great, and installs a .so file in /usr/local. But now I'm trying to compile the same project on Windows. I have downloaded DDS Community Edition Version 6.x for Windows (64-bit) Host and Target, Visual Studio 2015, x64 chipset, and have installed Visual Studio 2015. CMake successfully generates an Visual Studio Solution file, but when I open this file in Visual Studio 2015 and build it, I get the following errors: Severity Code Description Project File Line Suppression State Error LNK1120 3 unresolved externals Operator C:\Users\rove\Documents\GitHub\rove_msgs\build\Debug\Operator.dll 1 Error LNK2019 unresolved external symbol __imp__c_stringNew_s referenced in function "unsigned char __cdecl __Operator_Control__copyIn(struct c_base_s *,class Operator::Control const *,struct _Operator_Control *)" (?__Operator_Control__copyIn@@YAEPAUc_base_s@@PBVControl@Operator@@PAU_Operator_Control@@@Z) Operator C:\Users\rove\Documents\GitHub\rove_msgs\build\OperatorSplDcps.obj 1 Error LNK2019 unresolved external symbol "__declspec(dllimport) unsigned char __cdecl __DDS_Time_t__copyIn(struct c_base_s *,class dds::core::Time const *,struct _DDS_Time_t *)" (__imp_?__DDS_Time_t__copyIn@@YAEPAUc_base_s@@PBVTime@core@dds@@PAU_DDS_Time_t@@@Z) referenced in function "unsigned char __cdecl __Operator_Control__copyIn(struct c_base_s *,class Operator::Control const *,struct _Operator_Control *)" (?__Operator_Control__copyIn@@YAEPAUc_base_s@@PBVControl@Operator@@PAU_Operator_Control@@@Z) Operator C:\Users\rove\Documents\GitHub\rove_msgs\build\OperatorSplDcps.obj 1 Error LNK2019 unresolved external symbol "__declspec(dllimport) void __cdecl __DDS_Time_t__copyOut(void const *,void *)" (__imp_?__DDS_Time_t__copyOut@@YAXPBXPAX@Z) referenced in function "void __cdecl __Operator_Control__copyOut(void const *,void *)" (?__Operator_Control__copyOut@@YAXPBXPAX@Z) Operator C:\Users\rove\Documents\GitHub\rove_msgs\build\OperatorSplDcps.obj 1 I have also tried to run it in a shell with the env activated, with the same result. >C:\dds\HDE\x86_64.win64\release.bat >devenv /build Release RoVe.sln I even tried rebuilding using these instructions. So now I'm out of ideas.
  5. Pepijn

    Crash in take() in on_data_available()

    To my future self, and others seeing really weird errors: Make sure all your code is compiled with the same compiler. For some reason the Raspi binaries are compiled with GCC 4.9, and if you compile anything with anything else, you will suffer. On a related note, you may need to recompile stuff for C++11 to work.
  6. My program crashes with the following backtrace. The error seems to happen deep inside the take() method. I can try to make a smaller reproducible test case if needed, but I'm just not really sure what's going on. It seems to be trying to free a string property on the message. Why is it trying to free something, when this is the first message that comes in? Does it think there is a previous message that it needs to free? *** Error in `/home/pi/rove_ws/control/EyeDriveRPI': free(): invalid pointer: 0x76ca56ec *** Thread 29 "ListenerDispatc" received signal SIGABRT, Aborted. [Switching to Thread 0x75743450 (LWP 17120)] __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51 51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory. (gdb) bt #0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51 #1 0x7699f824 in __GI_abort () at abort.c:89 #2 0x769d8f78 in __libc_message (do_abort=do_abort@entry=2, fmt=<optimized out>) at ../sysdeps/posix/libc_fatal.c:175 #3 0x769dfad4 in malloc_printerr (action=<optimized out>, str=0x76a92040 "free(): invalid pointer", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5049 #4 0x769e0514 in _int_free (av=0x76aae794 <main_arena>, p=0x76ca56e4 <std::string::_Rep::_S_empty_rep_storage+4>, have_lock=<optimized out>) at malloc.c:3905 #5 0x76c638b0 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 #6 0x76c63ba4 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 #7 0x76ca9c58 in Operator::Control::id(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) () from /usr/local/lib/libOperator.so #8 0x76ca97c4 in __Operator_Control__copyOut(void const*, void*) () from /usr/local/lib/libOperator.so #9 0x76f59a84 in org::opensplice::sub::AnyDataReaderDelegate::flush_action(void*, cmn_sampleInfo_s*, void*) () from /usr/local/include/HDE/armv7l.linux/lib/libdcpsisocpp2.so #10 0x76e144cc in cmn_samplesList_flush () from /usr/local/include/HDE/armv7l.linux/lib/libddskernel.so #11 0x76f58078 in org::opensplice::sub::AnyDataReaderDelegate::take(u_dataReader_s*, dds::sub::status::DataState const&, dds::sub::detail::SamplesHolder&, unsigned int) () from /usr/local/include/HDE/armv7l.linux/lib/libdcpsisocpp2.so #12 0x0001d96c in dds::sub::detail::DataReader<Operator::Control>::take (this=<optimized out>, this=<optimized out>) at /usr/local/include/HDE/armv7l.linux/include/dcps/C++/isocpp2/dds/sub/detail/TDataReaderImpl.hpp:686 #13 dds::sub::DataReader<Operator::Control, dds::sub::detail::DataReader>::take (this=<optimized out>) at /usr/local/include/HDE/armv7l.linux/include/dcps/C++/isocpp2/dds/sub/detail/TDataReaderImpl.hpp:423 #14 0x0001dadc in RobotControlReaderListener::on_data_available (this=0x7efff2ec, dr=...) at /usr/local/include/RobotControlReaderListener.hpp:14 #15 0x0001f6e0 in dds::sub::detail::DataReader<Operator::Control>::listener_notify (this=<optimized out>, source=..., triggerMask=4096, eventData=0x764018a8, l=0x7efff2ec) at /usr/local/include/HDE/armv7l.linux/include/dcps/C++/isocpp2/dds/sub/detail/TDataReaderImpl.hpp:853 #16 0x76f24b2c in org::opensplice::core::EntityDelegate::listener_entity_notify(std::shared_ptr<org::opensplice::core::ObjectDelegate>, unsigned int, void*) () from /usr/local/include/HDE/armv7l.linux/lib/libdcpsisocpp2.so #17 0x76f22b28 in org::opensplice::core::ListenerDispatcher::eventHandler(v_listenerEvent_s*) () from /usr/local/include/HDE/armv7l.linux/lib/libdcpsisocpp2.so #18 0x76f23030 in org::opensplice::core::ListenerDispatcher::processEvents() () from /usr/local/include/HDE/armv7l.linux/lib/libdcpsisocpp2.so #19 0x76f23114 in org::opensplice::core::ListenerDispatcher::thread() () from /usr/local/include/HDE/armv7l.linux/lib/libdcpsisocpp2.so #20 0x76f23160 in org::opensplice::core::ListenerDispatcher::threadWrapper(void*) () from /usr/local/include/HDE/armv7l.linux/lib/libdcpsisocpp2.so #21 0x76d30440 in os_startRoutineWrapper () from /usr/local/include/HDE/armv7l.linux/lib/libddskernel.so #22 0x76cc1fc4 in start_thread (arg=0x75743450) at pthread_create.c:335 #23 0x76a43bc8 in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:76 from /lib/arm-linux-gnueabihf/libc.so.6 Backtrace stopped: previous frame identical to this frame (corrupt stack?)