【ROS/节点与package】C++版本

由于今天晚上吃了夜宵,写点有意思的东西哈哈哈哈。

在ROS 的基础学习里面,一个重要的基础是rostopic中消息的发布与订阅,一个简单的例子嘿嘿。

一.节点与包的联系

在机器人操作的学习里,要运作一个机器人需要很多部分的一起作用,就像一个手机里面有很多APP,APP相当于一个pacakge,然后APP里面有许多功能,相当于一个一个的节点node。节点之间的合作运行就可以控制机器人的运作。

那各个节点如何联系起来?就需要一个共同的话题叫rostopic。

比如今天晚上fan跟xie想吃夜宵,那么他们就需要一个共同的话题ye_xiao_topic,那么他们两个才能互相联系起来

二.编写程序

2.1创立工作空间与pacakge

首先打开Ctrl+Alt+T打开终端,输入以下指令:完成对pacakge的创建。

mkdir -p catkin_ws/src//创建工作空间
cd catkin_ws/src //进入到工作空间中的src文件
catkin_create_pkg fan_pkg rospy rpscpp std_msgs//catkin_create_pkg<包的名称><依赖项>

2.2利用vscode进行程序的编写

2.2.1信息发布者节点的编写

在文件fan_pkg下打开终端输入code package.xml,然后回车【输入一半可以用Tab键自动补全,方便检查拼写是否错误】。命令将会将工作空间自动导入到vscode。

进入我们的vscode 编写程序,点击src右键新建文件取名fan_node.cpp创建一个C++文件,进行我们信息发布节点的一个编写,相当于消息发布者需要在群里管理员的管理下进行消息的发布,其中while(ros::ok())是ros中自带的,帮助我们在终端里面结束程序,跳出循环。代码如下:

#include<ros/ros.h>//ros库中的头文件
#include<std_msgs/String.h>
int main(int argc,char *argv[])
{
    ros::init(argc,argv,"fan_node");//对节点进行初始化
    ros::NodeHandle nh;//此变量相当于群管理员
    ros::Publisher  fan=nh.advertise<std_msgs::String>("ye_xiao_topic",10);
//加入群聊ye_xiao_topic
    while (ros::ok())//一直在群聊发消息寻找饭搭子。
    {
        /* code */
        printf("好罪恶,快一起吃夜宵!\n");
        std_msgs::String msg;//定义在群里面要发送的消息类型是std_msgs中的String类型
        msg.data="吃炒米粉,吃炸鸡!";//不断在群消息里面发消息寻找饭搭子
        fan.publish(msg);//fan将消息发布出去
    }
}

 对所写代码进行编译环境的配置在工作去找到Cmake.Lists.txt文件双击打开,在build一栏下面Declare a C++ executable一栏下面【双#表示解释,单#表示指令】,将单#那一条指令,add_executable(${PROJECT_NAME}_node src/fan_pkg_node.cpp)粘贴复制到最下面。并将其修改为add_executable(fan_node src/fan_node.cpp),括号的内容表示(什么节点/待编译的文件)。除此之外,build的最后的三行指令同样去掉单#复制到文件的最末尾,将target_link_libraries(${PROJECT_NAME}_node修改为target_link_libraries(fan_node,最终修改之后如下图所示:

 

2.2.2 消息订阅者的程序编写

按照以上内容重新创建包与节点与文件,此时我创建的为xie_node,进入vs进行程序的编辑,由于我们是消息订阅者,可以写一个回调函数,将接受到的消息打印出来,涉及到一个新的函数ros::spinOnce();相当于一会儿又进行对群里的消息进行窥屏,嘿嘿。程序代码如下:

#include<ros/ros.h>
#include<std_msgs/String.h>
void xie_callback(std_msgs::String mgs)
{
    ROS_INFO(mgs.data.c_str());//进行数据类型的一个转换,来接受fan发送的消息
}
int main(int argc,char *argv[])
{
    setlocale(LC_ALL,"");//设置本地模式,不然中文显示乱码
    ros::init(argc,argv,"xie_node");//对节点进行初始化
    ros::NodeHandle nh;//定义群管家
    ros::Subscriber xie=nh.subscribe("ye_xiao_topic",10,xie_callback);
    //相当于进群申请,已加入群聊,加入ye_xiao_topic

    while (ros::ok())//循环里面不断的对群消息进行窥屏
    {
        /* code */
        ros::spinOnce();
    }
    return 0;
}

 最后像以上内容一样进行编译文件配置。

三.运行节点

打开终端输入以下指令:

cd catkin_ws //进入工作空间
catkin _make //编译

成功之后就像以上一样进行source ./devel/setup.bash

然后进行roscore,再打开新的终端运行rosrun <包的名称> <节点名称>,最后开一个新的终端运行另一个节点。,代码如下:

roscore //启动ros核心,第一个终端
rosrun fan_pkg fan_node //第二个终端,运行节点
rosrun xie_pkg xie_node //第三个终端,运行节点

运行结果如下:

  • 35
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stupdf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值