在ROS Melodic环境中配置Python 3.6并运行Gazebo脚本的详细教程 在ROS Melodic环境中配置Python 3.6并运行Gazebo脚本的详细教程 一、问题背景与初始错误分析 1.1 错误现象 当尝试在Python 2.7环境下运行包含f-string语法的Gazebo脚本时,系统会抛出以下错误:
1 2 3 4 SyntaxError: invalid syntax   File "/home/bobac3/gazebo/gazebo_test_ws/src/gazebo_pkg/script/random_model_for_room.py" , line 43     {"name_prefix" : "fruit_board_" , "path" : f"/home/bobac3/.gazebo/models/{random.choice(fruit_board_folders)}/model.sdf" },                                                                                                                         ^ 
1.2 错误原因 f-string语法是Python 3.6及以上版本的特性 ROS Melodic默认使用Python 2.7环境 需要在不修改原代码的前提下,将运行环境切换至Python 3.6 二、环境准备:安装与切换Python 3.6 2.1 检查系统已安装的Python版本 1 2 3 4 5 6 7 8 9 10 11 ls  /usr/bin/python*which  python3.6
2.2 安装Python 3.6(若未安装) 2.2.1 Ubuntu/Debian系统安装方法 1 2 3 4 5 6 7 8 9 10 11 12 sudo  add-apt-repository ppa:deadsnakes/ppasudo  apt updatesudo  apt install python3.6 python3.6-venvpython3.6 --version 
2.2.2 CentOS/RHEL系统安装方法 1 2 3 4 5 6 7 8 9 10 11 12 sudo  yum install centos-release-sclsudo  yum install rh-python36scl enable  rh-python36 bash python --version 
2.3 创建并管理Python 3.6虚拟环境 2.3.1 创建独立虚拟环境 1 2 3 4 5 6 7 8 9 python3.6 -m venv ~/gazebo/venv_py36 
2.3.2 激活虚拟环境 1 2 3 4 5 6 7 8 source  ~/gazebo/venv_py36/bin/activatedeactivate 
2.3.3 验证Python版本 1 2 3 4 5 6 7 python --version pip --version 
三、配置ROS Melodic与Python 3.6兼容 3.1 安装ROS Python 3依赖包 1 2 3 4 5 6 7 sudo  apt install python3-catkin-pkg-modules python3-rospkg-modules python3-empy
3.2 重新编译catkin工作空间 3.2.1 清除旧编译文件 1 2 3 4 5 6 7 cd  ~/gazebo/gazebo_test_wscatkin clean 
3.2.2 配置Python 3.6路径 1 2 3 4 5 6 7 8 9 10 catkin config --cmake-args \   -DPYTHON_EXECUTABLE=~/gazebo/venv_py36/bin/python \   -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \   -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so 
3.2.3 重新编译工作空间 3.3 激活工作空间与Python环境 1 2 3 4 5 6 7 8 9 source  ~/gazebo/gazebo_test_ws/devel/setup.bashsource  ~/gazebo/venv_py36/bin/activateecho  $ROS_PYTHON_VERSION 
四、安装脚本依赖包 4.1 安装基础依赖 1 2 3 4 5 6 7 8 9 pip install pyyaml rospkg catkin_pkg empy wheel 
4.2 解决empy安装问题(常见错误处理) 4.2.1 错误现象 1 2 3 Building wheels for  collected packages: empy   Running setup.py bdist_wheel for  empy ... error   error: invalid command  'bdist_wheel'  
4.2.2 解决方案 1 2 3 4 5 6 7 8 9 10 11 12 pip install --upgrade setuptools pip pip uninstall -y empy pip install empy python -c "import em; print(em.__version__)"  
五、运行脚本与解决文件路径问题 5.1 运行脚本与错误定位 1 2 3 4 5 6 7 8 9 10 python ~/gazebo/gazebo_test_ws/src/gazebo_pkg/script/random_model_for_room.py Traceback (most recent call last):   File ".../random_model_for_room.py" , line 51, in  <module>     for  config in  model_configs   File ".../random_model_for_room.py" , line 14, in  load_model     with open(model_path, 'r' ) as model_file: FileNotFoundError: [Errno 2] No such file or directory: '/home/bobac3/.gazebo/models/fruit2_board/model.sdf'  
5.2 解决模型文件缺失问题 5.2.1 检查模型文件存在性 1 2 3 4 5 6 7 8 ls  -la ~/.gazebo/models/fruit2_board/model.sdfls  ~/.gazebo/models | grep "fruit.*board" 
5.2.2 修改代码添加路径验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import  osdef  load_model (model_path ):         if  not  os.path.exists(model_path):         rospy.logerr(f"错误:模型文件不存在 - {model_path} " )         return  None         try :         with  open (model_path, 'r' ) as  model_file:             return  model_file.read()     except  Exception as  e:         rospy.logerr(f"加载模型失败:{str (e)} " )         return  None  
5.2.3 更新模型配置列表 1 2 3 4 5 6 7 8 9 model_configs = [     {         "name_prefix" : "fruit_board_" ,                  "path" : f"/home/bobac3/.gazebo/models/{random.choice(['fruit1_board' , 'fruit3_board' ])} /model.sdf"      },      ] 
5.2.4 设置Gazebo模型路径(可选) 1 2 3 4 5 6 export  GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH :~/custom_modelsimport os os.environ["GAZEBO_MODEL_PATH" ] = "~/custom_models:"  + os.environ.get("GAZEBO_MODEL_PATH" , "" ) 
六、优化工作流程与便捷操作 6.1 创建环境激活脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 nano ~/gazebo/activate_ros_py36.sh source  ~/gazebo/venv_py36/bin/activatesource  ~/gazebo/gazebo_test_ws/devel/setup.bashexport  ROS_PYTHON_VERSION=3echo  "=====================================" echo  "  Python 3.6环境与ROS Melodic已激活" echo  "  当前Python版本: $(python --version) " echo  "  ROS工作空间: ~/gazebo/gazebo_test_ws" echo  "=====================================" chmod  +x ~/gazebo/activate_ros_py36.sh./activate_ros_py36.sh 
6.2 使用roslaunch运行脚本 6.2.1 创建launch文件 1 2 3 4 5 mkdir  -p ~/gazebo/gazebo_test_ws/src/gazebo_pkg/launchnano ~/gazebo/gazebo_test_ws/src/gazebo_pkg/launch/random_model.launch 
6.2.2 编写launch文件内容 1 2 3 4 5 6 7 8 9 10 11 12 <launch >      <node        name ="random_model_generator"      pkg ="gazebo_pkg"      type ="random_model_for_room.py"      output ="screen"         <!--  可选 :设置环境变量  -- >     env="ROS_PYTHON_VERSION=3"   /> </launch > 
6.2.3 编译并运行launch文件 1 2 3 4 5 6 7 cd  ~/gazebo/gazebo_test_wscatkin build source  ~/gazebo/activate_ros_py36.shroslaunch gazebo_pkg random_model.launch 
七、常见问题与高级解决方案 7.1 ModuleNotFoundError: No module named ‘yaml’ 问题原因 Python 3.6虚拟环境中未安装pyyaml包 解决方案 1 2 3 4 5 pip install pyyaml python -c "import yaml; print(yaml.__version__)"  
7.2 ROS消息生成错误(Python 3兼容问题) 问题现象 1 2 3 error: invalid command  'bdist_wheel'  或 ImportError: cannot import name 'message'  from 'genpy'  
解决方案 1 2 3 4 5 6 7 8 9 10 pip install -U rospkg catkin_pkg empy catkin config --cmake-args \   -DPYTHON_EXECUTABLE=~/gazebo/venv_py36/bin/python \   -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \   -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so    catkin build 
7.3 模型路径动态检测优化 优化脚本(自动扫描可用模型) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import  osimport  randomdef  get_available_models (base_path ):    """扫描目录获取所有可用模型文件夹"""      if  not  os.path.exists(base_path):         return  []             available_models = []     for  folder in  os.listdir(base_path):         folder_path = os.path.join(base_path, folder)         if  os.path.isdir(folder_path) and  os.path.exists(os.path.join(folder_path, "model.sdf" )):             available_models.append(folder)        return  available_models base_model_path = "/home/bobac3/.gazebo/models"  fruit_board_folders = get_available_models(base_model_path) if  not  fruit_board_folders:    rospy.logfatal("未找到任何Gazebo模型!请检查模型路径。" )     sys.exit(1 ) 
八、环境验证与最佳实践 8.1 完整环境验证流程 激活环境:./activate_ros_py36.sh 验证Python版本:python --version → Python 3.6.x 验证ROS包:rospack list | grep gazebo_pkg 运行脚本:roslaunch gazebo_pkg random_model.launch 检查Gazebo界面是否加载模型 8.2 最佳实践建议 隔离环境 :始终使用虚拟环境避免系统依赖冲突版本控制 :将环境配置(如requirements.txt)加入版本控制日志记录 :在脚本中添加详细日志以便调试定期更新 :保持pip、setuptools等工具为最新版本备份模型 :重要模型建议备份到版本控制或独立目录通过以上步骤,您可以在ROS Melodic环境中成功配置Python 3.6并运行Gazebo脚本,同时解决依赖管理和文件路径问题,建立稳定的开发工作流。