动手学ROS(1):创建ros节点

动手学ROS(1):创建ros节点

ROS (Robot Operating System, 机器人操作系统) 提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。

1 安装 ros

安装步骤请参考 安装教程

该页面是ROS Melodic版本。本系列教程提供的代码均为在Ubuntu18.04上实测通过。

2 创建ros node
2.1 创建catkin workspace:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make

初次运行catkin_make命令会在src目录下生成CMakeLists.txt。该文件不需要改动。

2.2 创建package
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorial std_msgs roscpp

需要注意的是,创建pkg时需要进入src目录。ros_tutorial为pkg的名称,std_msgs 及roscpp为pkg的所依赖的pkg,我们暂时使用c++来进行代码示例,所以依赖了roscpp。顺便提一下,std_msgs为ros提供的标准通信格式,后续讲到通信方式的时候再来细说。

我们首先来认识下pkg默认的目录结构

└── ros_tutorial
    ├── CMakeLists.txt
    ├── include
    │   └── ros_tutorial
    ├── package.xml
    └── src

目前我们需要注意到,新生成的pkg里也有一个CMakeLists.txt,这个文件是需要修改的。熟悉c++的朋友应该可以看出来,这就是一个普通的cmake文件,负责工程的编译。

我们写的cpp文件就写在src目录下,头文件放在include下,package.xml用来维护依赖pkg。

2.3 编写ros node

ros node 可以简单理解为ros通信的基本单位。ros工程运行时有一个master 节点和若干个 client节点,各client之间通过master进行通信。

下面就简单写一个ros node. 在ros_tutorial/src下新建ros_tutorial_node.cpp文件:

#include <ros/ros.h>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "ros_tutorial_node");
    ros::NodeHandle n;
    ros::Rate rate(1);

    while (n.ok())
    {
        ROS_INFO("spin once");
        ros::spinOnce();
        rate.sleep();
    }

    return 0;
}

其实这里可以随便写一个cpp文件,这里主要是为了引入ros::nodeHandle的概念。

  • ros::init

    初始化

  • ros::NodeHandle

    创建ros节点

  • ros::Rate

    节点刷新频率

  • ros::spinOnce 或ros::spin

    执行刷新

以上是启动节点的必要操作,细节后续会逐步介绍。

2.4 修改CMakeLists

主要修改两个地方。反注释就可以了。

  • add_executable:编译目标
  • target_link_libraries:定义链接库
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(${PROJECT_NAME}_node src/ros_tutorial_node.cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)
2.5 编译并执行
2.5.1 build

build需要在workspace下进行,故先返回上级目录,再执行catkin_make

$ cd ..
$ catkin_make

build成功后,可留意一下workspace下的build和devel文件夹,编译的结果在devel中,build主要记录了cmake相关编译文件。

2.5.2 run

首先需要启动roscore,也就是之前提到过的ros master 节点。打开一个新的终端:

$ roscore

然后在之前的终端中输入:

$ source devel/setup.bash
$ rosrun ros_tutorial ros_tutorial_node

初学ros的时候经常会忘记source,养成习惯就好了。

最后,输出结果:

$ rosrun ros_tutorial ros_tutorial_node
[ INFO] [1620964595.224187100]: spin once
[ INFO] [1620964596.224587500]: spin once
[ INFO] [1620964597.224583200]: spin once
[ INFO] [1620964598.224580900]: spin once
[ INFO] [1620964599.224578200]: spin once

代码的意思是 每秒写一条日志。

3 结语

本文快速地把学习ros需要的最基本操作串了起来,接下来会介绍ros的通信方式。

本系列教程是笔者过去半年的ros开发经验总结,记录成文供读者参考,欢迎留言交流。

  • 11
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
ROS 2中,创建节点需要进行以下步骤: 1. 创建一个ROS 2包(package) 在ROS 2中,使用`colcon`来编译ROS 2程序,因此在创建ROS 2包之前,需要先安装`colcon`。安装完成后,在终端中输入以下命令来创建ROS 2包: ``` mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ros2 pkg create my_package --build-type ament_cmake ``` 这个命令会在`~/ros2_ws/src`目录下创建一个名为`my_package`的ROS 2包,并使用`ament_cmake`作为构建类型。 2. 创建一个ROS 2节点ROS 2包中,可以创建多个节点。在`my_package`包中,使用以下命令来创建一个名为`my_node`的节点: ``` cd ~/ros2_ws/src/my_package ros2 pkg create my_node --build-type ament_cmake --node-name my_node ``` 这个命令会在`my_package`包中创建一个名为`my_node`的目录,并在其中生成一个C++源文件`my_node.cpp`,并且在`CMakeLists.txt`中添加了编译`my_node`节点所需的相关代码。 3. 编写节点代码 在`my_node.cpp`文件中编写节点代码。节点代码应该包含节点初始化、消息订阅和发布、消息处理等功能。例如,以下代码会创建一个ROS 2节点,订阅名为`/input`的字符串消息,并将消息添加到名为`/output`的字符串消息中进行发布: ```cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" class MyNode : public rclcpp::Node { public: MyNode() : Node("my_node") { pub_ = create_publisher<std_msgs::msg::String>("output", 10); sub_ = create_subscription<std_msgs::msg::String>("input", 10, std::bind(&MyNode::onInput, this, std::placeholders::_1)); } private: void onInput(const std_msgs::msg::String::SharedPtr msg) { auto output_msg = std_msgs::msg::String(); output_msg.data = "Received message: " + msg->data; pub_->publish(output_msg); } rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub_; rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<MyNode>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` 4. 编译节点 在终端中,使用以下命令编译ROS 2节点: ``` cd ~/ros2_ws colcon build --packages-select my_package ``` 这个命令会在`~/ros2_ws/build`目录下编译`my_package`包,并生成`my_node`节点的可执行文件。 5. 运行节点 在终端中,使用以下命令运行`my_node`节点: ``` cd ~/ros2_ws source install/setup.bash ros2 run my_package my_node ``` 这个命令会启动`my_node`节点,并开始订阅`/input`话题,并在`/output`话题中发布消息。 这是一个简单的ROS 2节点创建和使用的例子,实际情况中可能需要更复杂的节点和功能。同时,需要注意编写好`package.xml`和`CMakeLists.txt`文件,以正确配置ROS 2节点的依赖和编译选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值