ROS入门学习笔记(一)——节点、功能包

一、核心关系概览:

我们可以用一个简单的比喻来开始:

  • 功能包 就像一个项目文件夹软件包,它包含了完成一个特定功能所需的所有文件(代码、配置文件、数据等)。

  • 节点 就像是这个项目中的一个可执行程序进程,负责完成一项具体的任务。

二、工作流程简述:

  1. 创建:你创建一个功能包(catkin_create_pkg),并在其中编写节点的源代码。

  2. 定义:在 package.xml 中声明包的依赖,在 CMakeLists.txt 中配置如何生成节点的可执行文件。

  3. 构建:编译工作空间,将源代码构建成可执行的节点。

  4. 运行:使用 rosrun 或 roslaunch 来运行功能包中的节点。

  5. 通信:运行起来的节点,无论它们属于哪个功能包,都通过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文件已经成功运行,两个节点都在正常执行。

后续调试。。。。。。。。。。。。。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值