public void RegService <ArgDataType, ArgBridgeType, ResDataType, ResBridgeType>(IBridgePlugin plugin, Func <ArgBridgeType, ArgDataType> argConverter, Func <ResDataType, ResBridgeType> resConverter)
 {
     plugin.AddServiceCreator <ArgDataType, ResDataType>(
         (instance, topic, service) =>
     {
         // this callback is called every time sensor registers service on different topic
         (instance as RosBridgeInstance).AddService <ArgBridgeType>(topic,
                                                                    (rawArg, resultCb) =>
         {
             // this callback is called every time websocket receives message from rosbridge
             var arg     = RosSerialization.Unserialize <ArgBridgeType>(rawArg);
             var argData = argConverter(arg);
             service(argData, resData =>
             {
                 // this callback is called from sensor service callback to return result data back to rosbridge
                 var res = resConverter(resData);
                 resultCb(res);
             });
         }
                                                                    );
     }
         );
 }
 public void RegSubscriber <DataType, BridgeType>(IBridgePlugin plugin, Func <BridgeType, DataType> converter)
 {
     plugin.AddType <DataType>(RosUtils.GetMessageType <BridgeType>());
     plugin.AddSubscriberCreator <DataType>(
         (instance, topic, callback) => (instance as RosBridgeInstance).AddSubscriber <BridgeType>(topic,
                                                                                                   rawData => callback(converter(RosSerialization.Unserialize <BridgeType>(rawData)))
                                                                                                   )
         );
 }