我的ROS学习之路——话题通信之发布者,订阅者框架学习(包含scode的配置信息)

注意事项+vscode的一些环境配置(有一些自己的踩坑经历):1.打开有道,百度翻译等,会对ubuntu中的vscode 终端 产生影响,主要体现在复制粘贴和总是莫名其妙的出现 ctrl+c,从而使终端结束运行。

1.每次打开新的终端时,都要去工作空间的根目录source(语句为:source devel/setup.bash)一下,(特别是在这之间:catkin_make 之后,运行节点之前),否则运行节点报错或者直接就找不到节点。

2.发布方和订阅方的节点可以放在 一个功能包下,也可以放在不同的功能包下。

3.发布者,订阅者代码编写,如果函数忘记了,可以去ros wiki的教程 上面去找,也可以(框架留心里,函数到处找)。

3.在调用函数的时候,除了代码vs code 本身提示外,形参怎么写,ctrl+鼠标左键也可以调出。

4.在vscode中,其实可以快捷键编译。

在vscode界面中,然后按快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build

可以点击配置设置为默认,修改.vscode/tasks.json 文件

然后把里面的代码替换为如下代码:

{
// 有关 tasks.json 格式的文档,请参见
    // https://go.microsoft.com/fwlink/?LinkId=733558
    "version": "2.0.0",
    "tasks": [
        {
            "label": "catkin_make:debug", //代表提示的描述性信息
            "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
            "command": "catkin_make",//这个是我们需要运行的命令
            "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
            "group": {"kind":"build","isDefault":true},
            "presentation": {
                "reveal": "always"//可选always或者silence,代表是否输出信息
            },
            "problemMatcher": "$msCompile"
        }
    ]
}

5.编写*.cpp文件时,代码无法补齐,这和vscode环境配置有关系。

只需要在这个地方,改成C++17就可以了,如图:

我的ROS学习之路——话题通信之发布者,订阅者框架学习(包含scode的配置信息)_第1张图片

----------------------------------------------2022.3.1补 vscode的配置信息---------------------------------------

进行ROS开发:在scode中需要添加的插件为:ROS,CMake,C++,python,chinese(汉译)

(以上都是微软的(好像就除了CMake不是),一般是下载量最多的,而且说是说下这五种,但是下了之后,scode会多下很多其它的软件,但是无所谓,多就多了)

-------------------------------------------------------------------------------------------------------------------------

一 . 概念

前面已经讲了如何创建安装包和工作空间。这里只会把流程贴出来,不会细讲。

发布者代码框架为:

1.包含头文件

2.初始化节点

3.创建句柄

4.创建句柄对象,即创建发布者

5.创建发布逻辑

6.ros::spinonce

订阅者代码框架为:

1.包含头文件

2.初始化节点

3.创建句柄

4.创建句柄对象,即创建订阅者

5.编写回调函数

6.ros::spin();

二. 创建工作空间和软件包

开始编写程序之前,我已经假设你已经创建好了工作空间。

如我的,工作空间为:

mkdir -p /catkin_ws/src
cd catkin_ws
catkin_make

创建的软件包为:

cd src
catkin_create_pkg topic_pub_sub std_msgs rospy roscpp

然后回到根目录catkin_ws,右键打开终端,输入code .      此时就会打开vscode编辑器,就可以进行开发了。 

三.编写发布者部分

1.在~/catkin_ws_example/src/topic_pub_sub/src文件下新建一个topic_pub.cpp文件(文件命名随便你取,后面对应上就行),在这个cpp文件中加入如下代码:

//1.包含头文件
#include
#include// 引入这个头文件,是因为等会发布的话题消息是这种类型的

/*
订阅方实现:
    1.包含头文件
    2.初始化ROS节点
    3.创建节点句柄
    4.创建发布者对象
    5.发布编程逻辑
*/


int main(int argc,char *argv[])
{
    //2.初始化节点,也即创建了发布者
    ros::init(argc,argv,"zhaNan");
    //3.创建节点句柄
    ros::NodeHandle shuaige;
    //4.创建句柄对象,即创建发布者发的话题
    ros::Publisher pub = shuaige.advertise("che",10);
    //5.发布编程逻辑
    //5.1创建要发布的消息
    std_msgs::String msg;
     msg.data = "hello!";
     while(ros::ok())
     {
    //5.2发布消息
         pub.publish(msg);
     }
    return 0;
}

2.然后在修改CMakeLists.txt的配置。修改部分位置如下: 

