奥特学园ROS笔记--1(25-74节)------发布、订阅、服务/客户端、

【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili

下一篇:奥特学园ROS笔记--2(76-120节)_echo_gou的博客-优快云博客

目录

25节 基本配置

28节(1.4.2):

30节 launch文件 1.4.3

----------话题通信---------

38节 发布者和订阅者的具体建立流程

40节 发布方实现

41节  发布方按频率发送数据

42节 订阅方实现

43节 没有添加依赖/前几条数据丢失/回调函数

44节 计算图

45、46、48节 python实现发布者

47节 python实现订阅者

50节 解耦合

51节 自定义msg

52节 自定义msg具体实现

53节 C++使用自定义msg(配置)

 54节 使用C++自定义msg 发布方

55节 使用c++自定义msg 订阅方

57节 使用python自定义msg (配置)

58节 使用python自定义msg 发布方

 59节 使用python自定义msg 订阅方

61节 总结

----------服务通信---------

63节 理论模型

64、65节 自定义srv(准备)

66节 自定义srv(服务端)

 67、68节 自定义srv(客户端)

69节 先启动客户端

70 节 python实现srv(准备)

71节 python实现srv(服务端)

72、73节 python实现srv(客户端)

74节 先启动客户端(python)


25节 基本配置

1 建立文件夹,文件夹下建立src

2 在src文件外面:catkin_make后生成build和devel

3 code .打开vscode,然后vscode中ctrl+shift+b,选择后面小齿轮,将以下代码对tasks.json进行覆盖。这里目的是配置编译相关的参数,之后ctrl+shift+b即可编译。

{
// 有关 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"
        }
    ]
}

4 右键src创建ros功能包:,create catkin package ,分别输入名字和依赖(roscpp rospy std_mags)。

运行步骤

1 roscore

2 source ./devel/setup.bash

3 rosun ......

修改代码之后一定记得重新编译

注:在写代码的时候有红色波浪线则,如果确实没有错那就ctrl+shift+b编译一下。

python步骤:

1 编写代码,代码中第一二行应该加入

#! /usr/bin/env python
#coding=UTF-8

2 添加可执行权限:

1打开scripts所在的文件夹的终端
2输入:chmod +x *.py

3 cmakelist修改:

改成对应的文件名称

 4 ctrl+shift+b编译

5 然后运行

1 roscore
2 source ./devel/setup.bash
rosrun plumbing_pub_sub demo01_pub_p.py

28节(1.4.2):

1 ROSnoetic版本不配置CMakeLists的python的话,只能支持python2不能支持python3

2 出现问题:/usr/bin/env:没有那个文件或者目录

30节 launch文件 1.4.3

1 这个文件可以一次性启动多个节点

2 是一个XML文件

3 在功能包下面创建文件夹launch,然后创建.launch文件

<!-- 启动乌龟gui和键盘控制节点 -->
<launch>
    <!--添加被执行的节点-->
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
</launch>

这三步就相当于之前启动的三个终端执行的语句,其中前后两个<launch>对应的是之前启动roscore的步骤

然后在命令行source以下后

roslaunch xxx文件夹 xxx.launch  即可

----------话题通信---------

38节 发布者和订阅者的具体建立流程

1发布者和订阅者分别在master中进行注册

2master根据注册表信息对两者进行匹配,匹配后master给订阅者发送发布者的rpc地址

3订阅者通过地址和发布者进行链接,然后开始通信

注:使用的协议有rpc和tcp协议;发布者和订阅者建立链接后,master就可以关闭了;上述实现流程已经封装了,了解即可;我们关注的是发布者和订阅者的实现和消息载体;master的作用可以理解为管理和匹配话题、建立两者之间的连接用的

40节 发布方实现

图中一个是发布者一个是订阅者,创建在src中。

    实现流程:
        1.包含头文件
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 发布者 对象
        5.组织被发布的数据,并编写逻辑发布数据

    //初始化节点
    ros::init(argc,argv,"ergouzi");
    
    //创建节点句柄
    ros::NodeHandle nh;
    
    //创建发布对象
    ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);  //10是队列长度,如果发出还没有被接受就会放到队列里面。
    
    //创建消息对象的变量,用于发布数据
    std_msgs::String msg; 
    
    //发布消息
    while(ros::ok())  //节点是否存活,节点死亡ctrl+c结束就死亡
    {
        msg.data="hello";
        pub.publish(msg);  //
    }

其中ros::ok()代表节点是否还存活;

41节  发布方按频率发送数据

上一节的补充

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

//发布方实现
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    //初始化节点
    ros::init(argc,argv,"ergouzi");
    
    //创建节点句柄
    ros::NodeHandle nh;
    
    //创建发布对象
    ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);
    
    //创建消息对象的变量

    std_msgs::String msg;
    //发布频率
    ros::Rate rate(10);

    int count=0;
    //发布消息
    while(ros::ok())
    {
        count++;
        //msg.data="hello";
        //实现字符串拼接数字
        std::stringstream ss;
        ss<<"hello --- -"<<count;   //将hello字符和count数字输入到ss
        msg.data=ss.str();
        pub.publish(msg);
        //添加日志
        ROS_INFO("发布的数据是%s",ss.str().c_str());  //打印到控制台上
        rate.sleep();  //睡眠0.1秒
    }

    return 0;
}

42节 订阅方实现

步骤和上面两节相似

 实现流程:
        1.包含头文件
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 订阅者 对象
        5.处理订阅的消息(回调函数)
        6.设置循环调用回调函数

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

void doMsg(const std_msgs::String::ConstPtr &msg){  //通过msg这个参数获取并且操作订阅道到的数据
    ROS_INFO("cuihua订阅到的数据是:%s",msg->data.c_str());
}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"cuihua");  //节点名称具有唯一性
    ros::NodeHandle nh; //句柄
    ros::Subscriber sub=nh.subscribe("fang",10,doMsg); //topic一定和ergouzi保持一致才可通信.发布者那边的泛型可以不添加,订阅者这边可以自动识别。
    ros::spin(); //因为上一行的回调函数doMsg需要被频繁的执行去获取数据,所以这一行作用就是处理回调函数;
    // while(ros::ok()){  这样效果也一样
    //     ros::spinOnce();
    // }
    return 0;
}

43节 没有添加依赖/前几条数据丢失/回调函数

上一节出现的问题的一个补充

1 在创建功能包的时候如果没有添加依赖,建议直接删除这个包重新创建。

2 订阅者订阅发布者的数据时,前面几条数据可能会丢失。

原因是publisher还没有在roscore中注册完毕。

解决:可以在注册后加入休眠步骤,来延迟第一条数据的发送。

 即ros::Duration(3).sleep();  这里休眠3秒。

3 回调函数:

每次订阅者订阅到外部的消息就执行一次回调函数,而不是代码上出现一次就调用一次

44节 查看计算图

终端输入

rqt_graph 

显示计算图,了解节点之间的关系

注:计算图的查看必须要在程序运行的时候才可以查看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值