在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脚本,同时解决依赖管理和文件路径问题,建立稳定的开发工作流。