ROS2 Humble + Zed container for Ubuntu 18.04 (L4T 32.7.1)

I pulled the dustynv/ros:humble-pytorch-l4t-r32.7.1 docker image and installed Zed SDK and Python API. However, I’m having several build issues with the zed-ros2-wrapper pkg. Mainly issues are coming with dependencies diagnostics and robot_localization.

I’m looking for a docker container that has ROS2 humble as well as all 3 Zed components (SDK with tools, Python API, zed-ros2-wrapper).

Issues during docker build :- 
$<BUILD_INTERFACE:/sar_ws/src/diagnostics/self_test/include>
-- Configured cppcheck exclude dirs and/or files: 
-- Added test 'cpplint' to check C / C++ code against the Google style
-- Configured cpplint exclude dirs and/or files: 
-- Added test 'lint_cmake' to check CMake code style
-- Added test 'uncrustify' to check C / C++ code style
-- Configured uncrustify additional arguments: 
-- Added test 'xmllint' to check XML markup files
-- Configuring done (20.0s)
-- Generating done (0.4s)
-- Build files have been written to: /sar_ws/build/self_test
[  6%] Building CXX object CMakeFiles/run_selftest.dir/src/run_selftest.cpp.o
[ 30%] Building CXX object CMakeFiles/diagnostic_aggregator.dir/src/analyzer_group.cpp.o
[Processing: diagnostic_aggregator, geographic_msgs, self_test]
In file included from /opt/ros/humble/install/include/rclcpp/rclcpp/callback_group.hpp:24:0,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/any_executable.hpp:20,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/memory_strategy.hpp:25,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/memory_strategies.hpp:18,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executor_options.hpp:20,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executor.hpp:37,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executors/multi_threaded_executor.hpp:25,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executors.hpp:21,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/rclcpp.hpp:155,
                 from /sar_ws/src/diagnostics/self_test/src/run_selftest.cpp:41:
/opt/ros/humble/install/include/rclcpp/rclcpp/client.hpp: In instantiation of ‘std::optional<std::variant<std::promise<typename ServiceT::Response::SharedPtr>, std::tuple<std::function<void(std::shared_future<typename ServiceT::Response::SharedPtr>)>, std::shared_future<typename ServiceT::Response::SharedPtr>, std::promise<typename ServiceT::Response::SharedPtr> >, std::tuple<std::function<void(std::shared_future<std::pair<typename ServiceT::Request::SharedPtr, typename ServiceT::Response::SharedPtr> >)>, typename ServiceT::Request::SharedPtr, std::shared_future<std::pair<typename ServiceT::Request::SharedPtr, typename ServiceT::Response::SharedPtr> >, std::promise<std::pair<typename ServiceT::Request::SharedPtr, typename ServiceT::Response::SharedPtr> > > > > rclcpp::Client<ServiceT>::get_and_erase_pending_request(int64_t) [with ServiceT = diagnostic_msgs::srv::SelfTest; typename ServiceT::Response::SharedPtr = std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > >; typename ServiceT::Request::SharedPtr = std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >; int64_t = long int]’:
/opt/ros/humble/install/include/rclcpp/rclcpp/client.hpp:551:38:   required from ‘void rclcpp::Client<ServiceT>::handle_response(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<void>) [with ServiceT = diagnostic_msgs::srv::SelfTest]’
/sar_ws/src/diagnostics/self_test/src/run_selftest.cpp:114:1:   required from here
/opt/ros/humble/install/include/rclcpp/rclcpp/client.hpp:821:12: error: could not convert ‘value’ from ‘std::variant<std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::tuple<std::function<void(std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >)>, std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::tuple<std::function<void(std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >)>, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::promise<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > > > >’ to ‘std::optional<std::variant<std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::tuple<std::function<void(std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >)>, std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::tuple<std::function<void(std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >)>, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::promise<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > > > > >’
     return value;
            ^~~~~
CMakeFiles/run_selftest.dir/build.make:75: recipe for target 'CMakeFiles/run_selftest.dir/src/run_selftest.cpp.o' failed
CMakeFiles/Makefile2:179: recipe for target 'CMakeFiles/run_selftest.dir/all' failed
Makefile:145: recipe for target 'all' failed
make[2]: *** [CMakeFiles/run_selftest.dir/src/run_selftest.cpp.o] Error 1
make[1]: *** [CMakeFiles/run_selftest.dir/all] Error 2
make: *** [all] Error 2
--- stderr: self_test
In file included from /opt/ros/humble/install/include/rclcpp/rclcpp/callback_group.hpp:24:0,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/any_executable.hpp:20,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/memory_strategy.hpp:25,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/memory_strategies.hpp:18,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executor_options.hpp:20,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executor.hpp:37,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executors/multi_threaded_executor.hpp:25,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/executors.hpp:21,
                 from /opt/ros/humble/install/include/rclcpp/rclcpp/rclcpp.hpp:155,
                 from /sar_ws/src/diagnostics/self_test/src/run_selftest.cpp:41:
/opt/ros/humble/install/include/rclcpp/rclcpp/client.hpp: In instantiation of ‘std::optional<std::variant<std::promise<typename ServiceT::Response::SharedPtr>, std::tuple<std::function<void(std::shared_future<typename ServiceT::Response::SharedPtr>)>, std::shared_future<typename ServiceT::Response::SharedPtr>, std::promise<typename ServiceT::Response::SharedPtr> >, std::tuple<std::function<void(std::shared_future<std::pair<typename ServiceT::Request::SharedPtr, typename ServiceT::Response::SharedPtr> >)>, typename ServiceT::Request::SharedPtr, std::shared_future<std::pair<typename ServiceT::Request::SharedPtr, typename ServiceT::Response::SharedPtr> >, std::promise<std::pair<typename ServiceT::Request::SharedPtr, typename ServiceT::Response::SharedPtr> > > > > rclcpp::Client<ServiceT>::get_and_erase_pending_request(int64_t) [with ServiceT = diagnostic_msgs::srv::SelfTest; typename ServiceT::Response::SharedPtr = std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > >; typename ServiceT::Request::SharedPtr = std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >; int64_t = long int]’:
/opt/ros/humble/install/include/rclcpp/rclcpp/client.hpp:551:38:   required from ‘void rclcpp::Client<ServiceT>::handle_response(std::shared_ptr<rmw_request_id_s>, std::shared_ptr<void>) [with ServiceT = diagnostic_msgs::srv::SelfTest]’
/sar_ws/src/diagnostics/self_test/src/run_selftest.cpp:114:1:   required from here
/opt/ros/humble/install/include/rclcpp/rclcpp/client.hpp:821:12: error: could not convert ‘value’ from ‘std::variant<std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::tuple<std::function<void(std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >)>, std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::tuple<std::function<void(std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >)>, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::promise<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > > > >’ to ‘std::optional<std::variant<std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::tuple<std::function<void(std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >)>, std::shared_future<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > >, std::promise<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::tuple<std::function<void(std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >)>, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_future<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > >, std::promise<std::pair<std::shared_ptr<diagnostic_msgs::srv::SelfTest_Request_<std::allocator<void> > >, std::shared_ptr<diagnostic_msgs::srv::SelfTest_Response_<std::allocator<void> > > > > > > >’
     return value;
            ^~~~~
