ROS2中launch编写及参数含义(xml、python)

ROS2系列文章目录

ROS2中nav_msgs/msg/Path 数据含义及使用

ROS2中std_msgs/msg/Header 数据含义及使用

ROS中TF变换详解


文章目录


ROS2中launch编写及参数含义(xml、python)


一、ROS官方介绍

ROS 2中的启动系统负责帮助用户描述其系统的配置,然后按描述执行。系统的配置包括运行什么程序,在哪里运行,传递什么参数,以及ROS特定的约定,这些约定通过为每个组件提供不同的配置,使其易于在整个系统中重用组件。它还负责监测启动过程的状态,并报告和/或对这些过程的状态变化作出反应。
ROS2官方说明:http://docs.ros.org/en/humble/Tutorials/Intermediate/Launch/Creating-Launch-Files.html#write-the-launch-file

二、实现案例

1.编写主函数、CMakeLists.txt及package.xml

此处创建learn_ros2功能包,在learn_ros2/src目录下建立main.cpp,该函数具体实现功能参照博文:ROS2中nav_msgs/msg/Path 数据含义及使用

cpp#include 复制代码
#include <nav_msgs/msg/path.hpp>
#include <rclcpp/rclcpp.hpp>
#include <string>
#include <unistd.h>
using namespace std;
class My_node:public rclcpp::Node{
public:
    My_node(std::string node_name):Node(node_name){

    }
};
int main(int argc, char**argv){
    rclcpp::init(argc,argv);//节点初始化
    std::shared_ptr<My_node> node_ptr = std::make_shared<My_node>("test_node");
    rclcpp::Publisher<nav_msgs::msg::Path>::SharedPtr nav_pub = node_ptr->create_publisher<nav_msgs::msg::Path>("/global_path",1);
    nav_msgs::msg::Path path;
    geometry_msgs::msg::PoseStamped pose;
    path.header.frame_id = "world";
    while (rclcpp::ok())
    {
        path.header.stamp = node_ptr->now();
        path.poses.clear();
        for (int i = 0; i < 10; i++)
        {
            pose.header.frame_id = "world";
            pose.header.stamp = node_ptr->now();
            pose.pose.position.set__x(i);
            pose.pose.position.set__y(0.2*i*i+2);
            pose.pose.position.set__z(0);
            pose.pose.orientation.set__x(0);
            pose.pose.orientation.set__y(0);
            pose.pose.orientation.z = 0;
            pose.pose.orientation.w = 1;
            path.poses.push_back(pose);
        }
        nav_pub->publish(path);
        sleep(1);
        std::cout<<"已发送path"<<std::endl;
    }    
    std::cout<<"退出程序"<<std::endl;
}

指定功能包learn_ros2的CMakeLists.txt如下:

cpp 复制代码
cmake_minimum_required(VERSION 3.8)
project(learn_ros2)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclpy REQUIRED)
find_package(std_msgs REQUIRED)
find_package(nav_msgs REQUIRED)
if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()
#添加可执行文件名
add_executable(test_node src/main.cpp)
#给可执行文件链接ros2的标准库及其他依赖
ament_target_dependencies(test_node rclcpp std_msgs nav_msgs)
#将可执行文件安装在指定目录下
install(TARGETS test_node
DESTINATION lib/${PROJECT_NAME})
#将launch目录下的文件安装在指定目录下
install(DIRECTORY launch
  DESTINATION share/${PROJECT_NAME})
ament_package()

2.编写启动节点的launch文件

在learn_ros2目录下建立launch文件夹,并在文件目录中新建python及xml文件如下:

test_launch.launch.py,test_xml_launch.xml

首先使用python实现test_launch.launch.py文件,具体含义参考注释

python 复制代码
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():

    parameters_basic1 = Node(
        package="learn_ros2",
        executable="test_node",
    )
    # 创建LaunchDescription对象launch_description,用于描述launch文件
    launch_description = LaunchDescription(
        [parameters_basic1])
    # 返回让ROS2根据launch描述执行节点
    return launch_description

该处使用的url网络请求的数据。

使用XML实现test_xml_launch.xml文件,具体含义参考注释

xml 复制代码
<launch>

  <!-- 启动节点,命名为/name1/test_node -->
  <node pkg="learn_ros2" exec="test_node" name="test_node" namespace="name_1"/>
  
  <!-- 启动节点,命名为/name2/test_node -->
  <node pkg="learn_ros2" exec="test_node" name="test_node" namespace="name_2"/>
  
  <!-- 启动节点,命名为/name3/test_node,同时将话题/global_path,映射为/test_node3/global_path-->
  <node pkg="learn_ros2" exec="test_node" name="test_node" namespace="name_3">
    <remap from="/global_path" to="/test_node3/global_path"/>
  </node> 

</launch>

3.编译并运行

注意:编写完成launch文件后,要使用ros2编译命令对功能包的可执行文件进行生成

使用test_xml_launch.xml启动各个程序

cpp 复制代码
source install/setup.bash
ros2 launch learn_ros2 test_xml_launch.xml

使用test_launch.launch.py启动各个程序如下:

相关推荐
AI+程序员在路上9 小时前
飞行坐标系 vs 机器人坐标系:对比、转换与场景应用
机器人
鲁邦通物联网9 小时前
数据中心巡检机器人梯控稳定性验收与故障测试方法
机器人·巡检机器人·机器人梯控·agv梯控·非侵入式采集·机器人乘梯·机器人自主乘梯
特立独行的猫a9 小时前
会说确认叫车才下单-启元机器人官方滴滴打车技能源码详解
人工智能·机器人·技能·启元机器人
wangchunyu1149 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
2501_9445215911 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿11 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_9445215911 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港12 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_9679873712 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
meiying883812 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化