You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:05:24