在ROS Melodic环境中配置Python 3.6并运行Gazebo脚本的详细教程

John Doe Lv1

在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
# 列出系统中所有Python相关可执行文件
ls /usr/bin/python*

# 示例输出(可能包含以下内容):
# /usr/bin/python /usr/bin/python2 /usr/bin/python2.7 /usr/bin/python3 /usr/bin/python3.6 /usr/bin/python3.6m

# 定位Python 3.6的安装路径
which python3.6

# 示例输出:
# /usr/bin/python3.6

2.2 安装Python 3.6(若未安装)

2.2.1 Ubuntu/Debian系统安装方法

1
2
3
4
5
6
7
8
9
10
11
12
# 添加第三方PPA源(包含Python 3.6包)
sudo add-apt-repository ppa:deadsnakes/ppa

# 更新软件包索引
sudo apt update

# 安装Python 3.6及虚拟环境工具
sudo apt install python3.6 python3.6-venv

# 验证安装结果
python3.6 --version
# 应输出:Python 3.6.x

2.2.2 CentOS/RHEL系统安装方法

1
2
3
4
5
6
7
8
9
10
11
12
# 安装CentOS软件集合(Software Collections)
sudo yum install centos-release-scl

# 安装Python 3.6软件集合
sudo yum install rh-python36

# 临时激活Python 3.6环境(当前终端有效)
scl enable rh-python36 bash

# 验证环境
python --version
# 应输出:Python 3.6.x

2.3 创建并管理Python 3.6虚拟环境

2.3.1 创建独立虚拟环境

1
2
3
4
5
6
7
8
9
# 在gazebo目录下创建虚拟环境(避免与系统环境冲突)
python3.6 -m venv ~/gazebo/venv_py36

# 虚拟环境目录结构说明:
# venv_py36/
# ├── bin/ # 包含python解释器和pip工具
# ├── include/ # Python头文件
# ├── lib/ # 安装的Python包
# └── pyvenv.cfg # 环境配置文件

2.3.2 激活虚拟环境

1
2
3
4
5
6
7
8
# 激活虚拟环境(每次新终端需重新执行)
source ~/gazebo/venv_py36/bin/activate

# 激活后终端前缀会显示虚拟环境名称
# 示例:(venv_py36) bobac3@reinovo:~$

# 退出虚拟环境
deactivate

2.3.3 验证Python版本

1
2
3
4
5
6
7
# 检查当前环境Python版本
python --version
# 应输出Python 3.6.x

# 检查pip版本(确保兼容Python 3.6)
pip --version
# 示例输出:pip 20.0.2 from ... (python 3.6)

三、配置ROS Melodic与Python 3.6兼容

3.1 安装ROS Python 3依赖包

1
2
3
4
5
6
7
# 安装ROS Python 3兼容性模块
sudo apt install python3-catkin-pkg-modules python3-rospkg-modules python3-empy

# 包功能说明:
# python3-catkin-pkg-modules - Catkin构建系统的Python 3接口
# python3-rospkg-modules - ROS包管理系统的Python 3接口
# python3-empy - ROS模板引擎(兼容Python 3)

3.2 重新编译catkin工作空间

3.2.1 清除旧编译文件

1
2
3
4
5
6
7
# 进入工作空间
cd ~/gazebo/gazebo_test_ws

# 清除旧编译产物(可选,但推荐执行)
catkin clean

# 执行后会删除build/和devel/目录

3.2.2 配置Python 3.6路径

1
2
3
4
5
6
7
8
9
10
# 使用catkin config命令指定Python 3.6
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

# 参数说明:
# -DPYTHON_EXECUTABLE: 指定Python解释器路径
# -DPYTHON_INCLUDE_DIR: 指定Python头文件目录
# -DPYTHON_LIBRARY: 指定Python库文件路径(根据系统架构可能需要调整)

3.2.3 重新编译工作空间

1
2
3
4
5
6
7
8
# 使用catkin build(推荐)或catkin_make编译
catkin build

# 编译过程说明:
# 1. CMake生成构建文件
# 2. 编译C++代码(如有)
# 3. 生成Python模块和消息定义
# 4. 创建devel空间链接

3.3 激活工作空间与Python环境

1
2
3
4
5
6
7
8
9
# 先激活ROS工作空间
source ~/gazebo/gazebo_test_ws/devel/setup.bash

# 再激活Python 3.6虚拟环境
source ~/gazebo/venv_py36/bin/activate

# 验证ROS Python版本
echo $ROS_PYTHON_VERSION
# 若未设置,可手动设置:export ROS_PYTHON_VERSION=3

四、安装脚本依赖包

4.1 安装基础依赖

1
2
3
4
5
6
7
8
9
# 在虚拟环境中安装必要的Python包
pip install pyyaml rospkg catkin_pkg empy wheel

