Ekumen-OS / beluga

A general implementation of Monte Carlo Localization (MCL) algorithms written in C++17, and a ROS package that can be used in ROS 1 and ROS 2.
https://ekumen-os.github.io/beluga/
Apache License 2.0
209 stars 17 forks source link

Beluga ROS 2 debian builds fail sporadically #385

Open hidmic opened 6 months ago

hidmic commented 6 months ago

Bug description

Platform (please complete the following information):

How to reproduce

No way to reproduce. Only observed in the ROS buildfarm, see https://build.ros2.org/job/Hbin_ujv8_uJv8__beluga_amcl__ubuntu_jammy_arm64__binary/1 or https://build.ros2.org/job/Ibin_ujv8_uJv8__beluga_amcl__ubuntu_jammy_arm64__binary/3.

Expected behavior Builds succeed consistently.

Actual behavior Every other builds fails with:

c++: fatal error: Killed signal terminated program cc1plus
compilation terminated.

Additional context

This looks like the compiler getting killed by the OS when close enough to exhaust all system memory. I don't know what resources do ROS buildfarm ARM64 instances have or how many release jobs may be running concurrently at any given time, but at the very least we could check if any of our templates is particularly hard to expand e.g. using -ftemplate-depth=n to search for them by trial and error.

hidmic commented 6 months ago

It's starting to happen on AMD64 too, see https://build.ros2.org/job/Hbin_uJ64__beluga_amcl__ubuntu_jammy_amd64__binary/3.

hidmic commented 6 months ago

I did some minimal digging, reducing -ftemplate-depth (maximum number of template expansions). IIUC gcc defaults it to 900. I can take it down to 100. Compilation breaks at 50, on seemingly innocent code:

Starting >>> beluga_amcl
--- stderr: beluga_amcl                              
In file included from /usr/include/range/v3/functional/concepts.hpp:19,
                 from /usr/include/range/v3/iterator/concepts.hpp:27,
                 from /usr/include/range/v3/range/access.hpp:34,
                 from /usr/include/range/v3/view/all.hpp:22,
                 from /ws/install/include/beluga/beluga/algorithm/raycasting/bresenham.hpp:21,
                 from /ws/install/include/beluga/beluga/algorithm/raycasting.hpp:22,
                 from /ws/install/include/beluga/beluga/sensor/beam_model.hpp:23,
                 from /ws/src/beluga/beluga_amcl/src/amcl_node.cpp:58:
