当前位置:   article > 正文

ROS2 Launch文件编辑及运行_ros2生成执行文件

ros2生成执行文件

在第一版的 ROS 中launch 一般使用 xml 文件的格式进行编写和运行,但从 ROS2 中增添了 py 的 python 的可执行文件


作用
  • 为了解决频繁的 ros2 run 命令,和多个节点之间的运行及关闭
特性
  • launch文件允许我们同时启动和配置多个包含 ROS 2 节点的可执行文件,设计了一套完整的语法和规则的文件来帮助我们组织节点的启动
编写

使用官方推荐的 python 的方式来编写 launch 文件(Python 拥有 xml 和 Yaml )

src 工程文件结构
在这里插入图片描述


步骤

  1. 创建 src 及功能包
  2. 创建 src 及功能包
  3. 在功能包内创建 launch 文件夹,编写 .py 文件
  4. CMakeLists.txt 文件的更改
  5. 编译运行


创建 src 及功能包

打开终端运行

ros2 pkg create robot_startup --build-type ament_cmake --destination-directory src
  • 1


编写好 cpp 源文件

内容为以 500 ms 发布消息,内容为 “one

#include "rclcpp/rclcpp.hpp"
#include <iostream>
#include "std_msgs/msg/string.hpp"


class Publisher:public rclcpp::Node
{
public:
    Publisher(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());
        command_publisher_ = this->create_publisher<std_msgs::msg::String>("command", 10);
        // 创建定时器,500ms为周期,定时发布
        timer_ = this->create_wall_timer(std::chrono::milliseconds(500), std::bind(&Publisher::timer_callback, this));
    }
private:
    // 声明话题发布者
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr command_publisher_;
    void timer_callback()
    {
        // 创建消息
        std_msgs::msg::String message;
        message.data = "One";
        // 日志打印
        RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
        // 发布消息
        command_publisher_->publish(message);
    }
    // 声名定时器指针
    rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<Publisher>("topic_One");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;

}
  • 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
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
在功能包内创建 launch 文件夹,编写 .py 文件[重点]
mkdir launch
touch test.launch.py
  • 1
  • 2

然后在 .py 文件后键入

# 导入库
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    """launch内容描述函数,由ros2 launch 扫描调用"""
    action_robot_01 = Node(
        package="robot_start_up",
        executable="action_robot_01"
    )
    # 创建LaunchDescription对象launch_description,用于描述launch文件
    launch_description = LaunchDescription(
        [action_robot_01])
    # 返回让ROS2根据launch描述执行节点
    return launch_description
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 需要导入两个库(launch 描述文件的生成,Node打包)

LaunchDescription
launch_ros.actions 中的 Node

  • Node 节点打包

action_robot_01 = Node(
package=“robot_start_up”,
executable=“action_robot_01”
)

其中:
package 后面填写的内容为功能包的名字
executable 后面填写的内容为功能包中的 cpp文件生成的可执行文件名字
最后返回即可



CMakeLists.txt 文件的更改

添加以下几项

  • 寻找必要的包
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
  • 1
  • 2
  • 3
  • 源文件生成可执行文件
add_executable(action_robot_01 src/action_robot_01.cpp)
ament_target_dependencies(action_robot_01 rclcpp std_msgs)

install(TARGETS
  action_robot_01
  DESTINATION lib/${PROJECT_NAME}
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • install py 文件
install(DIRECTORY launch
  DESTINATION 
  share/${PROJECT_NAME})
  • 1
  • 2
  • 3


编译运行
colcon build
source install/build
ros2 run robot_start_up est.launch.py 
  • 1
  • 2
  • 3

执行结果:
在这里插入图片描述


在执行 ‘colcon build’ 后就会发现,在自己创建的工程目录文件夹 ‘install/功能包/share/launch’下会拷贝原来编辑好的 .py 文件

在这里插入图片描述


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/555440
推荐阅读
相关标签