ROS2自定义服务导入报错:无法导入dof_filter(ImportError)
ROS2自定义服务导入ImportError问题解决
错误信息
bin/python3 /home/name/ros2_ws/src/dof_filter_service_pkg/dof_filter_service_pkg/service_server.py Traceback (most recent call last): File "/home/name/ros2_ws/src/dof_filter_service_pkg/dof_filter_service_pkg/service_server.py", line 7, in <module> from dof_filter_service_pkg import dof_filter ImportError: cannot import name 'dof_filter' from 'dof_filter_service_pkg' (/home/name/ros2_ws/install/dof_filter_service_pkg/lib/python3.10/site-packages/dof_filter_service_pkg/__init__.py)
相关文件内容
service_server.py代码结构
import rclpy import numpy as np import socket import time from rclpy.node import Node from dof_filter_service_pkg import dof_filter class ServiceServer(Node): def __init__(self): super().__init__('service_server') self.service = self.create_service(dof_filter, 'service_server_topic',self.service_callback)
dof_filter.srv(位于包内srv目录)
# service_client sends an empty request # number_of_samples is a fixed amount handled in service_server --- # Response message: float32 filtered_data
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>dof_filter_service_pkg</name> <version>0.0.0</version> <description>3-DOF ROS2 Package</description> <maintainer email="name@todo.todo">name</maintainer> <license>TODO: License declaration</license> <build_depend>rclpy</depend> <exec_depend>rclpy</exec_depend> <buildtool_depend>rosidl_default_generators</buildtool_depend> <exec_depend>rosidl_default_generators</exec_depend> <test_depend>ament_copyright</test_depend> <test_depend>ament_flake8</test_depend> <test_depend>ament_pep257</test_depend> <test_depend>python3-pytest</test_depend> <export> <build_type>ament_python</build_type> </export> </package>
环境信息:Ubuntu 22.04、ROS2 Humble、Python 3.10,文件路径src>dof_filter_service_pkg>dof_filter_service_pkg,已尝试colcon build、移动srv文件、修改导入路径但无效。
问题原因及解决步骤
1. 补全setup.py配置(核心缺失项)
ament_python类型的ROS2包必须在setup.py中声明服务文件路径,否则colcon build不会生成对应的Python接口。修改setup.py如下:
from setuptools import setup package_name = 'dof_filter_service_pkg' setup( name=package_name, version='0.0.0', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), # 新增:声明srv文件路径 ('share/' + package_name + '/srv', ['srv/dof_filter.srv']), ], install_requires=['setuptools'], zip_safe=True, maintainer='name', maintainer_email='name@todo.todo', description='3-DOF ROS2 Package', license='TODO: License declaration', tests_require=['pytest'], # 新增:确保srv文件被打包 package_data={ package_name: ['srv/*.srv'], }, entry_points={ 'console_scripts': [ 'service_server = dof_filter_service_pkg.service_server:main', ], }, )
2. 修正package.xml依赖
将运行时依赖的rosidl_default_generators替换为rosidl_default_runtime,并添加接口组声明:
<!-- 替换原exec_depend并新增内容 --> <build_depend>rosidl_default_generators</build_depend> <exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group>
3. 修正导入语句
ROS2生成的Python服务接口类名为驼峰式DofFilter,且位于srv子模块下,修改导入代码:
from dof_filter_service_pkg.srv import DofFilter
同时更新服务创建代码:
self.service = self.create_service(DofFilter, 'service_server_topic', self.service_callback)
4. 重新构建并刷新环境
# 清理旧构建产物 colcon clean --packages-select dof_filter_service_pkg # 重新构建指定包 colcon build --packages-select dof_filter_service_pkg # 刷新环境变量 source install/setup.bash
5. 正确运行节点
使用ROS2官方命令运行,避免直接执行脚本:
ros2 run dof_filter_service_pkg service_server
内容的提问来源于stack exchange,提问作者pomegranateman
相关产品推荐
相关产品推荐

