ROS Melodic下launch启动双节点时cv2.imwrite不保存图片问题
问题原因
roslaunch 启动节点时,默认将节点的工作目录设置为 ROS 全局默认路径 ~/.ros,而非你执行 roslaunch 命令时的终端当前目录。你单独运行 Python 脚本时是在自己的工作目录执行,所以图片直接存到当前目录下;用 launch 文件启动时,你代码里的相对路径 photo1.jpg 实际对应的是 ~/.ros/photo1.jpg,到该目录下就能找到已经保存的图片。
解决方案
有两种常用修复方案,按需选择即可:
方案1:修改 launch 文件(改动最小,推荐)
在拍照节点的 <node> 标签中添加 cwd 参数,手动指定节点的工作目录:
- 如果希望图片保存在你执行
roslaunch命令的当前终端目录,设置cwd="$(env PWD)" - 如果希望图片固定保存在
turtlebot_teleop功能包目录下,设置cwd="$(find turtlebot_teleop)"
修改后的完整 launch 文件示例:
<launch> <node pkg="turtlebot_teleop" type="goforward.py" name="GoForward" output="screen" /> <node pkg="turtlebot_teleop" type="take_photo_mod.py" name="take_photo" output="screen" cwd="$(env PWD)"/> </launch>
方案2:修改 Python 代码使用绝对路径保存
直接在代码中指定固定的保存目录,彻底避免相对路径的歧义,示例修改如下:
# 在 take_photo_mod.py 的主循环前添加路径定义 import os # 示例:固定保存到用户主目录下的 turtlebot_photos 文件夹 save_path = os.path.expanduser("~/turtlebot_photos/") os.makedirs(save_path, exist_ok=True) # 原代码中获取文件名的部分修改为: img_title = os.path.join(save_path, rospy.get_param('~image_title', 'photo1.jpg'))
内容的提问来源于stack exchange,提问作者sm29
相关产品推荐
相关产品推荐

