ros2_foxglove_bridge.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <atomic>
4 #include <chrono>
5 #include <memory>
6 #include <regex>
7 #include <thread>
8 
9 #include <rclcpp/rclcpp.hpp>
10 #include <rosgraph_msgs/msg/clock.hpp>
11 #include <rosx_introspection/ros_parser.hpp>
12 #include <websocketpp/common/connection_hdl.hpp>
13 
18 #include <foxglove_bridge/param_utils.hpp>
23 
24 namespace foxglove_bridge {
25 
26 using ConnectionHandle = websocketpp::connection_hdl;
28 using Subscription = rclcpp::GenericSubscription::SharedPtr;
29 using SubscriptionsByClient = std::map<ConnectionHandle, Subscription, std::owner_less<>>;
30 using Publication = rclcpp::GenericPublisher::SharedPtr;
31 using ClientPublications = std::unordered_map<foxglove::ClientChannelId, Publication>;
32 using PublicationsByClient = std::map<ConnectionHandle, ClientPublications, std::owner_less<>>;
33 
34 class FoxgloveBridge : public rclcpp::Node {
35 public:
36  using TopicAndDatatype = std::pair<std::string, std::string>;
37 
38  FoxgloveBridge(const rclcpp::NodeOptions& options = rclcpp::NodeOptions());
39 
41 
42  void rosgraphPollThread();
43 
45  const std::map<std::string, std::vector<std::string>>& topicNamesAndTypes);
46 
48 
50  const std::map<std::string, std::vector<std::string>>& topicNamesAndTypes);
51 
52 private:
53  struct PairHash {
54  template <class T1, class T2>
55  std::size_t operator()(const std::pair<T1, T2>& pair) const {
56  return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
57  }
58  };
59 
60  std::unique_ptr<foxglove::ServerInterface<ConnectionHandle>> _server;
62  std::vector<std::regex> _topicWhitelistPatterns;
63  std::vector<std::regex> _serviceWhitelistPatterns;
64  std::vector<std::regex> _assetUriAllowlistPatterns;
65  std::vector<std::regex> _bestEffortQosTopicWhiteListPatterns;
66  std::shared_ptr<ParameterInterface> _paramInterface;
67  std::unordered_map<foxglove::ChannelId, foxglove::ChannelWithoutId> _advertisedTopics;
68  std::unordered_map<foxglove::ServiceId, foxglove::ServiceWithoutId> _advertisedServices;
69  std::unordered_map<foxglove::ChannelId, SubscriptionsByClient> _subscriptions;
71  std::unordered_map<foxglove::ServiceId, GenericClient::SharedPtr> _serviceClients;
72  rclcpp::CallbackGroup::SharedPtr _subscriptionCallbackGroup;
73  rclcpp::CallbackGroup::SharedPtr _clientPublishCallbackGroup;
74  rclcpp::CallbackGroup::SharedPtr _servicesCallbackGroup;
75  std::mutex _subscriptionsMutex;
77  std::mutex _servicesMutex;
78  std::unique_ptr<std::thread> _rosgraphPollThread;
81  std::shared_ptr<rclcpp::Subscription<rosgraph_msgs::msg::Clock>> _clockSubscription;
82  bool _useSimTime = false;
83  std::vector<std::string> _capabilities;
84  std::atomic<bool> _subscribeGraphUpdates = false;
85  bool _includeHidden = false;
86  bool _disableLoanMessage = true;
87  std::unique_ptr<foxglove::CallbackQueue> _fetchAssetQueue;
88  std::unordered_map<std::string, std::shared_ptr<RosMsgParser::Parser>> _jsonParsers;
89  std::atomic<bool> _shuttingDown = false;
90 
92 
93  void subscribe(foxglove::ChannelId channelId, ConnectionHandle clientHandle);
94 
95  void unsubscribe(foxglove::ChannelId channelId, ConnectionHandle clientHandle);
96 
97  void clientAdvertise(const foxglove::ClientAdvertisement& advertisement, ConnectionHandle hdl);
98 
100 
101  void clientMessage(const foxglove::ClientMessage& message, ConnectionHandle hdl);
102 
103  void setParameters(const std::vector<foxglove::Parameter>& parameters,
104  const std::optional<std::string>& requestId, ConnectionHandle hdl);
105 
106  void getParameters(const std::vector<std::string>& parameters,
107  const std::optional<std::string>& requestId, ConnectionHandle hdl);
108 
109  void subscribeParameters(const std::vector<std::string>& parameters,
111 
112  void parameterUpdates(const std::vector<foxglove::Parameter>& parameters);
113 
114  void logHandler(LogLevel level, char const* msg);
115 
116  void rosMessageHandler(const foxglove::ChannelId& channelId, ConnectionHandle clientHandle,
117  std::shared_ptr<const rclcpp::SerializedMessage> msg);
118 
119  void serviceRequest(const foxglove::ServiceRequest& request, ConnectionHandle clientHandle);
120 
121  void fetchAsset(const std::string& assetId, uint32_t requestId, ConnectionHandle clientHandle);
122 
123  bool hasCapability(const std::string& capability);
124 };
125 
126 } // namespace foxglove_bridge
foxglove_bridge::FoxgloveBridge::hasCapability
bool hasCapability(const std::string &capability)
Definition: ros1_foxglove_bridge_nodelet.cpp:928
foxglove_bridge::SubscriptionsByClient
std::map< ConnectionHandle, ros::Subscriber, std::owner_less<> > SubscriptionsByClient
Definition: ros1_foxglove_bridge_nodelet.cpp:55
foxglove_bridge::FoxgloveBridge::_advertisedTopics
std::unordered_map< foxglove::ChannelId, foxglove::ChannelWithoutId > _advertisedTopics
Definition: ros1_foxglove_bridge_nodelet.cpp:939
foxglove_bridge::FoxgloveBridge::_rosgraphPollThread
std::unique_ptr< std::thread > _rosgraphPollThread
Definition: ros2_foxglove_bridge.hpp:78
foxglove_bridge::ConnectionHandle
websocketpp::connection_hdl ConnectionHandle
Definition: ros1_foxglove_bridge_nodelet.cpp:53
foxglove_bridge::FoxgloveBridge::_assetUriAllowlistPatterns
std::vector< std::regex > _assetUriAllowlistPatterns
Definition: ros1_foxglove_bridge_nodelet.cpp:937
foxglove_bridge::FoxgloveBridge
Definition: ros1_foxglove_bridge_nodelet.cpp:60
utils.hpp
generic_client.hpp
foxglove_bridge::FoxgloveBridge::clientAdvertise
void clientAdvertise(const foxglove::ClientAdvertisement &channel, ConnectionHandle clientHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:304
foxglove_bridge::FoxgloveBridge::_advertisedServices
std::unordered_map< foxglove::ServiceId, foxglove::ServiceWithoutId > _advertisedServices
Definition: ros1_foxglove_bridge_nodelet.cpp:941
foxglove_bridge::FoxgloveBridge::_serviceWhitelistPatterns
std::vector< std::regex > _serviceWhitelistPatterns
Definition: ros1_foxglove_bridge_nodelet.cpp:936
foxglove_bridge::FoxgloveBridge::TopicAndDatatype
std::pair< std::string, std::string > TopicAndDatatype
Definition: ros2_foxglove_bridge.hpp:36
foxglove_bridge::FoxgloveBridge::_paramInterface
std::shared_ptr< ParameterInterface > _paramInterface
Definition: ros2_foxglove_bridge.hpp:66
foxglove_bridge::FoxgloveBridge::_fetchAssetQueue
std::unique_ptr< foxglove::CallbackQueue > _fetchAssetQueue
Definition: ros1_foxglove_bridge_nodelet.cpp:954
foxglove::ServiceResponse
Definition: common.hpp:130
foxglove_bridge::FoxgloveBridge::updateAdvertisedServices
void updateAdvertisedServices()
Definition: ros2_foxglove_bridge.cpp:290
foxglove_bridge::FoxgloveBridge::PairHash::operator()
std::size_t operator()(const std::pair< T1, T2 > &pair) const
Definition: ros2_foxglove_bridge.hpp:55
foxglove_bridge::FoxgloveBridge::FoxgloveBridge
FoxgloveBridge()=default
foxglove_bridge::Subscription
rclcpp::GenericSubscription::SharedPtr Subscription
Definition: ros2_foxglove_bridge.hpp:28
foxglove_bridge::FoxgloveBridge::_includeHidden
bool _includeHidden
Definition: ros2_foxglove_bridge.hpp:85
foxglove::ParameterSubscriptionOperation
ParameterSubscriptionOperation
Definition: parameter.hpp:11
foxglove_bridge::FoxgloveBridge::clientMessage
void clientMessage(const foxglove::ClientMessage &clientMsg, ConnectionHandle clientHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:392
foxglove_bridge::FoxgloveBridge::_subscribeGraphUpdates
std::atomic< bool > _subscribeGraphUpdates
Definition: ros1_foxglove_bridge_nodelet.cpp:953
foxglove_bridge::FoxgloveBridge::_subscriptions
std::unordered_map< foxglove::ChannelId, SubscriptionsByClient > _subscriptions
Definition: ros1_foxglove_bridge_nodelet.cpp:940
foxglove_bridge::FoxgloveBridge::_clientAdvertisementsMutex
std::mutex _clientAdvertisementsMutex
Definition: ros2_foxglove_bridge.hpp:76
regex_utils.hpp
foxglove_bridge::FoxgloveBridge::subscribe
void subscribe(foxglove::ChannelId channelId, ConnectionHandle clientHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:216
foxglove_bridge::FoxgloveBridge::_capabilities
std::vector< std::string > _capabilities
Definition: ros1_foxglove_bridge_nodelet.cpp:951
foxglove_bridge::FoxgloveBridge::~FoxgloveBridge
virtual ~FoxgloveBridge()
Definition: ros1_foxglove_bridge_nodelet.cpp:201
foxglove_bridge::FoxgloveBridge::rosgraphPollThread
void rosgraphPollThread()
Definition: ros2_foxglove_bridge.cpp:156
foxglove_bridge::FoxgloveBridge::_clientAdvertisedTopics
PublicationsByClient _clientAdvertisedTopics
Definition: ros1_foxglove_bridge_nodelet.cpp:942
foxglove_bridge::PublicationsByClient
std::map< ConnectionHandle, ClientPublications, std::owner_less<> > PublicationsByClient
Definition: ros1_foxglove_bridge_nodelet.cpp:57
foxglove::MessageDefinitionCache
Definition: message_definition_cache.hpp:53
foxglove_bridge::FoxgloveBridge::_disableLoanMessage
bool _disableLoanMessage
Definition: ros2_foxglove_bridge.hpp:86
foxglove_bridge::FoxgloveBridge::_shuttingDown
std::atomic< bool > _shuttingDown
Definition: ros2_foxglove_bridge.hpp:89
foxglove_bridge::FoxgloveBridge::_maxQosDepth
size_t _maxQosDepth
Definition: ros2_foxglove_bridge.hpp:80
parameter_interface.hpp
foxglove_bridge::FoxgloveBridge::_jsonParsers
std::unordered_map< std::string, std::shared_ptr< RosMsgParser::Parser > > _jsonParsers
Definition: ros2_foxglove_bridge.hpp:88
foxglove_bridge::FoxgloveBridge::fetchAsset
void fetchAsset(const std::string &uri, uint32_t requestId, ConnectionHandle clientHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:897
foxglove_bridge::FoxgloveBridge::_servicesCallbackGroup
rclcpp::CallbackGroup::SharedPtr _servicesCallbackGroup
Definition: ros2_foxglove_bridge.hpp:74
foxglove_bridge::DEFAULT_MIN_QOS_DEPTH
constexpr int64_t DEFAULT_MIN_QOS_DEPTH
Definition: ros2_foxglove_bridge/include/foxglove_bridge/param_utils.hpp:34
foxglove_bridge::FoxgloveBridge::unsubscribe
void unsubscribe(foxglove::ChannelId channelId, ConnectionHandle clientHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:266
foxglove_bridge::FoxgloveBridge::updateAdvertisedTopics
void updateAdvertisedTopics()
Definition: ros1_foxglove_bridge_nodelet.cpp:490
foxglove::WebSocketLogLevel
WebSocketLogLevel
Definition: common.hpp:43
foxglove_bridge::FoxgloveBridge::getParameters
void getParameters(const std::vector< std::string > &parameters, const std::optional< std::string > &requestId, ConnectionHandle hdl)
Definition: ros1_foxglove_bridge_nodelet.cpp:651
foxglove_bridge::FoxgloveBridge::parameterUpdates
void parameterUpdates(XmlRpc::XmlRpcValue &params, XmlRpc::XmlRpcValue &result)
Definition: ros1_foxglove_bridge_nodelet.cpp:800
foxglove_bridge::FoxgloveBridge::subscribeParameters
void subscribeParameters(const std::vector< std::string > &parameters, foxglove::ParameterSubscriptionOperation op, ConnectionHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:770
foxglove_bridge::FoxgloveBridge::setParameters
void setParameters(const std::vector< foxglove::Parameter > &parameters, const std::optional< std::string > &requestId, ConnectionHandle hdl)
Definition: ros1_foxglove_bridge_nodelet.cpp:722
message_definition_cache.hpp
foxglove_bridge
Definition: generic_service.hpp:9
server_factory.hpp
foxglove_bridge::DEFAULT_MAX_QOS_DEPTH
constexpr int64_t DEFAULT_MAX_QOS_DEPTH
Definition: ros2_foxglove_bridge/include/foxglove_bridge/param_utils.hpp:35
foxglove::ClientAdvertisement
Definition: common.hpp:77
foxglove_bridge::FoxgloveBridge::_servicesMutex
std::mutex _servicesMutex
Definition: ros2_foxglove_bridge.hpp:77
foxglove_bridge::FoxgloveBridge::_minQosDepth
size_t _minQosDepth
Definition: ros2_foxglove_bridge.hpp:79
foxglove::ClientMessage
Definition: common.hpp:85
foxglove_bridge::Publication
rclcpp::GenericPublisher::SharedPtr Publication
Definition: ros2_foxglove_bridge.hpp:30
foxglove_bridge::FoxgloveBridge::subscribeConnectionGraph
void subscribeConnectionGraph(bool subscribe)
Definition: ros2_foxglove_bridge.cpp:429
foxglove_bridge::FoxgloveBridge::_bestEffortQosTopicWhiteListPatterns
std::vector< std::regex > _bestEffortQosTopicWhiteListPatterns
Definition: ros2_foxglove_bridge.hpp:65
foxglove_bridge::FoxgloveBridge::serviceRequest
void serviceRequest(const foxglove::ServiceRequest &request, ConnectionHandle clientHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:852
foxglove_bridge::FoxgloveBridge::_clientPublishCallbackGroup
rclcpp::CallbackGroup::SharedPtr _clientPublishCallbackGroup
Definition: ros2_foxglove_bridge.hpp:73
foxglove_bridge::FoxgloveBridge::PairHash
Definition: ros1_foxglove_bridge_nodelet.cpp:209
foxglove_bridge::FoxgloveBridge::_subscriptionCallbackGroup
rclcpp::CallbackGroup::SharedPtr _subscriptionCallbackGroup
Definition: ros2_foxglove_bridge.hpp:72
foxglove_bridge::FoxgloveBridge::logHandler
void logHandler(foxglove::WebSocketLogLevel level, char const *msg)
Definition: ros1_foxglove_bridge_nodelet.cpp:824
foxglove_bridge::FoxgloveBridge::updateConnectionGraph
void updateConnectionGraph(const std::map< std::string, std::vector< std::string >> &topicNamesAndTypes)
Definition: ros2_foxglove_bridge.cpp:386
foxglove_bridge::FoxgloveBridge::_clockSubscription
std::shared_ptr< rclcpp::Subscription< rosgraph_msgs::msg::Clock > > _clockSubscription
Definition: ros2_foxglove_bridge.hpp:81
foxglove_bridge::FoxgloveBridge::_subscriptionsMutex
std::mutex _subscriptionsMutex
Definition: ros1_foxglove_bridge_nodelet.cpp:943
foxglove_bridge.hpp
foxglove_bridge::FoxgloveBridge::_topicWhitelistPatterns
std::vector< std::regex > _topicWhitelistPatterns
Definition: ros1_foxglove_bridge_nodelet.cpp:934
callback_queue.hpp
foxglove_bridge::FoxgloveBridge::rosMessageHandler
void rosMessageHandler(const foxglove::ChannelId channelId, ConnectionHandle clientHandle, const ros::MessageEvent< ros_babel_fish::BabelFishMessage const > &msgEvent)
Definition: ros1_foxglove_bridge_nodelet.cpp:844
foxglove::ChannelId
uint32_t ChannelId
Definition: common.hpp:26
foxglove_bridge::ClientPublications
std::unordered_map< foxglove::ClientChannelId, ros::Publisher > ClientPublications
Definition: ros1_foxglove_bridge_nodelet.cpp:56
foxglove_bridge::FoxgloveBridge::clientUnadvertise
void clientUnadvertise(foxglove::ClientChannelId channelId, ConnectionHandle clientHandle)
Definition: ros1_foxglove_bridge_nodelet.cpp:359
foxglove_bridge::FoxgloveBridge::_useSimTime
bool _useSimTime
Definition: ros1_foxglove_bridge_nodelet.cpp:950
foxglove_bridge::FoxgloveBridge::_server
std::unique_ptr< foxglove::ServerInterface< ConnectionHandle > > _server
Definition: ros1_foxglove_bridge_nodelet.cpp:932
foxglove_bridge::FoxgloveBridge::_serviceClients
std::unordered_map< foxglove::ServiceId, GenericClient::SharedPtr > _serviceClients
Definition: ros2_foxglove_bridge.hpp:71
foxglove_bridge::FoxgloveBridge::_messageDefinitionCache
foxglove::MessageDefinitionCache _messageDefinitionCache
Definition: ros2_foxglove_bridge.hpp:61


foxglove_bridge
Author(s): Foxglove
autogenerated on Tue May 20 2025 02:34:26