/usr/include/range/v3/functional/invoke.hpp: In instantiation of ‘constexpr ranges::detail::iterator_associated_types_base_<ranges::iota_view<int, int>::cursor, true>::iterator_associated_types_base_(const ranges::detail::iterator_associated_types_base_<ranges::iota_view<int, int>::cursor, true>&)’:
/usr/include/range/v3/functional/invoke.hpp:138:40:   recursively required from ‘constexpr ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >::basic_iterator(const ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&)/usr/include/range/v3/functional/invoke.hpp:138:40:   required from ‘constexpr decltype ((F&&)(f)((Args&&(ranges::invoke_fn::operator()::args))...)) ranges::invoke_fn::operator()(F&&, Args&& ...) const [with F = ranges::indirected<<lambda(auto:90&&)> >; Args = {ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&}]/usr/include/range/v3/functional/concepts.hpp:36:5:   required by substitution of ‘template<class ... As> char (& ranges::invocable__requires_(concepts::detail::tag<As ...>*, decltype (& invocable__requires_test_<As ...>)))[1] [with As = {ranges::indirected<<lambda(auto:90&&)> >, ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&}]/usr/include/range/v3/functional/concepts.hpp:43:9:   required from ‘constexpr const bool ranges::invocable<ranges::indirected<<lambda(auto:90&&)> >, ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&>/usr/include/range/v3/utility/semiregular_box.hpp:245:9:   required by substitution of ‘template<class ... Args, bool CPP_true, typename std::enable_if<(invocable<ranges::indirected<<lambda(auto:90&&)> >, Args ...> && CPP_true), int>::type <anonymous> > constexpr decltype(auto) ranges::semiregular_box<ranges::indirected<<lambda(auto:90&&)> > >::operator()<Args ..., CPP_true, <anonymous> >(Args&& ...) && [with Args = {ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&}; bool CPP_true = true; typename std::enable_if<(invocable<ranges::indirected<<lambda(auto:90&&)> >, Args ...> && CPP_true), int>::type <anonymous> = <missing>]/usr/include/range/v3/functional/invoke.hpp:139:34:   required by substitution of ‘template<class F, class ... Args> constexpr decltype ((F&&)(f)((Args&&(ranges::invoke_fn::operator()::args))...)) ranges::invoke_fn::operator()(F&&, Args&& ...) const [with F = ranges::semiregular_box<ranges::indirected<<lambda(auto:90&&)> > >&; Args = {ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&}]/usr/include/range/v3/functional/reference_wrapper.hpp:111:24:   required by substitution of ‘template<class ... Args> constexpr decltype (ranges::invoke(static_cast<ranges::reference_wrapper<ranges::semiregular_box<ranges::indirected<<lambda(auto:90&&)> > > >::reference>((*((const ranges::reference_wrapper<ranges::semiregular_box<ranges::indirected<<lambda(auto:90&&)> > > >*)this)->ranges::detail::reference_wrapper_<ranges::semiregular_box<ranges::indirected<<lambda(auto:90&&)> > > >::t_)), static_cast<Args&&>(ranges::reference_wrapper<T>::operator()::args) ...)) ranges::reference_wrapper<ranges::semiregular_box<ranges::indirected<<lambda(auto:90&&)> > > >::operator()<Args ...>(Args&& ...) const [with Args = {ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&}]/usr/include/range/v3/functional/invoke.hpp:139:34:   required by substitution of ‘template<class F, class ... Args> constexpr decltype ((F&&)(f)((Args&&(ranges::invoke_fn::operator()::args))...)) ranges::invoke_fn::operator()(F&&, Args&& ...) const [with F = const ranges::reference_wrapper<ranges::semiregular_box<ranges::indirected<<lambda(auto:90&&)> > > >&; Args = {ranges::basic_iterator<ranges::adaptor_cursor<ranges::basic_iterator<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >::cursor>, ranges::remove_if_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, ranges::logical_negate<beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> > >::adaptor> >&}]/usr/include/range/v3/view/transform.hpp:136:18:   required from ‘struct ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >::adaptor<false>/usr/include/range/v3/detail/range_access.hpp:96:31:   required from ‘static constexpr decltype (rng.begin_adaptor()) ranges::range_access::begin_adaptor(Rng&) [with Rng = ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >]/usr/include/range/v3/view/adaptor.hpp:40:40:   required by substitution of ‘template<class D> using adaptor_cursor_t = ranges::adaptor_cursor<typename std::decay<decltype (declval<typename std::decay<decltype (ranges::range_access::begin_adaptor(declval<Derived&>()))>::type>().begin(declval<Derived&>()))>::type, typename std::decay<decltype (ranges::range_access::begin_adaptor(declval<Derived&>()))>::type> [with D = ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >]/usr/include/range/v3/view/adaptor.hpp:504:46:   required by substitution of ‘template<class D> static constexpr ranges::adaptor_cursor_t<D> ranges::view_adaptor<ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >, ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::finite>::begin_cursor_<D>(D&) [with D = ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >]/usr/include/range/v3/view/adaptor.hpp:517:52:   required by substitution of ‘template<class D, bool CPP_true, typename std::enable_if<(same_as<D, ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > > > && CPP_true), int>::type <anonymous> > constexpr decltype (ranges::view_adaptor<ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >, ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::finite>::begin_cursor_<D>(declval<D&>())) ranges::view_adaptor<ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >, ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::finite>::begin_cursor<D, CPP_true, <anonymous> >() [with D = ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >; bool CPP_true = true; typename std::enable_if<(same_as<D, ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > > > && CPP_true), int>::type <anonymous> = 0]/usr/include/range/v3/detail/range_access.hpp:85:31:   required by substitution of ‘template<class Rng> static constexpr decltype (rng.begin_cursor()) ranges::range_access::begin_cursor(Rng&) [with Rng = const ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >]/usr/include/range/v3/view/facade.hpp:39:39:   required by substitution of ‘template<class Derived> using facade_iterator_t = ranges::basic_iterator<typename std::decay<decltype (ranges::range_access::begin_cursor(declval<Derived&>()))>::type> [with Derived = const ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >]/usr/include/range/v3/view/facade.hpp:106:24:   required by substitution of ‘template<class D, bool CPP_true, typename std::enable_if<(same_as<D, ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > > > && CPP_true), int>::type <anonymous> > constexpr ranges::detail::facade_iterator_t<const D> ranges::view_facade<ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >, ranges::finite>::begin<D, CPP_true, <anonymous> >() const [with D = ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > >; bool CPP_true = true; typename std::enable_if<(same_as<D, ranges::iter_transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, ranges::indirected<<lambda(auto:90&&)> > > > && CPP_true), int>::type <anonymous> = 0]/usr/include/range/v3/range/access.hpp:86:9:   required by substitution of ‘template<class ... As> char (& ranges::_begin_::has_member_begin__requires_(concepts::detail::tag<As ...>*, decltype (& has_member_begin__requires_test_<As ...>)))[1] [with As = {ranges::transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, <lambda(auto:90&&)> >&}]/usr/include/range/v3/range/access.hpp:93:13:   required from ‘constexpr const bool ranges::_begin_::has_member_begin<ranges::transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, <lambda(auto:90&&)> >&>/usr/include/range/v3/range/access.hpp:133:13:   required by substitution of ‘template<class R, bool CPP_true, typename std::enable_if<(_borrowed_range<R> && CPP_true), int>::type <anonymous>, typename std::enable_if<((has_member_begin<R> || has_non_member_begin<R>) && CPP_true), int>::type <anonymous> > constexpr auto ranges::_begin_::fn::operator()(R&&) const [with R = ranges::transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, <lambda(auto:90&&)> >&; bool CPP_true = true; typename std::enable_if<(_borrowed_range<R> && CPP_true), int>::type <anonymous> = <missing>; typename std::enable_if<((has_member_begin<R> || has_non_member_begin<R>) && CPP_true), int>::type <anonymous> = <missing>]/usr/include/range/v3/range/concepts.hpp:56:5:   required by substitution of ‘template<class ... As> char (& ranges::_range__requires_(concepts::detail::tag<As ...>*, decltype (& _range__requires_test_<As ...>)))[1] [with As = {ranges::transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, <lambda(auto:90&&)> >}]/usr/include/range/v3/range/concepts.hpp:64:9:   required from ‘constexpr const bool ranges::range<ranges::transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, <lambda(auto:90&&)> > >/usr/include/range/v3/range/concepts.hpp:210:9:   required from ‘constexpr const bool ranges::viewable_range<ranges::transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, <lambda(auto:90&&)> > >/usr/include/range/v3/view/view.hpp:106:13:   required by substitution of ‘template<class Rng, class ViewFn, bool CPP_true, typename std::enable_if<(viewable_range<Rng> && CPP_true), int>::type <anonymous>, typename std::enable_if<(invocable_view_closure<ViewFn, Rng> && CPP_true), int>::type <anonymous> > constexpr auto ranges::views::view_closure_base_ns::operator|(Rng&&, ranges::views::view_closure<ViewFn>) [with Rng = ranges::transform_view<ranges::filter_view<ranges::cache1_view<ranges::zip_view<ranges::detail::index_view<long unsigned int, long int>, ranges::iota_view<int, int> > >, beluga::views::detail::take_evenly_fn::operator()<ranges::iota_view<int, int> >(ranges::iota_view<int, int>&&, std::size_t) const::<lambda(const auto:91&)> >, <lambda(auto:90&&)> >; ViewFn = ranges::detail::bind_back_fn_<ranges::views::transform_base_fn, beluga_ros::LaserScan::angles() const::<lambda(int)> >; bool CPP_true = true; typename std::enable_if<(viewable_range<Rng> && CPP_true), int>::type <anonymous> = <missing>; typename std::enable_if<(invocable_view_closure<ViewFn, Rng> && CPP_true), int>::type <anonymous> = <missing>]/ws/install/include/beluga_ros/beluga_ros/laser_scan.hpp:71:13:   required from here
/usr/include/range/v3/functional/invoke.hpp:138:40: fatal error: template instantiation depth exceeds maximum of 50 (use ‘-ftemplate-depth=’ to increase the maximum)
  138 |             noexcept(noexcept(((F&&) f)((Args&&) args...)))
      |                               ~~~~~~~~~^~~~~~~~~~~~~~~~~~
