解决 ROS 2 Jazzy 在 Zsh 中自动补全问题

发布于:2024-12-07 ⋅ 阅读:(49) ⋅ 点赞:(0)

解决 ROS 2 Jazzy 在 Zsh 中自动补全问题

** 问题描述**

在使用 ROS 2 Jazzy 和 Zsh 时,遇到了以下问题:

  • ROS 2 的 ros2 runros2 launch 命令无法自动补全节点名和其他内容。
  • 每次打开新的终端时,必须手动执行 source /opt/ros/jazzy/setup.zsh 才能正常使用补全功能。
  • 初始配置文件中存在问题,导致环境变量未正确加载。

** 问题代码**

分别来自 setup.zsh.zshrc

setup.zsh

# argcomplete for ros2 & colcon
eval "$(register-python-argcomplete3 ros2)"
eval "$(register-python-argcomplete3 colcon)"

问题原因:

  • register-python-argcomplete3 是旧版本 argcomplete 的命令,而当前 argcomplete 版本中只提供 register-python-argcomplete

zshrc

# ROS 2 autocompletion
 eval "$(register-python-argcomplete3 ros2)"
 eval "$(register-python-argcomplete3 colcon)"

# Source ROS 2 setup
source /opt/ros/jazzy/setup.zsh

原因

以下是导致问题的核心点及解决思路:

  1. 自动补全未生效的原因
    • 使用了废弃的 register-python-argcomplete3
    • 终端启动时,加载 ROS 2 环境变量和补全脚本顺序错误
  2. 解决方法
    • setup.zsh 中的 register-python-argcomplete3 替换为 register-python-argcomplete
    • .zshrc 中显式加载 ROS 2 环境,并启用自动补全功能。

正确的代码

setup.zsh

# argcomplete for ros2 & colcon
eval "$(register-python-argcomplete ros2)"
eval "$(register-python-argcomplete colcon)"

zshrc

# Source ROS 2 setup
source /opt/ros/jazzy/setup.zsh
source ~/ros2_ws/install/setup.zsh
source ~/d2lros2/chapt8_ws/install/setup.zsh

# Activate ROS 2 conda environment
conda activate ros2

# ROS 2 autocompletion
eval "$(register-python-argcomplete ros2)"
eval "$(register-python-argcomplete colcon)"

检查结果

  1. 打开新的终端后,无需手动执行 source,自动补全功能(如 ros2 runros2 launch)立即生效。

  2. 检查ROS 2 的环境变量

    • $AMENT_PREFIX_PATH
      $PATH
      
    • echo $AMENT_PREFIX_PATH
      # 输出示例:
      # /home/dw/d2lros2/chapt8_ws/install/fishbot_description:/home/dw/ros2_ws/install/my_robot_controller:/opt/ros/jazzy
      
      echo $PATH
      # 输出示例:
      # /opt/ros/jazzy/bin:/home/dw/anaconda3/envs/ros2/bin:/home/dw/anaconda3/condabin:...