一、核心关系概览:
我们可以用一个简单的比喻来开始:
-
功能包 就像一个项目文件夹或软件包,它包含了完成一个特定功能所需的所有文件(代码、配置文件、数据等)。
-
节点 就像是这个项目中的一个可执行程序或进程,负责完成一项具体的任务。
二、工作流程简述:
-
创建:你创建一个功能包(
catkin_create_pkg),并在其中编写节点的源代码。 -
定义:在
package.xml中声明包的依赖,在CMakeLists.txt中配置如何生成节点的可执行文件。 -
构建:编译工作空间,将源代码构建成可执行的节点。
-
运行:使用
rosrun或roslaunch来运行功能包中的节点。 -
通信:运行起来的节点,无论它们属于哪个功能包,都通过ROS Master连接起来,形成一个分布式计算图,通过话题、服务等进行通信,协同工作。
三、实际操作:
(1)创建功能包和节点
①基于ubantu 20.04的ROS noetic版本,使用 ctrl+alt+T 快捷键打开一个新终端,输入如下指令。
//在~/catkin_ws/src/目录下创建包
cd ~/catkin_ws/src/
catkin_create_pkg ssr_pkg rospy roscpp std_msgs
//在对应地址下会生成四个文件:package_xml、CMakeLists.txt、ssr_pkg、src
使用catkin_create_pkg创建功能包,指定依赖项 catkin_create_pkg <包名> <依赖项列表>
上述代码中: ssr_pkg 为功能包名
rospy、roscpp、std_msgs 分别为Python、C++的依赖项
②打开VScode软件在~/catkin_ws/src/ssr_pkg/src目录下创建文件:chao_node.cpp
编辑新建的节点文件,输入以下内容并保存。
# include<ros/ros.h>
# include<std_msgs/String.h> //标准类型的头文件
int main(int argc, char *argv[])
{
ros::init(argc, argv, "chao_node"); //初始化节点,解析命令行参数,命名节点为“chao_node”
printf("我来也\n");
//管理节点与ROS系统的连接,提供创建发布者、订阅者等功能。
ros::NodeHandle nh; //调用NodeHandle大管家并将其命名为 nh
//创建一个发布者Publisher,并命名为 pub 。
ros::Publisher pub = nh.advertise<std_msgs::String>("topic_A",10); //adveitise<类型>(“主题”,缓存长度) String——字符串类型
ros::Rate loop_rate(10); //设置循环频率为10HZ(每秒10次)
while(ros::ok())
{
printf(" 带飞 \n");
std_msgs::String msg; //创建String类型的消息对象
msg.data = "上车"; //设置消息内容
pub.publish(msg); //发布到主题topic_A
loop_rate.sleep();//休眠以维持10HZ的频率
}
return 0;
}
③重复②中步骤,在同一目录下创建新的节点 yao_node.cpp。(如下图)

编辑新建的节点文件,输入以下内容并保存。
# include<ros/ros.h>
# include<std_msgs/String.h> //标准类型的头文件
int main(int argc, char *argv[])
{
ros::init(argc, argv, "yao_node"); //初始化节点,解析命令行参数,命名节点为“chao_node”
printf("我来也\n");
//管理节点与ROS系统的连接,提供创建发布者、订阅者等功能。
ros::NodeHandle nh; //调用NodeHandle大管家并将其命名为 nh
//创建一个发布者Publisher,并命名为 pub 。
ros::Publisher pub = nh.advertise<std_msgs::String>("topic_B",10); //adveitise<类型>(“主题”,缓存长度) String——字符串类型
ros::Rate loop_rate(10); //设置循环频率为10HZ(每秒10次)
while(ros::ok())
{
printf(" 求带飞 \n");
std_msgs::String msg; //创建String类型的消息对象
msg.data = "躺赢"; //设置消息内容
pub.publish(msg); //发布到主题topic_A
loop_rate.sleep();//休眠以维持10HZ的频率
}
return 0;
}
(2)在 CMakeLists.txt 中配置如何生成节点的可执行文件:
①设置CMakeLists.txt文件
在VScode中打开与节点在同一地址中的CMakeLists.txt文件:

在其中找到Build 中找到如下代码中的两条:
###########
## Build ##
###########
# add_executable(${PROJECT_NAME}_node src/wpr_simulation_node.cpp)
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
复制黏贴到末尾,修改其中节点名称为需要用的节点,目的是为了给其添加一个可执行项。(如下所示)
add_executable(chao_node src/chao_node.cpp) #为这个包添加一个可执行程序
target_link_libraries(chao_node
${catkin_LIBRARIES}
)
add_executable(yao_node src/yao_node.cpp) #为这个包添加一个可执行程序
target_link_libraries(yao_node
${catkin_LIBRARIES}
)
②编译
在终端中输入
cd ~/catkin_ws/ //进入工作空间
catkin_make //编译
(3)运行
①使用rosrun 命令
打开一个新的终端输入(快捷键 ctrl+alt+T)
roscore //打开ROS空间
再打开一个新的终端输入
rosrun ssr_pkg chao_node
可以看到节点已经启动(如图)

②使用 roslaunch 命令(可以一次性调用多个节点)
创建launch文件,在任意一个功能包文件下创建launch文件夹,在该文件夹下创建kai_hei.launch文件(如图)

编辑kai_hei.launch文件,保存。
<launch>
<node pkg="ssr_pkg" type="yao_node" name="yao_node">
<node pkg="ssr_pkg" type="chao_node" name="chao_node">
</launch>
打开终端运行(launch文件会自动启动ros,无需使用roscore命令)
roslaunch ssr_pkg kai_hei.launch
结果如图:
由结果可知:
-
yao_node(pid [4856]) - 已启动 -
chao_node(pid [4860]) - 已启动
查看节点运行状态:
打开新的终端(原终端保持打开状态)
rosnode list

总结:
没有问题! ROS launch文件已经成功运行,两个节点都在正常执行。
后续调试。。。。。。。。。。。。。
2091

被折叠的 条评论
为什么被折叠?



