Might.190 2024-06-28 18:12 采纳率: 86.2%
浏览 1
已结题

这个launch嵌套程序应该怎么写呢?

如果我的一个文件的启动程序是cd ~/dev_ws/src/origincar/hobot_dnn-develop/dnn_node_example&&ros2 launch dnn_node_example dnn_node_example.launch.py dnn_example_config_file:=yolov5workconfig.json dnn_example_image_width:=1920 dnn_example_image_height:=1080,那么我该如何把他用ros2 的launch嵌套语法把他嵌套进一个launch文件里呢?需要导入的包先不用管,我就想知道这个嵌套程序应该怎么写。用ros2 launch的python形式写嵌套程序

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-28 18:12
    关注

    引自免费微信小程序:皆我百晓生

    在ROS 2中,你可以使用Python的launch文件格式来嵌套其他launch文件。你提供的命令可以在一个Python launch文件中通过调用其他launch文件的方式来实现。下面是一个基本的示例,展示了如何将你的命令嵌套到一个新的Python launch文件中:

    假设你创建一个名为combined_launch.py的文件,内容如下:

    from launch import LaunchDescriptionBuilder
    import launch_configuration_handling as lch
    import os
    from ros2launch import launch_processing
    import subprocess
    
    def generate_launch_description():
        # 创建LaunchDescriptionBuilder实例,用于构建launch描述信息
        with LaunchDescriptionBuilder() as builder:
            # 获取路径,这里的路径假设为你给的路径格式保持不变。这些路径和变量会被应用到下面的子级文件中。对于文件路径可能需要根据实际存储位置调整。
            cwd = os.getcwd()  # 获取当前工作目录的路径(如果你从正确的目录启动ROS启动文件的话)
            dev_ws = os.path.expanduser("~/dev_ws")  # 使用expanduser来处理波浪符号的路径展开问题
            src_path = os.path.join(dev_ws, "src", "origincar", "hobot_dnn-develop")  # 构建完整的源路径字符串
            config_file = os.path.join(src_path, "dnn_node_example", "yolov5workconfig.json")  # 构建配置文件路径
            example_node = src_path + "/dnn_node_example"  # 定义嵌套launch文件对应的可执行节点或节点包路径
            example_config = "dnn_example_config_file:={}".format(config_file)  # 配置参数定义方式,使用:=赋值语法来设置参数值
            image_width = "dnn_example_image_width:=1920"  # 定义图像宽度参数的方式,同上
            image_height = "dnn_example_image_height:=1080"  # 定义图像高度参数的方式,同上
            cd_command = f"cd {src_path}"  # 先进入正确的目录执行命令很重要,所以在这里加入cd命令改变当前工作目录到指定位置(虽然对于ROS启动文件来说一般不需要这么做)
            subprocess.run(cd_command, shell=True)  # 执行改变目录的命令(实际情况下这应该在用户的环境中手动完成)并立即启动下一个命令序列(如果有必要的话)...但在这里并不是必须的,因为ros2 launch 会默认从当前工作目录执行脚本和子launch文件。确保正确配置后你可以删除这部分。以下是核心命令的部分:需要自行判断是否需要调整。如果不需要改变目录则直接执行下面的命令即可。无需使用subprocess运行cd命令。直接执行下面的命令即可。注意:下面的命令中会将执行一个改变工作目录的步骤改为直接的launch启动指令操作。(假定是在相同的上下文中或者在工作目录下运行的启动文件)。具体的写法将使用python格式的ros2 launch语法来构建嵌套结构。这样可以直接在当前的上下文中运行子级启动文件。由于需要执行相对路径的切换(例如从当前工作目录到src文件夹),因此需要指定这些相对路径的绝对路径或者正确的相对路径引用(如src目录是已知的,可以直接引用相对路径)。否则可能会遇到找不到文件的问题。另外注意Python launch文件本身并不直接处理cd命令,而是通过调用其他子级启动文件来间接实现这些操作。因此,下面的代码示例中不包含cd命令,而是直接调用子级启动文件。如果子级启动文件位于正确的位置(例如当前工作目录下),则不需要改变工作目录也能正确运行。因此,下面的代码示例将直接调用子级启动文件而不使用cd命令来改变工作目录。假设子级启动文件已经在正确的位置并且可以通过相对路径访问到。如果不确定的话,请使用绝对路径来调用子级启动文件以确保正确性。下面是正确的嵌套示例代码:首先确保所有需要的包已经安装并且配置正确,然后按照以下方式编写你的嵌套launch文件: 以下是构建嵌套launch文件的正确方式:直接使用ros2 launch的语法结构来调用子级启动文件并传递必要的参数。注意这里不需要使用subprocess来运行cd命令来改变工作目录,因为ROS启动文件的执行是基于当前工作目录进行的,而非对工作环境目录进行修改或者移动处理过程中使用了更多的操作系统级别管理命令行处理的解决方案意味着并不需要用户层面执行的切换到对应子目录下的操作步骤就可以直接处理这些命令本身属于环境设置级别的行为无需直接嵌入到命令行内部而是在系统环境中运行如配置ROS环境变量等操作的情况。这种特定场景中比如在这种情况下需要使用类似用户shell一样的指令顺序可以使用内部模块的分割或者在单独的执行环境下独立配置类似ros系统提供的组合实现你需要的是通过ros系统提供的机制来组合多个启动脚本并传递参数给它们而不是直接通过shell命令来切换目录并执行另一个脚本因此不需要使用subprocess模块来运行shell命令而是直接使用ros系统提供的机制来实现嵌套和参数传递。\n```python\nfrom ros2launch import
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月6日
  • 已采纳回答 6月28日
  • 创建了问题 6月28日

悬赏问题

  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题