compilation terminated.

If buildfarm machines are already loaded, I can see them crashing on such deep template compilation. I don't see a way to improve it other than making less aggressive use of ranges :cry: FYI @nahueespinosa.

hidmic commented 6 months ago

I've so far failed to reduce template nesting. I think we'll have to go the explicit instantiation route instead, as you suggested @nahueespinosa, and hope we can cut enough bloat that way.

glpuga commented 4 months ago

Another datapoint here.

The latest versions of Beluga seem ot have a lot of memory, far more than older versions (start of year). Updating the kobuki stack's beluga version to the latest from a version from last January turned it into unbuildable in a 8GB raspberry 5 unless the sequential colcon executor is used. Peak memory usage happens when bulding beluga_amcl, at around 5-6GB.

The same issue happened in a 16GB x64 desktop shortly after. Again, peak memory usage happened on beluga_amcl, with a slightly lower peak memory usage than aarch64, but still enough to crash the system when built concurrently with other packages.

hidmic commented 4 months ago

@glpuga it's the templates. clang does a better job than gcc, memory consumption-wise. My attempts to optimize it failed. Explicit template instantiation may help.

hidmic commented 4 months ago

Got another death on the farm https://build.ros2.org/job/Jbin_uN64__beluga_amcl__ubuntu_noble_amd64__binary. We gotta fix this.