# 包功能说明:
# pyyaml - YAML解析器(ROS消息序列化依赖)
# rospkg - ROS包管理库
# catkin_pkg - Catkin构建系统库
# empy - 模板引擎(ROS生成消息时使用)
# wheel - Python二进制包格式,加速安装

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
# 更新setuptools和pip到最新版本
pip install --upgrade setuptools pip

# 卸载旧版本empy
pip uninstall -y empy

# 重新安装empy(使用wheel格式)
pip install empy

# 验证安装
python -c "import em; print(em.__version__)"
# 应输出empy版本号(如4.2)

五、运行脚本与解决文件路径问题

5.1 运行脚本与错误定位

1
2
3
4
5
6
7
8
9
10
# 执行Gazebo模型生成脚本
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
# 方法1:直接检查文件路径
ls -la ~/.gazebo/models/fruit2_board/model.sdf

# 方法2:列出所有水果板模型
ls ~/.gazebo/models | grep "fruit.*board"

# 示例输出(假设存在fruit1_board和fruit3_board):
# fruit1_board fruit3_board

5.2.2 修改代码添加路径验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在脚本中导入os模块
import os

# 修改load_model函数,添加路径检查
def 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列表,使用存在的模型路径
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
# 临时设置Gazebo模型搜索路径
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/custom_models

# 或在代码中动态设置
import 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

# 写入以下内容
#!/bin/bash
# 激活Python 3.6虚拟环境
source ~/gazebo/venv_py36/bin/activate

# 激活ROS工作空间
source ~/gazebo/gazebo_test_ws/devel/setup.bash

# 设置ROS Python版本
export ROS_PYTHON_VERSION=3

# 打印提示信息
echo "====================================="
echo " Python 3.6环境与ROS Melodic已激活"
echo " 当前Python版本: $(python --version)"
echo " ROS工作空间: ~/gazebo/gazebo_test_ws"
echo "====================================="

# 保存并退出(Ctrl+X,Y,Enter)

# 添加执行权限
chmod +x ~/gazebo/activate_ros_py36.sh

# 执行脚本激活环境
./activate_ros_py36.sh

6.2 使用roslaunch运行脚本

6.2.1 创建launch文件

1
2
3
4
5
# 创建launch目录(若不存在)
mkdir -p ~/gazebo/gazebo_test_ws/src/gazebo_pkg/launch

# 创建random_model.launch文件
nano ~/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>
<!-- 运行Gazebo模型生成脚本 -->
<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
# 重新编译工作空间(确保launch文件被识别)
cd ~/gazebo/gazebo_test_ws
catkin build

# 激活环境并运行launch
source ~/gazebo/activate_ros_py36.sh
roslaunch gazebo_pkg random_model.launch

七、常见问题与高级解决方案

7.1 ModuleNotFoundError: No module named ‘yaml’

问题原因

  • Python 3.6虚拟环境中未安装pyyaml包

解决方案

1
2
3
4
5
# 在虚拟环境中安装pyyaml
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
# 安装ROS Python 3扩展包
pip install -U rospkg catkin_pkg empy

# 重新配置catkin工作空间
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 os
import random

def get_available_models(base_path):
"""扫描目录获取所有可用模型文件夹"""
if not os.path.exists(base_path):
return []

# 过滤出包含model.sdf的文件夹
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)

# 后续使用random.choice(fruit_board_folders)选择模型

八、环境验证与最佳实践

8.1 完整环境验证流程

  1. 激活环境:./activate_ros_py36.sh
  2. 验证Python版本:python --version → Python 3.6.x
  3. 验证ROS包:rospack list | grep gazebo_pkg
  4. 运行脚本:roslaunch gazebo_pkg random_model.launch
  5. 检查Gazebo界面是否加载模型

8.2 最佳实践建议

  • 隔离环境:始终使用虚拟环境避免系统依赖冲突
  • 版本控制:将环境配置(如requirements.txt)加入版本控制
  • 日志记录:在脚本中添加详细日志以便调试
  • 定期更新:保持pip、setuptools等工具为最新版本
  • 备份模型:重要模型建议备份到版本控制或独立目录

通过以上步骤,您可以在ROS Melodic环境中成功配置Python 3.6并运行Gazebo脚本,同时解决依赖管理和文件路径问题,建立稳定的开发工作流。

  • Title: 在ROS Melodic环境中配置Python 3.6并运行Gazebo脚本的详细教程
  • Author: John Doe
  • Created at : 2025-07-27 12:24:47
  • Updated at : 2025-07-27 12:24:47
  • Link: https://redefine.ohevan.com/2025/07/27/在ROS-Melodic环境中配置Python-3-6并运行Gazebo脚本的详细教程/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments