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