make[2]: *** [CMakeFiles/run_selftest.dir/src/run_selftest.cpp.o] Error 1
make[1]: *** [CMakeFiles/run_selftest.dir/all] Error 2
make: *** [all] Error 2
---
Failed   <<< self_test [40.6s, exited with code 2]
[ 85%] Built target geographic_msgs__py
[ 85%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_bounding_box_s.c.o
[ 86%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_geo_path_s.c.o
[ 87%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_geo_point_s.c.o
[ 87%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_geo_point_stamped_s.c.o
[ 88%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_geo_pose_s.c.o
[ 88%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_geo_pose_stamped_s.c.o
[ 89%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_key_value_s.c.o
[ 90%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_map_feature_s.c.o
[ 90%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_route_network_s.c.o
[ 91%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_route_path_s.c.o
[ 91%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_route_segment_s.c.o
[ 92%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_way_point_s.c.o
[ 93%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/srv/_get_geographic_map_s.c.o
[ 93%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/srv/_get_geo_path_s.c.o
[ 94%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/srv/_get_route_plan_s.c.o
[ 94%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/srv/_update_geographic_map_s.c.o
[ 94%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_geographic_map_s.c.o
[ 95%] Building C object CMakeFiles/geographic_msgs__rosidl_generator_py.dir/rosidl_generator_py/geographic_msgs/msg/_geographic_map_changes_s.c.o
[ 96%] Linking C shared library rosidl_generator_py/geographic_msgs/libgeographic_msgs__rosidl_generator_py.so
[ 96%] Built target geographic_msgs__rosidl_generator_py
[ 97%] Building C object CMakeFiles/geographic_msgs__rosidl_typesupport_fastrtps_c__pyext.dir/rosidl_generator_py/geographic_msgs/_geographic_msgs_s.ep.rosidl_typesupport_fastrtps_c.c.o
[ 97%] Linking C shared library rosidl_generator_py/geographic_msgs/geographic_msgs_s__rosidl_typesupport_fastrtps_c.cpython-36m-aarch64-linux-gnu.so
[ 97%] Built target geographic_msgs__rosidl_typesupport_fastrtps_c__pyext
[ 98%] Building C object CMakeFiles/geographic_msgs__rosidl_typesupport_c__pyext.dir/rosidl_generator_py/geographic_msgs/_geographic_msgs_s.ep.rosidl_typesupport_c.c.o
[ 98%] Linking C shared library rosidl_generator_py/geographic_msgs/geographic_msgs_s__rosidl_typesupport_c.cpython-36m-aarch64-linux-gnu.so
[ 98%] Built target geographic_msgs__rosidl_typesupport_c__pyext
[ 99%] Building C object CMakeFiles/geographic_msgs__rosidl_typesupport_introspection_c__pyext.dir/rosidl_generator_py/geographic_msgs/_geographic_msgs_s.ep.rosidl_typesupport_introspection_c.c.o
[100%] Linking C shared library rosidl_generator_py/geographic_msgs/geographic_msgs_s__rosidl_typesupport_introspection_c.cpython-36m-aarch64-linux-gnu.so
[100%] Built target geographic_msgs__rosidl_typesupport_introspection_c__pyext
Aborted  <<< geographic_msgs [7min 3s]
[ 40%] Linking CXX shared library libdiagnostic_aggregator.so
[ 40%] Built target diagnostic_aggregator
[ 40%] Built target ament_cmake_python_symlink_diagnostic_aggregator
[ 50%] Building CXX object CMakeFiles/aggregator_node.dir/src/aggregator_node.cpp.o
[ 60%] Linking CXX executable aggregator_node
[ 60%] Built target aggregator_node
running egg_info
creating diagnostic_aggregator.egg-info
writing diagnostic_aggregator.egg-info/PKG-INFO
writing dependency_links to diagnostic_aggregator.egg-info/dependency_links.txt
writing top-level names to diagnostic_aggregator.egg-info/top_level.txt
writing manifest file 'diagnostic_aggregator.egg-info/SOURCES.txt'
reading manifest file 'diagnostic_aggregator.egg-info/SOURCES.txt'
writing manifest file 'diagnostic_aggregator.egg-info/SOURCES.txt'
[ 60%] Built target ament_cmake_python_build_diagnostic_aggregator_egg
[ 70%] Building CXX object CMakeFiles/diagnostic_aggregator_analyzers.dir/src/generic_analyzer.cpp.o
[ 90%] Building CXX object CMakeFiles/diagnostic_aggregator_analyzers.dir/src/ignore_analyzer.cpp.o
[ 90%] Building CXX object CMakeFiles/diagnostic_aggregator_analyzers.dir/src/discard_analyzer.cpp.o
[100%] Linking CXX shared library libdiagnostic_aggregator_analyzers.so
[100%] Built target diagnostic_aggregator_analyzers
Aborted  <<< diagnostic_aggregator [3min 43s]

Summary: 35 packages finished [8min 50s]
  1 package failed: self_test
  2 packages aborted: diagnostic_aggregator geographic_msgs
  17 packages had stderr output: ament_clang_format ament_clang_tidy ament_copyright ament_cppcheck ament_cpplint ament_flake8 ament_lint ament_lint_cmake ament_mypy ament_pclint ament_pep257 ament_pycodestyle ament_pyflakes ament_uncrustify ament_xmllint self_test xacro
  1 package not processed
The command '/bin/bash -c source /opt/ros/$ROS_DISTRO/install/setup.bash &&   colcon build --parallel-workers $(nproc) --symlink-install   --event-handlers console_direct+ --base-paths src   --cmake-args ' -DCMAKE_BUILD_TYPE=Release'   ' -DCMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs'   ' -DCMAKE_CXX_FLAGS="-Wl,--allow-shlib-undefined"'   ' --no-warn-unused-cli'' returned a non-zero code: 2

Hi @sanjeevkm1998
Welcome to the Stereolabs community.

You can find examples of Dockerfiles to be used with the ZED ROS2 Wrapper in the docker folder of the GitHub repository.

For more information, you can also read our online documentation.

Hello @Myzhar,

Thank you for your response!
I have successfully built a Docker image using the zed-ros2-wrapper package on top of the dustynv/ros:humble-ros-base-l4t-r35.1.0 Docker image, and it was working fine on the Jetson Xavier NX. However, I am now attempting to build a Docker image using the zed-ros2-wrapper package on top of the dustynv/ros:humble-pytorch-l4t-r32.7.1 Docker image. This is because the dustynv/ros:humble-pytorch-l4t-r32.7.1 Docker image is supported on the Jetson Nano.

According to the log that you posted above, you have a problem compiling ROS 2 Humble packages.

Can you post your Dockerfile?

I fixed by using gcc/g+±11 for compiling instead of the default gcc/g+±7.
Also having changed the versions to the latest available humble tagged versions.

1 Like

Hey, can you please share your dockerfile, i was able to get the zed working with l4t35 on Jetson nano but I couldn’t get the body tracking to work because the SDK was corrupted. Using l4t32 should solve the problem but I am getting errors like yours and I am not sure how to change gcc version.

@sanjeevkm1998 Is it possible you could share your Dockerfile to use ROS2-Wrapper for Jetson Nano. I still have not got a working docker image for a Jetson Nano with ROS2, Cuda, ZED ROS2 Wrapper. There is always some issue I run into.

Add the following command to your Dockerfile to upgrade the GCC version.

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7 \
&& update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 7 \
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11 \
&& update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 11 \
&& update-alternatives --set gcc "/usr/bin/gcc-11" \
&& update-alternatives --set g++ "/usr/bin/g++-11" \
1 Like

For anyone else trying to get it all to work. Here is a complete Dockerfile:
https://github.com/ricoai/jetson_ros2_humble_zed_wrapper

This will allow you to run ROS2 ZED Wrapper on a Jetson Nano so you can use a Zed or Zed Mini camera on a Jetson Nano.

2 Likes