Importing error in ROS2 Rosject: ROS2 Basics in 5 Days (Python)

Hi,
I am working on the odom_recorder action node. I implemented my action server according to the tutorial and I get a long error. I tried to read and solve it, but I was not able to find the problem. According to the error it points out importing errors. First, I was having problems while building my custom_interfaces package for my custom action. The following topic help me solve that problem:

Maybe it is something related to that, thanks for your help.

My code is the following:

import rclpy

from rclpy.action import ActionServer
from rclpy.node import Node
from rclpy.qos import ReliabilityPolicy, QoSProfile
from rclpy.executors import MultiThreadedExecutor, SingleThreadedExecutor
from rclpy.callback_groups import ReentrantCallbackGroup, MutuallyExclusiveCallbackGroup

from geometry_msgs.msg import Point
from geometry_msgs.msg import Twist
from nav_msgs.msg import Odometry
from custom_interfaces.action import OdomRecord

import time
import numpy as np

class OdomRecordServer(Node):

    def __init__(self):
        super().__init__('record_odom_server')
        
        self.group1 = ReentrantCallbackGroup()
        self.group2 = ReentrantCallbackGroup()
        
        self._action_server = ActionServer(self, 
            OdomRecord, 
            'record_odom',
            self.action_callback,
            callback_group=self.group1)

        self.odom_subscriber_ = self.create_subscription(
            Odometry,
            '/odom',
            self.odom_callback,
            QoSProfile(depth=10, reliability=ReliabilityPolicy.RMW_QOS_POLICY_RELIABILITY_RELIABLE),
            callback_group=self.group2)
        
        self.last_odom = Point()
        self.first_odom = Point()
        self.first_odom_identified = False
        self.total_distance = 0.0
        self.odom_record = []
    
    def action_callback(self, goal_handle):
        
        self.get_logger().info('Executing goal...')

        feedback_msg = OdomRecord.Feedback()
        lap_finished = False
        last_odom = self.get_odom()
        self.odom_record.append(last_odom)
        while not lap_finished:
            time.sleep(1)
            current_odom = self.get_odom()
            self.total_distance += np.sqrt((current_odom.x - last_odom.x)**2 + (current_odom.y - last_odom.y)**2)            
            self.get_logger().info('Current distance feedback: "%s"' % str(self.total_distance))
            feedback_msg.current_total = self.total_distance
            goal_handle.publish_feedback(feedback_msg)
            self.odom_record.append(current_odom)

            distance_to_start = np.sqrt((self.first_odom.x - current_odom.x)**2 + (self.first_odom.y - current_odom.y)**2)
            
            if distance_to_start < 0.05:
                lap_finished = True
            else:
                last_odom = current_odom
            
        goal_handle.succeed()

        result = OdomRecord.Result()
        result.list_of_odoms = self.odom_record
        self.get_logger().info('The Action Server has finished, it has recorded: "%s" points' % str(len(self.odom_record)))
        return result
    
    def odom_callback(self, msg):
        # print the log info in the terminal
        x = msg.pose.pose.position.x
        y = msg.pose.pose.position.y    
        if not self.first_odom_identified:
            self.first_odom_identified = True
            self.first_odom.x = x
            self.first_odom.y = y
        else:
            self.last_odom.x = x
            self.last_odom.y = y
    
    def get_odom(self):
        return self.last_odom
            

def main(args=None):
    rclpy.init(args=args)
    odom_recorder_node = OdomRecordServer()
    # Create a MultiThreadedExecutor with 3 threads
    executor = MultiThreadedExecutor(num_threads=3)
    # Add the node to the executor
    executor.add_node(odom_recorder_node)
    try:
        # Spin the executor
        executor.spin()
    finally:
        # Shutdown the executor
        executor.shutdown()
        odom_recorder_node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

When I launched the action server node, I got the following error:

[INFO] [launch]: All log files can be found below /home/user/.ros/log/2023-01-31-00-14-50-439459-4_xterm-4343
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [odom_recorder_server-1]: process started with pid [4422]
[odom_recorder_server-1] Traceback (most recent call last):
[odom_recorder_server-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rosidl_generator_py/import_type_support_impl.py", line 46, in import_type_support
[odom_recorder_server-1]     return importlib.import_module(module_name, package=pkg_name)
[odom_recorder_server-1]   File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
[odom_recorder_server-1]     return _bootstrap._gcd_import(name[level:], package, level)
[odom_recorder_server-1]   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
[odom_recorder_server-1]   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
[odom_recorder_server-1]   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
[odom_recorder_server-1]   File "<frozen importlib._bootstrap>", line 657, in _load_unlocked
[odom_recorder_server-1]   File "<frozen importlib._bootstrap>", line 556, in module_from_spec
[odom_recorder_server-1]   File "<frozen importlib._bootstrap_external>", line 1166, in create_module
[odom_recorder_server-1]   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[odom_recorder_server-1] ImportError: /home/user/ros2_ws/install/custom_interfaces/lib/libcustom_interfaces__rosidl_generator_c.so: undefined symbol: geometry_msgs__msg__Point__Sequence__init
[odom_recorder_server-1]
[odom_recorder_server-1] During handling of the above exception, another exception occurred:
[odom_recorder_server-1]
[odom_recorder_server-1] Traceback (most recent call last):
[odom_recorder_server-1]   File "/home/user/ros2_ws/install/wall_follower/lib/wall_follower/odom_recorder_server", line 33, in <module>
[odom_recorder_server-1]     sys.exit(load_entry_point('wall-follower==0.0.0', 'console_scripts', 'odom_recorder_server')())
[odom_recorder_server-1]   File "/home/user/ros2_ws/install/wall_follower/lib/python3.8/site-packages/wall_follower/odom_recorder.py", line 94, in main
[odom_recorder_server-1]     odom_recorder_node = OdomRecordServer()
[odom_recorder_server-1]   File "/home/user/ros2_ws/install/wall_follower/lib/python3.8/site-packages/wall_follower/odom_recorder.py", line 26, in __init__
[odom_recorder_server-1]     self._action_server = ActionServer(self,
[odom_recorder_server-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/action/server.py", line 249, in __init__
[odom_recorder_server-1]     check_for_type_support(action_type)
[odom_recorder_server-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/type_support.py", line 29, in check_for_type_support
[odom_recorder_server-1]     msg_type.__class__.__import_type_support__()
[odom_recorder_server-1]   File "/home/user/ros2_ws/install/custom_interfaces/lib/python3.8/site-packages/custom_interfaces/action/_odom_record.py", line 1162, in __import_type_support__
[odom_recorder_server-1]     module = import_type_support('custom_interfaces')
[odom_recorder_server-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rosidl_generator_py/import_type_support_impl.py", line 48, in import_type_support
[odom_recorder_server-1]     raise UnsupportedTypeSupport(pkg_name)
[odom_recorder_server-1] rosidl_generator_py.import_type_support_impl.UnsupportedTypeSupport: Could not import 'rosidl_typesupport_c' for package 'custom_interfaces'
[odom_recorder_server-1] Exception ignored in: <function ActionServer.__del__ at 0x7f0cbf7d25e0>
[odom_recorder_server-1] Traceback (most recent call last):
[odom_recorder_server-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/action/server.py", line 633, in __del__
[odom_recorder_server-1]     self.destroy()
[odom_recorder_server-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/action/server.py", line 620, in destroy
[odom_recorder_server-1]     if self._handle is None:
[odom_recorder_server-1] AttributeError: 'ActionServer' object has no attribute '_handle'
[ERROR] [odom_recorder_server-1]: process has died [pid 4422, exit code 1, cmd '/home/user/ros2_ws/install/wall_follower/lib/wall_follower/odom_recorder_server --ros-args'].

Kind regards,
Ronaldo

Hi @w.ronaldo.cd ,

To solve this error, please post your OdomRecord.action message file.
I am sure the error is because you may have used geometry_msgs/msg/Point[] instead of geometry_msgs/Point32[].

You are getting this error because of the previous error. Your custom action message (interface) did not get compiled properly.

So post the following files (as a code-block):

  1. Your custom action interface definition (your action message file OdomRecord.action).
  2. Your CMakeLists.txt file for your custom interfaces package.
  3. Your package.xml file.

I can look into it and provide you the fixes.

Regards,
Girish

1 Like

Hi,
The error is longer than what I posted before:

[wall_finder-1] Traceback (most recent call last):
[wall_finder-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rosidl_generator_py/import_type_support_impl.py", line 46, in import_type_support
[wall_finder-1]     return importlib.import_module(module_name, package=pkg_name)
[wall_finder-1]   File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
[wall_finder-1]     return _bootstrap._gcd_import(name[level:], package, level)
[wall_finder-1]   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
[wall_finder-1]   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
[wall_finder-1]   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
[wall_finder-1]   File "<frozen importlib._bootstrap>", line 657, in _load_unlocked
[wall_finder-1]   File "<frozen importlib._bootstrap>", line 556, in module_from_spec
[wall_finder-1]   File "<frozen importlib._bootstrap_external>", line 1166, in create_module
[wall_finder-1]   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[wall_finder-1] ImportError: /home/user/ros2_ws/install/custom_interfaces/lib/libcustom_interfaces__rosidl_generator_c.so: undefined symbol: geometry_msgs__msg__Point32__Sequence__init
[wall_finder-1]
[wall_finder-1] During handling of the above exception, another exception occurred:
[wall_finder-1]
[wall_finder-1] Traceback (most recent call last):
[wall_finder-1]   File "/home/user/ros2_ws/install/wall_follower/lib/wall_follower/wall_finder", line 33, in <module>
[wall_finder-1]     sys.exit(load_entry_point('wall-follower==0.0.0', 'console_scripts', 'wall_finder')())
[wall_finder-1]   File "/home/user/ros2_ws/install/wall_follower/lib/python3.8/site-packages/wall_follower/wall_finder.py", line 186, in main
[wall_finder-1]     wall_finder_node = WallFinder()
[wall_finder-1]   File "/home/user/ros2_ws/install/wall_follower/lib/python3.8/site-packages/wall_follower/wall_finder.py", line 42, in __init__
[wall_finder-1]     self.wall_finder_srv = self.create_service(
[wall_finder-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/node.py", line 1295, in create_service
[wall_finder-1]     check_for_type_support(srv_type)
[wall_finder-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/type_support.py", line 29, in check_for_type_support
[wall_finder-1]     msg_type.__class__.__import_type_support__()
[wall_finder-1]   File "/home/user/ros2_ws/install/custom_interfaces/lib/python3.8/site-packages/custom_interfaces/srv/_find_wall.py", line 235, in __import_type_support__
[wall_finder-1]     module = import_type_support('custom_interfaces')
[wall_finder-1]   File "/opt/ros/foxy/lib/python3.8/site-packages/rosidl_generator_py/import_type_support_impl.py", line 48, in import_type_support
[wall_finder-1]     raise UnsupportedTypeSupport(pkg_name)
[wall_finder-1] rosidl_generator_py.import_type_support_impl.UnsupportedTypeSupport: Could not import 'rosidl_typesupport_c' for package 'custom_interfaces'
[ERROR] [odom_recorder_server-2]: process has died [pid 26685, exit code 1, cmd '/home/user/ros2_ws/install/wall_follower/lib/wall_follower/odom_recorder_server --ros-args'].
[ERROR] [wall_finder-1]: process has died [pid 26683, exit code 1, cmd '/home/user/ros2_ws/install/wall_follower/lib/wall_follower/wall_finder --ros-args'].
[wall_follower-3] Traceback (most recent call last):
[wall_follower-3]   File "/opt/ros/foxy/lib/python3.8/site-packages/rosidl_generator_py/import_type_support_impl.py", line 46, in import_type_support
[wall_follower-3]     return importlib.import_module(module_name, package=pkg_name)
[wall_follower-3]   File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
[wall_follower-3]     return _bootstrap._gcd_import(name[level:], package, level)
[wall_follower-3]   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
[wall_follower-3]   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
[wall_follower-3]   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
[wall_follower-3]   File "<frozen importlib._bootstrap>", line 657, in _load_unlocked
[wall_follower-3]   File "<frozen importlib._bootstrap>", line 556, in module_from_spec
[wall_follower-3]   File "<frozen importlib._bootstrap_external>", line 1166, in create_module
[wall_follower-3]   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[wall_follower-3] ImportError: /home/user/ros2_ws/install/custom_interfaces/lib/libcustom_interfaces__rosidl_generator_c.so: undefined symbol: geometry_msgs__msg__Point32__Sequence__init
[wall_follower-3]
[wall_follower-3] During handling of the above exception, another exception occurred:
[wall_follower-3]
[wall_follower-3] Traceback (most recent call last):
[wall_follower-3]   File "/home/user/ros2_ws/install/wall_follower/lib/wall_follower/wall_follower", line 33, in <module>
[wall_follower-3]     sys.exit(load_entry_point('wall-follower==0.0.0', 'console_scripts', 'wall_follower')())
[wall_follower-3]   File "/home/user/ros2_ws/install/wall_follower/lib/python3.8/site-packages/wall_follower/wall_following.py", line 272, in main
[wall_follower-3]     wall_follower_node = WallFollower()
[wall_follower-3]   File "/home/user/ros2_ws/install/wall_follower/lib/python3.8/site-packages/wall_follower/wall_following.py", line 30, in __init__
[wall_follower-3]     self.wall_finder_client = self.create_client(FindWall,
[wall_follower-3]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/node.py", line 1248, in create_client
[wall_follower-3]     check_for_type_support(srv_type)
[wall_follower-3]   File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/type_support.py", line 29, in check_for_type_support
[wall_follower-3]     msg_type.__class__.__import_type_support__()
[wall_follower-3]   File "/home/user/ros2_ws/install/custom_interfaces/lib/python3.8/site-packages/custom_interfaces/srv/_find_wall.py", line 235, in __import_type_support__
[wall_follower-3]     module = import_type_support('custom_interfaces')
[wall_follower-3]   File "/opt/ros/foxy/lib/python3.8/site-packages/rosidl_generator_py/import_type_support_impl.py", line 48, in import_type_support
[wall_follower-3]     raise UnsupportedTypeSupport(pkg_name)
[wall_follower-3] rosidl_generator_py.import_type_support_impl.UnsupportedTypeSupport: Could not import 'rosidl_typesupport_c' for package 'custom_interfaces'
[ERROR] [wall_follower-3]: process has died [pid 26687, exit code 1, cmd '/home/user/ros2_ws/install/wall_follower/lib/wall_follower/wall_follower --ros-args'].

OdomRecord.action

---
geometry_msgs/Point32[] list_of_odoms
---
float32 current_total

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(custom_interfaces)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(action_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

rosidl_generate_interfaces(${PROJECT_NAME}
  "srv/FindWall.srv"
  "action/OdomRecord.action"
)

ament_package()

package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>custom_interfaces</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="w.ronaldo.cd@gmail.com">user</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>
  <depend>geometry_msgs</depend>
  <depend>action_msgs</depend>
  <depend>rosidl_default_generators</depend>

  
  <!-- <build_depend>rosidl_default_generators</build_depend> -->
  <exec_depend>rosidl_default_runtime</exec_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

Kind regards,
Ronaldo

Hi @w.ronaldo.cd ,

I checked your CMakeLists.txt file and package.xml file for your custom_interfaces package.
They look fine to me. But I do have one extra step that I can suggest.

Add this line in your CMakeLists.txt:

rosidl_generate_interfaces(${PROJECT_NAME}
  "srv/FindWall.srv"
  "action/OdomRecord.action"
  DEPENDENCIES std_msgs geometry_msgs action_msgs  # <--- add this line
)

I personally feel that line has no effect when you are using built-in packages, but you can give this a try.

Try this step and build and run your package again. If you get the same error, then post your package.xml file contents of your wall_follower package.

I hope the above step fixes your issue.

Regards,
Girish

Hi Girish,
Thanks, it is working now.
Kind regards

Hi @w.ronaldo.cd ,

Glad to know that it worked for you!

From now on I will remember to add it to all my custom packages for ROS2!
And likewise, you too remember this step!

Regards,
Girish

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.