鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    在学习第七章-添加语音播报功能时遇到并尝试解决.venv无法被找到的问题

    已定时 已固定 已锁定 已移动
    学习资源
    第七章 虚拟环境 no module named modulenotfound 语音播报
    1
    2
    580
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • R
      ros_learner
      最后由 ros_learner 编辑

      前置条件:构建成功

      $ colcon build
      Starting >>> autopatrol_interfaces
      Starting >>> autopatrol_robot
      Starting >>> fishbot_application
      Starting >>> fishbot_application_cpp
      Starting >>> fishbot_description
      Starting >>> fishbot_navigation2
      Finished <<< fishbot_description [1.60s]                                                            
      Finished <<< fishbot_navigation2 [1.62s]
      Finished <<< autopatrol_robot [2.25s]                                                                    
      Finished <<< fishbot_application [2.28s]
      Finished <<< fishbot_application_cpp [2.32s]                                                                        
      Finished <<< autopatrol_interfaces [2.68s]                     
      
      Summary: 6 packages finished [3.03s]
      

      我的开发环境结构如下:
      3923e4ef-2540-4d37-acaf-9b33668f4d35-图片.png
      .venv目录即是我的python虚拟环境。
      命令行运行which python可以正确显示虚拟环境中的可执行文件

      $ which python
      /home/yldu/ros2bookcode/chapt7/chapt7_ws/.venv/bin/python
      

      接下来,在运行ros2 run autopatrol_robot speaker 时会提示找不到torch

      $ ros2 run autopatrol_robot speaker
      Traceback (most recent call last):
        File "/home/yldu/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_robot/lib/autopatrol_robot/speaker", line 33, in <module>
          sys.exit(load_entry_point('autopatrol-robot==0.0.0', 'console_scripts', 'speaker')())
        File "/home/yldu/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_robot/lib/autopatrol_robot/speaker", line 25, in importlib_lo
      ad_entry_point                                                                                                                       return next(matches).load()
        File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load
          module = import_module(match.group('module'))
        File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
          return _bootstrap._gcd_import(name[level:], package, level)
        File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
        File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
        File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
        File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
        File "<frozen importlib._bootstrap_external>", line 883, in exec_module
        File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
        File "~/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_robot/lib/python3.10/site-packages/autopatrol_robot/speaker.py", line 5, in <module>                                                                                                              import torch
      ModuleNotFoundError: No module named 'torch'
      [ros2run]: Process exited with failure 1
      

      因为我使用了其他语音引擎,因此提示的错误是找不到torch,如果按照课本上的代码会提示找不到espeakng。
      打开install/autopatrol_robot/lib/autopatrol_robot/speaker文件,发现第文件头部Shebang(也称 Hashbang)‌ 行为#!/usr/bin/python3

      #!/usr/bin/python3
      # EASY-INSTALL-ENTRY-SCRIPT: 'autopatrol-robot==0.0.0','console_scripts','speaker'
      import re
      import sys
      

      这就与预期不符了,因为我在构建时,虚拟环境已经加载,按说构建后的文件应该使用我虚拟环境中的python。怎么说也不应该使用/usr/bin/python3。
      于是我按照小鱼以前说过的动手学ROS2排查$PYTHONPATH

      (.venv) yldu@ros2:~$ echo $PYTHONPATH
      /home/yldu/ros2bookcode/chapt7/chapt7_ws/install/fishbot_application/lib/python3.10/site-packages:/home/yldu/ros2bookcode/chapt7/
      chapt7_ws/install/autopatrol_robot/lib/python3.10/site-packages:/home/yldu/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_interfaces/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages                                                                                                                                
      

      没有问题,因为在激活虚拟环境的终端中,应该被包含的包一定存在,否则也不会构建成功。
      但是,在虚拟环境之外执行上面的命令

      yldu@ros2:~$ which python
      /usr/bin/python
      yldu@ros2:~$ echo $PYTHONPATH
      /opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages
      

      显然包含torch的目录没有被包含。也正因为如此,运行时报错了。
      好了,问题找到了,接下来就要尝试修复了。
      我尝试过把包含torch的目录手动增加到环境变量PYTHONPATH里,发现并不好使,我觉得是因为/usr/bin/python3并不会去搜索虚拟环境下的包。
      最近借用各种搜索工具和AI软件分析了很长时间都没弄好。
      今天,抱着试试看的态度,我尝试手动把install/autopatrol_robot/lib/autopatrol_robot/speaker 的‌Shebang行的python路径修改为我虚拟环境下的python:

      #!/home/yldu/ros2bookcode/chapt7/chapt7_ws/.venv/bin/python
      # EASY-INSTALL-ENTRY-SCRIPT: 'autopatrol-robot==0.0.0','console_scripts','speaker'
      import re
      import sys
      

      神奇的是居然可以运行成功了!

      (.venv) yldu@ros2:~/ros2bookcode/chapt7/chapt7_ws$ ros2 run autopatrol_robot speaker 
      Fetching 4 files: 100%|█████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00, 74898.29it/s]
      [INFO] [1773645156.986453996] [speaker]: json_path:/home/yldu/ros2bookcode/chapt7/cache file: chapt7_ws/src/autopatrol_robot/cache/sound.json
      [INFO] [1773645156.987298824] [speaker]: cache:[{'key': '正在初始化位置', 'file': '正在初始化位置.wav'}, {'key': '位置初始化完成', 'file': '位置初始化完成.wav'}, {'key': '准备前往第1个目标点', 'file': '准备前往第1个目标点.wav'}, {'key': '已到达第1个目标点,准备记录图像', 'file': '已到达第1个目标点,准备记录图像.wav'}, {'key': '完成', 'file': '完成.wav'}, {'key': '图像记录完成', 'file': '图像记录完成.wav'}, {'key': '准备前往第2个目标点', 'file': '准备前往第2个目标点.wav'}, {'key': '已到达第2个目标点,准备记录图像', 'file': '已到达第2个目标点,准备记录图像.wav'}, {'key': '准备前往第3个目标点', 'file': '准备前往第3个目标点.wav'}, {'key': '已到达第3个目标点,准备记录图像', 'file': '已到达第3个目标点,准备记录图像.wav'}, {'key': '准备前往第4个目标点', 'file': '准备前往第4个目标点.wav'}, {'key': '已到达第4个目标点,准备记录图像', 'file': '已到达第4个目标点,准备记录图像.wav'}, {'key': '准备前往第5个目标点', 'file': '准备前往第5个目标点.wav'}, {'key': '已到达第5个目标点,准备记录图像', 'file': '已到达第5个目标点,准备记录图像.wav'}]
      [INFO] [1773645156.987863848] [speaker]: 语音服务初始化完成
      

      以上算是给遇到类似问题的小伙伴们提供一个临时解决此问题的方案,但是缺点也很明显,每次使用colcon build重新构建项目后都需要去手动修改install目录文件的 ‌Shebang行。

      因为对colcon构建工具不很精通,我认为需要给它加上某些参数才能构建生成目标包。接下来我会继续研究着一块内容。

      如果有知道彻底解决办法的小伙伴也请不吝赐教,提前再此谢过。

      R 1 条回复 最后回复 回复 引用 0
      • R
        ros_learner @ros_learner
        最后由 编辑

        @ros_learner
        补充一点:
        在我的项目中,虽然使用ros2 run 无法运行节点,但是在launch文件中运行是正常的。但是我不知道原因。唉,这该死的求知欲。

        (.venv) yldu@ros2:~/ros2bookcode/chapt7/chapt7_ws$ ros2 launch autopatrol_robot autopatrol.launch.py 
        [INFO] [launch]: All log files can be found below /home/yldu/.ros/log/2026-03-16-16-30-49-283834-fpqc-ros2-81778
        [INFO] [launch]: Default logging verbosity is set to INFO
        [INFO] [patrol_node-1]: process started with pid [81781]
        [INFO] [speaker-2]: process started with pid [81783]
        [patrol_node-1] [INFO] [1773649851.420133849] [patrol_node]: 语合成服务未上线,等待中。。。
        [patrol_node-1] [INFO] [1773649852.422847601] [patrol_node]: 语合成服务未上线,等待中。。。
        [patrol_node-1] [INFO] [1773649853.425651579] [patrol_node]: 语合成服务未上线,等待中。。。
        [patrol_node-1] [INFO] [1773649854.427882038] [patrol_node]: 语合成服务未上线,等待中。。。
        [patrol_node-1] [INFO] [1773649855.429960698] [patrol_node]: 语合成服务未上线,等待中。。。
        Fetching 4 files: 100%|██████████| 4/4 [00:00<00:00, 88301.14it/s]
        [speaker-2] '(ReadTimeoutError("HTTPSConnectionPool(host='hf-mirror.com', port=443): Read timed out. (read timeout=10)"), '(Request ID: 0f87d586-c460-487e-896e-2550f42620e6)')' thrown while requesting HEAD https://hf-mirror.com/Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice/resolve/main/chat_template.jinja
        [speaker-2] Retrying in 1s [Retry 1/5].
        [speaker-2] [INFO] [1773649967.910855302] [speaker]: json_path:/home/yldu/ros2bookcode/chapt7/chapt7_ws/src/autopatrol_robot/cache/sound.json
        [speaker-2] [INFO] [1773649967.911412554] [speaker]: cache:[{'key': '正在初始化位置', 'file': '正在初始化位置.wav'}, {'key': '位置初始化完成', 'file': '位置初始化完成.wav'}, {'key': '准备前往第1个目标点', 'file': '准备前往第1个目标点.wav'}, {'key': '已到达第1个目标点,准备记录图像', 'file': '已到达第1个目标点,准备记录图像.wav'}, {'key': '图像记录完成', 'file': '图像记录完成.wav'}, {'key': '准备前往第2个目标点', 'file': '准备前往第2个目标点.wav'}, {'key': '已到达第2个目标点,准备记录图像', 'file': '已到达第2个目标点,准备记录图像.wav'}, {'key': '准备前往第3个目标点', 'file': '准备前往第3个目标点.wav'}, {'key': '已到达第3个目标点,准备记录图像', 'file': '已到达第3个目标点,准备记录图像.wav'}, {'key': '准备前往第4个目标点', 'file': '准备前往第4个目标点.wav'}, {'key': '已到达第4个目标点,准备记录图像', 'file': '已到达第4个目标点,准备记录图像.wav'}, {'key': '准备前往第5个目标点', 'file': '准备前往第5个目标点.wav'}, {'key': '已到达第5个目标点,准备记录图像', 'file': '已到达第5个目标点,准备记录图像.wav'}]
        [speaker-2] [INFO] [1773649967.911753839] [speaker]: 语音服务初始化完成
        [speaker-2] [INFO] [1773649967.912593998] [speaker]: 正在朗读 正在初始化位置
        [speaker-2] [INFO] [1773649967.912979030] [speaker]: Playing cached audio for text: 正在初始化位置
        [patrol_node-1] [INFO] [1773649970.601738518] [patrol_node]: 语音合成成功:正在初始化位置
        
        1 条回复 最后回复 回复 引用 0
        • 第一个帖子
          最后一个帖子
        皖ICP备16016415号-7
        Powered by NodeBB | 鱼香ROS