base_realsense_node.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. // Copyright 2023 RealSense, Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #pragma once
  15. #include <librealsense2/rs.hpp>
  16. #include <librealsense2/rsutil.h>
  17. #include "constants.h"
  18. // cv_bridge.h last supported version is humble
  19. #if defined(CV_BRDIGE_HAS_HPP)
  20. #include <cv_bridge/cv_bridge.hpp>
  21. #else
  22. #include <cv_bridge/cv_bridge.h>
  23. #endif
  24. #include <diagnostic_updater/diagnostic_updater.hpp>
  25. #include <diagnostic_updater/publisher.hpp>
  26. #include <std_srvs/srv/empty.hpp>
  27. #include "realsense2_camera_msgs/msg/imu_info.hpp"
  28. #include "realsense2_camera_msgs/msg/extrinsics.hpp"
  29. #include "realsense2_camera_msgs/msg/metadata.hpp"
  30. #include "realsense2_camera_msgs/msg/rgbd.hpp"
  31. #include "realsense2_camera_msgs/srv/device_info.hpp"
  32. #include "realsense2_camera_msgs/srv/calib_config_read.hpp"
  33. #include "realsense2_camera_msgs/srv/calib_config_write.hpp"
  34. #include "realsense2_camera_msgs/srv/application_config_read.hpp"
  35. #include "realsense2_camera_msgs/srv/application_config_write.hpp"
  36. #include "realsense2_camera_msgs/srv/hardware_monitor_command_send.hpp"
  37. #include "rclcpp_action/rclcpp_action.hpp"
  38. #include "realsense2_camera_msgs/action/triggered_calibration.hpp"
  39. #include <librealsense2/hpp/rs_processing.hpp>
  40. #include <librealsense2/rs_advanced_mode.hpp>
  41. #include <sensor_msgs/image_encodings.hpp>
  42. #include <sensor_msgs/msg/camera_info.hpp>
  43. #include <sensor_msgs/msg/image.hpp>
  44. #include <sensor_msgs/msg/imu.hpp>
  45. #include <nav_msgs/msg/grid_cells.hpp>
  46. #if defined(HUMBLE) || defined(IRON) || defined(JAZZY)
  47. #include <tf2/LinearMath/Quaternion.h>
  48. #else
  49. #include <tf2/LinearMath/Quaternion.hpp>
  50. #endif
  51. #include <tf2_ros/transform_broadcaster.h>
  52. #include <tf2_ros/static_transform_broadcaster.h>
  53. #include <eigen3/Eigen/Geometry>
  54. #include <condition_variable>
  55. #include <ros_sensor.h>
  56. #include <named_filter.h>
  57. #if defined (ACCELERATE_GPU_WITH_GLSL)
  58. #include <gl_window.h>
  59. #endif
  60. #include <queue>
  61. #include <mutex>
  62. #include <atomic>
  63. #include <thread>
  64. //Safety Camera
  65. #include "realsense2_camera_msgs/srv/safety_preset_read.hpp"
  66. #include "realsense2_camera_msgs/srv/safety_preset_write.hpp"
  67. #include "realsense2_camera_msgs/srv/safety_interface_config_read.hpp"
  68. #include "realsense2_camera_msgs/srv/safety_interface_config_write.hpp"
  69. using realsense2_camera_msgs::msg::Extrinsics;
  70. using realsense2_camera_msgs::msg::IMUInfo;
  71. using realsense2_camera_msgs::msg::RGBD;
  72. #define BASE_FRAME_ID (static_cast<std::ostringstream&&>(std::ostringstream() << _tf_prefix << _base_frame_id)).str()
  73. #define FRAME_ID(sip) (static_cast<std::ostringstream&&>(std::ostringstream() << _tf_prefix << _camera_name << "_" << STREAM_NAME(sip) << "_frame")).str()
  74. #define IMU_FRAME_ID (static_cast<std::ostringstream&&>(std::ostringstream() << _tf_prefix << _camera_name << "_imu_frame")).str()
  75. #define IMU_OPTICAL_FRAME_ID (static_cast<std::ostringstream&&>(std::ostringstream() << _tf_prefix << _camera_name << "_imu_optical_frame")).str()
  76. #define OPTICAL_FRAME_ID(sip) (static_cast<std::ostringstream&&>(std::ostringstream() << _tf_prefix << _camera_name << "_" << STREAM_NAME(sip) << "_optical_frame")).str()
  77. #define ALIGNED_DEPTH_TO_FRAME_ID(sip) (static_cast<std::ostringstream&&>(std::ostringstream() << _tf_prefix << _camera_name << "_" << "aligned_depth_to_" << STREAM_NAME(sip) << "_frame")).str()
  78. namespace realsense2_camera
  79. {
  80. typedef std::pair<rs2_stream, int> stream_index_pair;
  81. class image_publisher; // forward declaration
  82. class PipelineSyncer : public rs2::asynchronous_syncer
  83. {
  84. public:
  85. void operator()(rs2::frame f) const
  86. {
  87. invoke(std::move(f));
  88. }
  89. };
  90. class SyncedImuPublisher
  91. {
  92. public:
  93. SyncedImuPublisher(rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr imu_publisher,
  94. std::size_t waiting_list_size=1000);
  95. ~SyncedImuPublisher();
  96. void Pause(); // Pause sending messages. All messages from now on are saved in queue.
  97. void Resume(); // Send all pending messages and allow sending future messages.
  98. void Publish(sensor_msgs::msg::Imu msg); //either send or hold message.
  99. size_t getNumSubscribers();
  100. void Enable(bool is_enabled) {_is_enabled=is_enabled;};
  101. private:
  102. void PublishPendingMessages();
  103. private:
  104. std::mutex _mutex;
  105. rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr _publisher;
  106. bool _pause_mode;
  107. std::queue<sensor_msgs::msg::Imu> _pending_messages;
  108. std::size_t _waiting_list_size;
  109. bool _is_enabled;
  110. };
  111. class AlignDepthFilter;
  112. class PointcloudFilter;
  113. class BaseRealSenseNode
  114. {
  115. public:
  116. BaseRealSenseNode(RosNodeBase& node,
  117. rs2::device dev,
  118. std::shared_ptr<Parameters> parameters,
  119. bool use_intra_process = false);
  120. ~BaseRealSenseNode();
  121. void publishTopics();
  122. public:
  123. using TriggeredCalibration = realsense2_camera_msgs::action::TriggeredCalibration;
  124. using GoalHandleTriggeredCalibration = rclcpp_action::ServerGoalHandle<TriggeredCalibration>;
  125. enum class imu_sync_method{NONE, COPY, LINEAR_INTERPOLATION};
  126. protected:
  127. class float3
  128. {
  129. public:
  130. float x, y, z;
  131. public:
  132. float3& operator*=(const float& factor)
  133. {
  134. x*=factor;
  135. y*=factor;
  136. z*=factor;
  137. return (*this);
  138. }
  139. float3& operator+=(const float3& other)
  140. {
  141. x+=other.x;
  142. y+=other.y;
  143. z+=other.z;
  144. return (*this);
  145. }
  146. };
  147. std::string _base_frame_id;
  148. bool _is_running;
  149. RosNodeBase& _node;
  150. std::string _camera_name;
  151. std::vector<rs2_option> _monitor_options;
  152. rclcpp::Logger _logger;
  153. rclcpp::Service<std_srvs::srv::Empty>::SharedPtr _reset_srv;
  154. rclcpp::Service<realsense2_camera_msgs::srv::DeviceInfo>::SharedPtr _device_info_srv;
  155. rclcpp::Service<realsense2_camera_msgs::srv::CalibConfigRead>::SharedPtr _calib_config_read_srv;
  156. rclcpp::Service<realsense2_camera_msgs::srv::CalibConfigWrite>::SharedPtr _calib_config_write_srv;
  157. rclcpp_action::Server<TriggeredCalibration>::SharedPtr _triggered_calibration_action_server;
  158. std::shared_ptr<Parameters> _parameters;
  159. std::list<std::string> _parameters_names;
  160. void restartStaticTransformBroadcaster();
  161. void publishExtrinsicsTopic(const stream_index_pair& sip, const rs2_extrinsics& ex);
  162. void calcAndAppendTransformMsgs(const rs2::stream_profile& profile, const rs2::stream_profile& base_profile);
  163. void handleHWReset(const std_srvs::srv::Empty::Request::SharedPtr req,
  164. const std_srvs::srv::Empty::Response::SharedPtr res);
  165. void getDeviceInfo(const realsense2_camera_msgs::srv::DeviceInfo::Request::SharedPtr req,
  166. realsense2_camera_msgs::srv::DeviceInfo::Response::SharedPtr res);
  167. void CalibConfigReadService(const realsense2_camera_msgs::srv::CalibConfigRead::Request::SharedPtr req,
  168. realsense2_camera_msgs::srv::CalibConfigRead::Response::SharedPtr res);
  169. void CalibConfigWriteService(const realsense2_camera_msgs::srv::CalibConfigWrite::Request::SharedPtr req,
  170. realsense2_camera_msgs::srv::CalibConfigWrite::Response::SharedPtr res);
  171. rclcpp_action::GoalResponse TriggeredCalibrationHandleGoal(const rclcpp_action::GoalUUID & uuid, std::shared_ptr<const TriggeredCalibration::Goal> goal);
  172. rclcpp_action::CancelResponse TriggeredCalibrationHandleCancel(const std::shared_ptr<GoalHandleTriggeredCalibration> goal_handle);
  173. void TriggeredCalibrationHandleAccepted(const std::shared_ptr<GoalHandleTriggeredCalibration> goal_handle);
  174. void TriggeredCalibrationExecute(const std::shared_ptr<GoalHandleTriggeredCalibration> goal_handle);
  175. tf2::Quaternion rotationMatrixToQuaternion(const float rotation[9]) const;
  176. void append_static_tf_msg(const rclcpp::Time& t,
  177. const float3& trans,
  178. const tf2::Quaternion& q,
  179. const std::string& from,
  180. const std::string& to);
  181. void erase_static_tf_msg(const std::string& frame_id,
  182. const std::string& child_frame_id);
  183. void eraseTransformMsgs(const stream_index_pair& sip, const rs2::stream_profile& profile);
  184. void setup();
  185. //Safety Camera
  186. rclcpp::Service<realsense2_camera_msgs::srv::SafetyPresetRead>::SharedPtr _safety_preset_read_srv;
  187. rclcpp::Service<realsense2_camera_msgs::srv::SafetyPresetWrite>::SharedPtr _safety_preset_write_srv;
  188. rclcpp::Service<realsense2_camera_msgs::srv::SafetyInterfaceConfigRead>::SharedPtr _safety_interface_config_read_srv;
  189. rclcpp::Service<realsense2_camera_msgs::srv::SafetyInterfaceConfigWrite>::SharedPtr _safety_interface_config_write_srv;
  190. rclcpp::Service<realsense2_camera_msgs::srv::ApplicationConfigRead>::SharedPtr _application_config_read_srv;
  191. rclcpp::Service<realsense2_camera_msgs::srv::ApplicationConfigWrite>::SharedPtr _application_config_write_srv;
  192. rclcpp::Service<realsense2_camera_msgs::srv::HardwareMonitorCommandSend>::SharedPtr _hardware_monitor_command_send_srv;
  193. void SafetyPresetReadService(const realsense2_camera_msgs::srv::SafetyPresetRead::Request::SharedPtr req,
  194. realsense2_camera_msgs::srv::SafetyPresetRead::Response::SharedPtr res);
  195. void SafetyPresetWriteService(const realsense2_camera_msgs::srv::SafetyPresetWrite::Request::SharedPtr req,
  196. realsense2_camera_msgs::srv::SafetyPresetWrite::Response::SharedPtr res);
  197. void SafetyInterfaceConfigReadService(const realsense2_camera_msgs::srv::SafetyInterfaceConfigRead::Request::SharedPtr req,
  198. realsense2_camera_msgs::srv::SafetyInterfaceConfigRead::Response::SharedPtr res);
  199. void SafetyInterfaceConfigWriteService(const realsense2_camera_msgs::srv::SafetyInterfaceConfigWrite::Request::SharedPtr req,
  200. realsense2_camera_msgs::srv::SafetyInterfaceConfigWrite::Response::SharedPtr res);
  201. void ApplicationConfigReadService(const realsense2_camera_msgs::srv::ApplicationConfigRead::Request::SharedPtr req,
  202. realsense2_camera_msgs::srv::ApplicationConfigRead::Response::SharedPtr res);
  203. void ApplicationConfigWriteService(const realsense2_camera_msgs::srv::ApplicationConfigWrite::Request::SharedPtr req,
  204. realsense2_camera_msgs::srv::ApplicationConfigWrite::Response::SharedPtr res);
  205. void HardwareMonitorCommandSendService(const realsense2_camera_msgs::srv::HardwareMonitorCommandSend::Request::SharedPtr req,
  206. realsense2_camera_msgs::srv::HardwareMonitorCommandSend::Response::SharedPtr res);
  207. private:
  208. class CimuData
  209. {
  210. public:
  211. CimuData() : m_data({0,0,0}), m_time_ns(-1) {};
  212. CimuData(const stream_index_pair type, Eigen::Vector3d data, double time):
  213. m_type(type),
  214. m_data(data),
  215. m_time_ns(time){};
  216. bool is_set() {return m_time_ns > 0;};
  217. public:
  218. stream_index_pair m_type;
  219. Eigen::Vector3d m_data;
  220. double m_time_ns;
  221. };
  222. void getParameters();
  223. void setDynamicParams();
  224. void clearParameters();
  225. void setupDevice();
  226. void hardwareResetRequest();
  227. void setupPublishers();
  228. void enable_devices();
  229. void setupFilters();
  230. bool setBaseTime(double frame_time, rs2_timestamp_domain time_domain);
  231. uint64_t millisecondsToNanoseconds(double timestamp_ms);
  232. rclcpp::Time frameSystemTimeSec(rs2::frame frame);
  233. cv::Mat& fix_depth_scale(const cv::Mat& from_image, cv::Mat& to_image);
  234. void clip_depth(rs2::depth_frame depth_frame, float clipping_dist);
  235. void updateProfilesStreamCalibData(const std::vector<rs2::stream_profile>& profiles);
  236. void updateExtrinsicsCalibData(const rs2::video_stream_profile& left_video_profile, const rs2::video_stream_profile& right_video_profile);
  237. void updateStreamCalibData(const rs2::video_stream_profile& video_profile);
  238. void SetBaseStream();
  239. void publishStaticTransforms();
  240. void startDynamicTf();
  241. void publishDynamicTransforms();
  242. void publishPointCloud(rs2::points f, const rclcpp::Time& t, const rs2::frameset& frameset);
  243. void publishOccupancyFrame(rs2::frame f, const rclcpp::Time& t);
  244. void publishLabeledPointCloud(rs2::labeled_points lpc, const rclcpp::Time& t);
  245. bool shouldPublishCameraInfo(const stream_index_pair& sip);
  246. Extrinsics rsExtrinsicsToMsg(const rs2_extrinsics& extrinsics) const;
  247. IMUInfo getImuInfo(const rs2::stream_profile& profile);
  248. void initializeFormatsMaps();
  249. bool fillROSImageMsgAndReturnStatus(
  250. const cv::Mat& cv_matrix_image,
  251. const stream_index_pair& stream,
  252. unsigned int width,
  253. unsigned int height,
  254. const rs2_format& stream_format,
  255. const rclcpp::Time& t,
  256. sensor_msgs::msg::Image* img_msg_ptr);
  257. bool fillCVMatImageAndReturnStatus(
  258. rs2::frame& frame,
  259. std::map<stream_index_pair, cv::Mat>& images,
  260. unsigned int width,
  261. unsigned int height,
  262. const stream_index_pair& stream);
  263. void publishFrame(
  264. rs2::frame f,
  265. const rclcpp::Time& t,
  266. const stream_index_pair& stream,
  267. std::map<stream_index_pair, cv::Mat>& images,
  268. const std::map<stream_index_pair, rclcpp::Publisher<sensor_msgs::msg::CameraInfo>::SharedPtr>& info_publishers,
  269. const std::map<stream_index_pair, std::shared_ptr<image_publisher>>& image_publishers,
  270. const bool is_publishMetadata = true);
  271. void publishRGBD(
  272. const cv::Mat& rgb_cv_matrix,
  273. const rs2_format& color_format,
  274. const cv::Mat& depth_cv_matrix,
  275. const rs2_format& depth_format,
  276. const rclcpp::Time& t);
  277. void publishMetadata(rs2::frame f, const rclcpp::Time& header_time, const std::string& frame_id);
  278. sensor_msgs::msg::Imu CreateUnitedMessage(const CimuData accel_data, const CimuData gyro_data);
  279. void FillImuData_Copy(const CimuData imu_data, std::deque<sensor_msgs::msg::Imu>& imu_msgs);
  280. void ImuMessage_AddDefaultValues(sensor_msgs::msg::Imu& imu_msg);
  281. void FillImuData_LinearInterpolation(const CimuData imu_data, std::deque<sensor_msgs::msg::Imu>& imu_msgs);
  282. void imu_callback(rs2::frame frame);
  283. void imu_callback_sync(rs2::frame frame, imu_sync_method sync_method=imu_sync_method::COPY);
  284. void multiple_message_callback(rs2::frame frame, imu_sync_method sync_method);
  285. void frame_callback(rs2::frame frame);
  286. void startDiagnosticsUpdater();
  287. void monitoringProfileChanges();
  288. void publish_temperature();
  289. void setAvailableSensors();
  290. void setCallbackFunctions();
  291. void updateSensors();
  292. void startUpdatedSensors();
  293. void stopRequiredSensors();
  294. void publishServices();
  295. void publishActions();
  296. void startPublishers(const std::vector<rs2::stream_profile>& profiles, const RosSensor& sensor);
  297. void startRGBDPublisherIfNeeded();
  298. void stopPublishers(const std::vector<rs2::stream_profile>& profiles);
  299. #if defined (ACCELERATE_GPU_WITH_GLSL)
  300. void initOpenGLProcessing(bool use_gpu_processing);
  301. void shutdownOpenGLProcessing();
  302. void glfwPollEventCallback();
  303. #endif
  304. rs2::device _dev;
  305. std::map<stream_index_pair, rs2::sensor> _sensors;
  306. std::map<std::string, std::function<void(rs2::frame)>> _sensors_callback;
  307. std::string _json_file_path;
  308. float _depth_scale_meters;
  309. float _clipping_distance;
  310. double _linear_accel_cov;
  311. double _angular_velocity_cov;
  312. bool _hold_back_imu_for_frames;
  313. std::map<stream_index_pair, bool> _enable;
  314. bool _publish_tf;
  315. double _tf_publish_rate, _diagnostics_period;
  316. std::mutex _publish_tf_mutex;
  317. std::mutex _update_sensor_mutex;
  318. std::mutex _profile_changes_mutex;
  319. std::mutex _publish_dynamic_tf_mutex;
  320. std::shared_ptr<tf2_ros::StaticTransformBroadcaster> _static_tf_broadcaster;
  321. std::shared_ptr<tf2_ros::TransformBroadcaster> _dynamic_tf_broadcaster;
  322. std::vector<geometry_msgs::msg::TransformStamped> _static_tf_msgs;
  323. std::shared_ptr<std::thread> _tf_t;
  324. bool _use_intra_process;
  325. std::map<stream_index_pair, std::shared_ptr<image_publisher>> _image_publishers;
  326. rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr _labeled_pointcloud_publisher;
  327. rclcpp::Publisher<nav_msgs::msg::GridCells>::SharedPtr _occupancy_publisher;
  328. std::map<stream_index_pair, rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr> _imu_publishers;
  329. std::shared_ptr<SyncedImuPublisher> _synced_imu_publisher;
  330. std::map<stream_index_pair, rclcpp::Publisher<sensor_msgs::msg::CameraInfo>::SharedPtr> _info_publishers;
  331. std::map<stream_index_pair, rclcpp::Publisher<realsense2_camera_msgs::msg::Metadata>::SharedPtr> _metadata_publishers;
  332. std::map<stream_index_pair, rclcpp::Publisher<IMUInfo>::SharedPtr> _imu_info_publishers;
  333. std::map<stream_index_pair, rclcpp::Publisher<Extrinsics>::SharedPtr> _extrinsics_publishers;
  334. rclcpp::Publisher<realsense2_camera_msgs::msg::RGBD>::SharedPtr _rgbd_publisher;
  335. std::map<stream_index_pair, cv::Mat> _images;
  336. std::map<rs2_format, std::string> _rs_format_to_ros_format;
  337. std::map<rs2_format, int> _rs_format_to_cv_format;
  338. std::map<stream_index_pair, sensor_msgs::msg::CameraInfo> _camera_info;
  339. std::atomic_bool _is_initialized_time_base;
  340. double _camera_time_base;
  341. rclcpp::Time _ros_time_base;
  342. bool _sync_frames;
  343. bool _enable_rgbd;
  344. bool _is_color_enabled;
  345. bool _is_depth_enabled;
  346. bool _is_accel_enabled;
  347. bool _is_gyro_enabled;
  348. bool _pointcloud;
  349. imu_sync_method _imu_sync_method;
  350. stream_index_pair _pointcloud_texture;
  351. PipelineSyncer _syncer;
  352. rs2::asynchronous_syncer _asyncer;
  353. std::shared_ptr<NamedFilter> _colorizer_filter;
  354. std::shared_ptr<AlignDepthFilter> _align_depth_filter;
  355. std::shared_ptr<PointcloudFilter> _pc_filter;
  356. std::vector<std::shared_ptr<NamedFilter>> _filters;
  357. std::vector<rs2::sensor> _dev_sensors;
  358. std::vector<std::unique_ptr<RosSensor>> _available_ros_sensors;
  359. std::map<rs2_stream, std::shared_ptr<rs2::align>> _align;
  360. std::map<stream_index_pair, cv::Mat> _depth_aligned_image;
  361. std::map<stream_index_pair, cv::Mat> _depth_scaled_image;
  362. std::map<stream_index_pair, rclcpp::Publisher<sensor_msgs::msg::CameraInfo>::SharedPtr> _depth_aligned_info_publisher;
  363. std::map<stream_index_pair, std::shared_ptr<image_publisher>> _depth_aligned_image_publishers;
  364. std::map<std::string, rs2::region_of_interest> _auto_exposure_roi;
  365. std::map<rs2_stream, bool> _is_first_frame;
  366. std::shared_ptr<std::thread> _monitoring_t;
  367. std::shared_ptr<std::thread> _monitoring_pc; //pc = profile changes
  368. mutable std::condition_variable _cv_temp, _cv_mpc, _cv_tf;
  369. bool _is_profile_changed;
  370. bool _is_align_depth_changed;
  371. std::shared_ptr<diagnostic_updater::Updater> _diagnostics_updater;
  372. rs2::stream_profile _base_profile;
  373. //Safety Camera
  374. rs2::sensor* _safety_sensor;
  375. void setSafetySensorIfAvailable();
  376. void publishSafetyServices();
  377. #if defined (ACCELERATE_GPU_WITH_GLSL)
  378. GLwindow _app;
  379. rclcpp::TimerBase::SharedPtr _timer;
  380. bool _accelerate_gpu_with_glsl;
  381. bool _is_accelerate_gpu_with_glsl_changed;
  382. #endif
  383. std::string _tf_prefix;
  384. };//end class
  385. }