我的ROS学习之路——话题通信之发布者,订阅者框架学习(包含scode的配置信息)_第2张图片

 代码就不贴出来,修改的地方不多,注释都有模板,找到位置,然后复制修改对应部分即可。

add_executable :是要*.cpp文件生成对应的可执行文件(即二进制文件)

target_link_libraries:是要把这个生成的可执行文件链接上库文件。

这样发布者就写好了,可以先测试一下这一部分有没有问题。

3.测试发布者

编译(编译部分,其实可以在vscode里面设置快捷键,没有的话就按着下面的步骤):

打开终端:

cd ~/catkin_ws

catkin_make

运行发布者:

source devel/setup.bah

rosrun topic_pub_sub topic_pub

此时无输出,正常。此时可以用内置命令 rostopic echo [话筒名称]  打印消息,看看是否发布成功(值得一提的是:一般验证发布者有没有发布消息,有两种方式:1.在代码中直接用ROS_INFO日志输出,直接在终端中打印出消息。  2.在终端中用rostopic echo [话题名称] 在终端输出消息)。

我的ROS学习之路——话题通信之发布者,订阅者框架学习(包含scode的配置信息)_第3张图片

四.编写订阅者部分

1.在~/catkin_ws_example/src/topic_pub_sub/src文件下新建一个topic_sub.cpp文件(文件命名随便你取,对应上就行),在这个cpp文件中加入如下代码:

//1.包含头文件
#include
#include

/*
订阅方实现:
    1.包含头文件
        ROS中文本类型 --->std_msgs /String.h
    2.初始化ROS节点
    3.创建节点句柄
    4.创建订阅者对象
    5.用回调函数处理订阅到的数据
    6.声明一个spin(); -----spin的字面意思是 回头
*/

//5.用回调函数处理订阅到的数据
void callback(const std_msgs::String::ConstPtr &msg)
{
    //通过msg获取并操作订阅到的数据
    ROS_INFO("I like %s",msg ->data.c_str());
}

/*经过测试回调函数中msg不需要另外定义;msg也不必和发布者中的数据名称相同;msg这个指针变量的名称也不是固定的,如写成msge一样可以;msg和下面的msg->data.c_str()需要对应;data.c_str()是和发布者发布数据相对应的;msg->name.c_str(),其中name是发布者定义的。
void chatterCallback(const std_msgs::String::ConstPtr& msg) //引用传递,这时存放的是由主调函数放进来的实参变量的地址
{
ROS_INFO(“i heard: [%s]”, msg->data.c_str()); //c_str()生成一个const char*指针,指向以空字符终止的数组。msg指向该数据 地址
}
————————————————
版权声明:本文为CSDN博主「月下的树」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41783322/article/details/108449729
*/









int main(int argc,char *argv[])
{
    //2.初始化ROS节点
    ros::init(argc, argv, "cuiHua");
   
   //3.创建节点句柄
    ros::NodeHandle shuaige;
    //4.创建订阅者对象
    ros::Subscriber  sub = shuaige.subscribe("che",10,callback);

    //6.声明一个spin();
    ros::spin();//字面意思就是回头,main函数会从上往下依次执行,callback是回调函数,会频繁的执行,而如果没有spin(),这个函数就只执行了一次,这肯定不行的
                          //其实在发布方也有这种类似的函数,叫ros::spinone(),他的作用也是  每次循环都要回头一次,目的也是处理程序中的回调函数,但发布方没有回调函数,就没有必要添加了
//区别与联系 ros::spin() 和 ros::spin Once () 都是用来集中处理本节点所有的回调函数,一般在节点存在订阅消失时,需要用到,区别在于执行 ros::spin() 后,程序不再往下执行,执行 ros::spin Once () 后程序依然可以往下执行。
    return 0;
}

PS:也许看着密密麻麻的很复杂,其实代码就几行,备注多了一点而已。

2.然后在修改CMakeLists.txt的配置。修改部分位置如下:

我的ROS学习之路——话题通信之发布者,订阅者框架学习(包含scode的配置信息)_第4张图片

 解释发布者那里已经说了。这里单独调试就没有必要了,

编译(同上,不要嫌啰嗦):

cd ~/catkin_ws

catkin_make

编译没有报错,

就和发布者一起调试看看有没有问题。

五.运行发布者和订阅者

最终结果如下:

我的ROS学习之路——话题通信之发布者,订阅者框架学习(包含scode的配置信息)_第5张图片

 好了!成功了!

                                                                                          本文学习出自——B站大学 赵虚左老师

你可能感兴趣的:(ubuntu,linux,运维)