glpuga commented 4 months ago

I don't think this is a situation that deteriorated over time from start of year, really, but now we have two independent targets in beluga_amcl that get built at the same time, doubling the issue.

A stopgap solution might be to temporarily daisy chain those two targets with cmake so they don't get built at the same time, while we look for a better solution.

glpuga commented 4 months ago

A current thread with a lot of information about this: https://discourse.ros.org/t/openvdb-compile-size/38790/4

Each build agent is a compute-optimized “xlarge” instance in EC2 spread between c5.xlarge, c6i.xlarge, or m5.xlarge which all have 4vCPUs and 8GiB of memory.

Each individual package build is expected to use 1/4th of those resources: 1vCPU and 2GiB of RAM. These are soft limits that are not enforced, but since agents run up to four jobs at a time, packages using more than the available memory will be subject to pressure from the OS.

glpuga commented 4 months ago

A stopgap solution might be to temporarily daisy chain those two targets with cmake so they don't get built at the same time, while we look for a better solution.

It's interesting that "the buildfarm by default already uses MAKEFLAGS=-j1", which means my previous stopgap won't make any difference.

hidmic commented 4 months ago

I've been following that thread. It basically confirms our suspicion: the allocation build jobs get on buildfarm VMs is small-ish for today's standards.

We need the compiler to use less memory.

nahueespinosa commented 2 months ago

TIL about https://github.com/mikael-s-persson/templight

nahueespinosa commented 1 month ago

This line has a template depth of 62: https://github.com/Ekumen-OS/beluga/blob/main/beluga_amcl/src/amcl_node.cpp#L194

--- stderr: beluga_amcl
In file included from /opt/ros/humble/include/rclcpp/rclcpp/client.hpp:28,
                 from /opt/ros/humble/include/rclcpp/rclcpp/callback_group.hpp:24,
                 from /opt/ros/humble/include/rclcpp/rclcpp/any_executable.hpp:20,
                 from /opt/ros/humble/include/rclcpp/rclcpp/memory_strategy.hpp:25,
                 from /opt/ros/humble/include/rclcpp/rclcpp/memory_strategies.hpp:18,
                 from /opt/ros/humble/include/rclcpp/rclcpp/executor_options.hpp:20,
                 from /opt/ros/humble/include/rclcpp/rclcpp/executor.hpp:37,
                 from /opt/ros/humble/include/rclcpp/rclcpp/executors/multi_threaded_executor.hpp:25,
                 from /opt/ros/humble/include/rclcpp/rclcpp/executors.hpp:21,
                 from /opt/ros/humble/include/rclcpp/rclcpp/rclcpp.hpp:155,
                 from /opt/ros/humble/include/tf2_ros/tf2_ros/buffer_interface.h:48,
                 from /opt/ros/humble/include/tf2_ros/tf2_ros/buffer.h:42,
                 from /ws/src/beluga/beluga_amcl/src/amcl_node.cpp:33:
