一、 node & package 定义
1. node
ROS 中的节点 node 类似于 android 中的 app。在使用 ROS 的时候实际上是在使用 ROS 中的某一个或者某一些 node。
这些 node 的作用有:建图(GMapping)、导航(Move_base)、控制底盘(wpb_core)、驱动雷达(rplidar_ros)。
2. package
尽管是只使用一个 node,但必须以该 node 所在的 package 为单位进行安装 。
ROS 使用 CMake 和 catkin 作为编译工具 ,把散落的 node 进行规整 。
可以将包理解为 node 的容器 。
二、 第一个 node 节点
目的是要创建一个节点(new _node),把该节点放到第一个包(new_pkg)中 。
1. 工作空间设置
进入编译器操作
2. 创建 package 包
进入源码文件的存放目录 src 中
cd catkin_ws/src/
创建第一个包(new_pkg)
catkin_create_pkg new_pkg rospy roscpp std_msgs
代码中后三项是依赖项(实质是通用节点包)。
3. 回访依赖项
从当前路径跳转到对应软件包地址
roscd roscpp
/ opt / ros / noetic / share
该路径中存放的都是现成的可执行的软件包,这些软件包是在安装ROS系统时或者通过 apt 指令安装的软件包 。
区别于工作空间 catkin_ws 中是源码文件,需要编译成可执行文件才能运行。
PS : .bashrc 中添加的两条 source 指令 ,不添加加载项的文件夹在编译时报错 。
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
第一条指令加载通过 apt 下载的软件包地址 ,
第二条指令加载 catkin_ws 工作空间地址 。
4. 创建 node 节点
vscode 中 /new_pkg /src / 下创建 new_node.cpp 文件 。
#include<ros/ros.h>
#include<std_msgs/String.h>
int main(int argc , char *argv[])
{
// :: 表示ros类作用域下的init函数
ros::init(argc,argv,"new_node"); // 初始化ros节点
printf("my first ros node here .");
return 0;
}
5. 源码编译
CmakeLists 文件为新节点添加编译规则
Declare a C++ executable // 136
Specify libraries to link a library or executable target against // 148
-
vscode 中编译
Ctrl+Shift+B -
catkin_ws 中编译
在 catkin_ws 文件夹下输入进行源码编译
catkin_make
6. 运行 node 节点
启动 ros 核心
roscore
运行节点
rosrun new_pkg new_node
7. 保持节点运行
加入 while(ros::OK()) 。
三、 总结
- 使用 catkin_create_pkg 创建一个软件包
- 在软件包的 src 文件夹下创建一个节点的 cpp 源码文件
- 在节点的源码文件中 include 包含 ros 的头文件
- 构建一个 main 函数,并在函数的开头执行 ros::init()
- 构建 while 循环,循环条件设置为 ros::ok()
- 在CMakeLists.txt 中设置节点源码的编译规则
- 编译运行