/usr/include/c++/11/variant: In instantiation of ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<> >’:
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&, const rclcpp::MessageInfo&)>, std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&, const rclcpp::MessageInfo&)>, std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:737:2:   required from ‘struct std::__detail::__variant::__tuple_count<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&)>, std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&, const rclcpp::MessageInfo&)>, std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:727:35:   required from ‘constexpr const size_t std::__detail::__variant::__tuple_count_v<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::tuple<std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&)>, std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&, const rclcpp::MessageInfo&)>, std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> > >’
/usr/include/c++/11/variant:742:7:   required from ‘constexpr const bool std::__detail::__variant::__exactly_once<std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&)>, std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&, const rclcpp::MessageInfo&)>, std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)> >’
/usr/include/c++/11/variant:1111:42:   required from ‘constexpr bool std::holds_alternative(const std::variant<_Types ...>&) [with _Tp = std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>; _Types = {std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&)>, std::function<void(const sensor_msgs::msg::LaserScan_<std::allocator<void> >&, const rclcpp::MessageInfo&)>, std::function<void(const rclcpp::SerializedMessage&)>, std::function<void(const rclcpp::SerializedMessage&, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >)>, std::function<void(std::unique_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::default_delete<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >, const rclcpp::MessageInfo&)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >)>, std::function<void(std::unique_ptr<rclcpp::SerializedMessage, std::default_delete<rclcpp::SerializedMessage> >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<const rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&)>, std::function<void(const std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >&, const rclcpp::MessageInfo&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&)>, std::function<void(const std::shared_ptr<const rclcpp::SerializedMessage>&, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>, std::function<void(std::shared_ptr<sensor_msgs::msg::LaserScan_<std::allocator<void> > >, const rclcpp::MessageInfo&)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>, std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo&)>}]’
/opt/ros/humble/include/rclcpp/rclcpp/any_subscription_callback.hpp:939:61:   required from ‘constexpr bool rclcpp::AnySubscriptionCallback<MessageT, AllocatorT>::use_take_shared_method() const [with MessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; AllocatorT = std::allocator<void>]’
/opt/ros/humble/include/rclcpp/rclcpp/detail/resolve_intra_process_buffer_type.hpp:40:57:   required from ‘rclcpp::IntraProcessBufferType rclcpp::detail::resolve_intra_process_buffer_type(rclcpp::IntraProcessBufferType, const rclcpp::AnySubscriptionCallback<CallbackMessageT, AllocatorT>&) [with CallbackMessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; AllocatorT = std::allocator<void>]’
/opt/ros/humble/include/rclcpp/rclcpp/subscription.hpp:216:42:   required from ‘rclcpp::Subscription<MessageT, AllocatorT, SubscribedT, ROSMessageT, MessageMemoryStrategyT>::Subscription(rclcpp::node_interfaces::NodeBaseInterface*, const rosidl_message_type_support_t&, const string&, const rclcpp::QoS&, rclcpp::AnySubscriptionCallback<CallbackMessageT, AllocatorT>, const rclcpp::SubscriptionOptionsWithAllocator<AllocatorT>&, typename MessageMemoryStrategyT::SharedPtr, rclcpp::Subscription<MessageT, AllocatorT, SubscribedT, ROSMessageT, MessageMemoryStrategyT>::SubscriptionTopicStatisticsSharedPtr) [with MessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; AllocatorT = std::allocator<void>; SubscribedT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; ROSMessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; MessageMemoryStrategyT = rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >]’
/usr/include/c++/11/ext/new_allocator.h:162:4:   required from ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}; _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >]’
/usr/include/c++/11/bits/alloc_traits.h:516:17:   required from ‘static void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) [with _Up = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}; _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >]’
/usr/include/c++/11/bits/shared_ptr_base.h:519:39:   required from ‘std::_Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp>::_Sp_counted_ptr_inplace(_Alloc, _Args&& ...) [with _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}; _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; _Alloc = std::allocator<rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > > >; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’
/usr/include/c++/11/bits/shared_ptr_base.h:650:16:   required from ‘std::__shared_count<_Lp>::__shared_count(_Tp*&, std::_Sp_alloc_shared_tag<_Alloc>, _Args&& ...) [with _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; _Alloc = std::allocator<rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > > >; _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’
/usr/include/c++/11/bits/shared_ptr_base.h:1342:14:   required from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::allocator<rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > > >; _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}; _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]’
/usr/include/c++/11/bits/shared_ptr.h:409:59:   required from ‘std::shared_ptr<_Tp>::shared_ptr(std::_Sp_alloc_shared_tag<_Tp>, _Args&& ...) [with _Alloc = std::allocator<rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > > >; _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}; _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >]’
/usr/include/c++/11/bits/shared_ptr.h:862:14:   required from ‘std::shared_ptr<_Tp> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; _Alloc = std::allocator<rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > > >; _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}]’
/usr/include/c++/11/bits/shared_ptr.h:878:39:   required from ‘std::shared_ptr<_Tp> std::make_shared(_Args&& ...) [with _Tp = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; _Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}]’
/opt/ros/humble/include/rclcpp/rclcpp/subscription.hpp:110:3:   required from ‘static std::shared_ptr<rclcpp::Subscription<MessageT, AllocatorT, SubscribedT, ROSMessageT, MessageMemoryStrategyT> > rclcpp::Subscription<MessageT, AllocatorT, SubscribedT, ROSMessageT, MessageMemoryStrategyT>::make_shared(Args&& ...) [with Args = {rclcpp::node_interfaces::NodeBaseInterface*&, const rosidl_message_type_support_t&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rclcpp::QoS&, const rclcpp::AnySubscriptionCallback<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >&, const rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&, const std::shared_ptr<rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >&, const std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<sensor_msgs::msg::LaserScan_<std::allocator<void> > > >&}; MessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; AllocatorT = std::allocator<void>; SubscribedT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; ROSMessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; MessageMemoryStrategyT = rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >]’
/opt/ros/humble/include/rclcpp/rclcpp/subscription_factory.hpp:107:65:   required from ‘rclcpp::SubscriptionFactory rclcpp::create_subscription_factory(CallbackT&&, const rclcpp::SubscriptionOptionsWithAllocator<AllocatorT>&, typename MessageMemoryStrategyT::SharedPtr, std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics<ROSMessageType> >) [with MessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; CallbackT = message_filters::Subscriber<sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp_lifecycle::LifecycleNode>::subscribe(rclcpp_lifecycle::LifecycleNode*, const string&, rmw_qos_profile_t, rclcpp::SubscriptionOptions)::<lambda(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>; AllocatorT = std::allocator<void>; SubscriptionT = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; MessageMemoryStrategyT = rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >; ROSMessageType = sensor_msgs::msg::LaserScan_<std::allocator<void> >]’
/opt/ros/humble/include/rclcpp/rclcpp/create_subscription.hpp:122:63:   required from ‘std::shared_ptr<ROSMessageT> rclcpp::detail::create_subscription(NodeParametersT&, NodeTopicsT&, const string&, const rclcpp::QoS&, CallbackT&&, const rclcpp::SubscriptionOptionsWithAllocator<AllocatorT>&, typename MessageMemoryStrategyT::SharedPtr) [with MessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; CallbackT = message_filters::Subscriber<sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp_lifecycle::LifecycleNode>::subscribe(rclcpp_lifecycle::LifecycleNode*, const string&, rmw_qos_profile_t, rclcpp::SubscriptionOptions)::<lambda(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>; AllocatorT = std::allocator<void>; SubscriptionT = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; MessageMemoryStrategyT = rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >; NodeParametersT = rclcpp_lifecycle::LifecycleNode; NodeTopicsT = rclcpp_lifecycle::LifecycleNode; ROSMessageType = sensor_msgs::msg::LaserScan_<std::allocator<void> >]’
/opt/ros/humble/include/rclcpp/rclcpp/create_subscription.hpp:191:76:   required from ‘std::shared_ptr<ROSMessageT> rclcpp::create_subscription(NodeT&, const string&, const rclcpp::QoS&, CallbackT&&, const rclcpp::SubscriptionOptionsWithAllocator<AllocatorT>&, typename MessageMemoryStrategyT::SharedPtr) [with MessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; CallbackT = message_filters::Subscriber<sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp_lifecycle::LifecycleNode>::subscribe(rclcpp_lifecycle::LifecycleNode*, const string&, rmw_qos_profile_t, rclcpp::SubscriptionOptions)::<lambda(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>; AllocatorT = std::allocator<void>; SubscriptionT = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; MessageMemoryStrategyT = rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >; NodeT = rclcpp_lifecycle::LifecycleNode]’
/opt/ros/humble/include/rclcpp_lifecycle/rclcpp_lifecycle/lifecycle_node_impl.hpp:76:47:   required from ‘std::shared_ptr<ROSMessageT> rclcpp_lifecycle::LifecycleNode::create_subscription(const string&, const rclcpp::QoS&, CallbackT&&, const rclcpp::SubscriptionOptionsWithAllocator<AllocatorT>&, typename MessageMemoryStrategyT::SharedPtr) [with MessageT = sensor_msgs::msg::LaserScan_<std::allocator<void> >; CallbackT = message_filters::Subscriber<sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp_lifecycle::LifecycleNode>::subscribe(rclcpp_lifecycle::LifecycleNode*, const string&, rmw_qos_profile_t, rclcpp::SubscriptionOptions)::<lambda(std::shared_ptr<const sensor_msgs::msg::LaserScan_<std::allocator<void> > >)>; AllocatorT = std::allocator<void>; SubscriptionT = rclcpp::Subscription<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void>, sensor_msgs::msg::LaserScan_<std::allocator<void> >, sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> > >; MessageMemoryStrategyT = rclcpp::message_memory_strategy::MessageMemoryStrategy<sensor_msgs::msg::LaserScan_<std::allocator<void> >, std::allocator<void> >]’
/opt/ros/humble/include/message_filters/message_filters/subscriber.h:286:51:   required from ‘void message_filters::Subscriber<M, NodeType>::subscribe(NodeType*, const string&, rmw_qos_profile_t, rclcpp::SubscriptionOptions) [with M = sensor_msgs::msg::LaserScan_<std::allocator<void> >; NodeType = rclcpp_lifecycle::LifecycleNode]’
/opt/ros/humble/include/message_filters/message_filters/subscriber.h:188:16:   required from ‘message_filters::Subscriber<M, NodeType>::Subscriber(message_filters::Subscriber<M, NodeType>::NodePtr, const string&, rmw_qos_profile_t, rclcpp::SubscriptionOptions) [with M = sensor_msgs::msg::LaserScan_<std::allocator<void> >; NodeType = rclcpp_lifecycle::LifecycleNode]’
/usr/include/c++/11/bits/unique_ptr.h:962:30:   required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = message_filters::Subscriber<sensor_msgs::msg::LaserScan_<std::allocator<void> >, rclcpp_lifecycle::LifecycleNode>; _Args = {std::shared_ptr<rclcpp_lifecycle::LifecycleNode>, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const rmw_qos_profile_s&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> >&}]’
/ws/src/beluga/beluga_amcl/src/amcl_node.cpp:194:60:   required from here
/usr/include/c++/11/variant:727:35: fatal error: template instantiation depth exceeds maximum of 62 (use ‘-ftemplate-depth=’ to increase the maximum)
  727 |       __tuple_count<_Tp, _Tuple>::value;
      |                                   ^~~~~
compilation terminated.

The ranges library should be like a walk in the park compared to this :sweat_smile: https://github.com/ros2/rclcpp/blob/f8aea8cc51116ff27fe29fd170d4f23148e9f709/rclcpp/include/rclcpp/any_subscription_callback.hpp#L912

nahueespinosa commented 1 month ago

Some concrete findings after poking at the codebase for a while:

  1. This line requires 164 MB to compile.
    template class message_filters::Subscriber<sensor_msgs::msg::LaserScan, rclcpp::Node>;
  2. Adding this without using anything explicitly requires 51 MB to compile.
    #include <tf2_eigen/tf2_eigen.hpp>

That's not much, but it can add up. Restructuring our libraries differently might help.

nahueespinosa commented 1 month ago

Leaving these here for future reference.

https://wiki.debian.org/ReduceBuildMemoryOverhead https://askubuntu.com/a/785815 https://stackoverflow.com/a/26036300

nahueespinosa commented 1 month ago

Test target analysis:

chart (2)

hidmic commented 1 month ago

What's going on with cluster based estimation? :eyes:

nahueespinosa commented 1 month ago

What's going on with cluster based estimation?

Many, many layers of range adaptors. I'm currently refactoring the estimation library to address this. A good part of it comes from the test code itself though.