【自动驾驶】话题通信

目录

切换到工作空间的src目录下:

构建发布者

bash 复制代码
catkin_create_pkg publisher std_msgs rospy roscpp

编写发布者程序:

cpp 复制代码
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

int main(int argc, char  *argv[])
{   
    //设置编码
    setlocale(LC_ALL,"");

    //2.初始化 ROS 节点:命名(唯一)
    // 参数1和参数2 后期为节点传值会使用
    // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc,argv,"talker");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

    //4.实例化 发布者 对象
    //泛型: 发布的消息类型
    //参数1: 要发布到的话题
    //参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)
    ros::Publisher pub = nh.advertise<std_msgs::String>("test",10);

    //5.组织被发布的数据,并编写逻辑发布数据
    //数据(动态组织)
    std_msgs::String msg;

    std::string msg_front = "这里是发布者发来的信息"; //消息前缀
    int count = 0; //消息计数器
   //发布消息前睡眠0.5秒,确保消息发布成功
    ros::Duration(0.5).sleep();
    //这里是每秒通过一次,剩余时间则阻塞在下面的r.sleep
    ros::Rate r(1);

    //节点不死
    while (ros::ok())
    {
        //使用 stringstream 拼接字符串与编号
        std::stringstream ss;
        ss << msg_front << count;
        msg.data = ss.str();
        //发布消息
        pub.publish(msg);
        //加入调试,打印发送的消息
        ROS_INFO("发送的消息:%s",msg.data.c_str());
        //根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;
        r.sleep();
        count++;//循环结束前,让 count 自增
        //暂无应用
        ros::spinOnce();
    }
    return 0;
}

在cmakelist中把:

bash 复制代码
add_executable(${PROJECT_NAME}_node src/publisher.cpp)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

注释去掉

构建订阅者

同样先创建包:

bash 复制代码
catkin_create_pkg subscriber std_msgs rospy roscpp

然后构建订阅者节点:

cpp 复制代码
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"
//这里创建了回调函数,接收信息后传递的是std_msgs::String类型的常指针
void doMsg(const std_msgs::String::ConstPtr& msg_p){
    ROS_INFO("作为订阅者,我接收到了:%s",msg_p->data.c_str());

}
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"listener");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;

    //4.实例化 订阅者 对象
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("test",10,doMsg);
    //5.处理订阅的消息(回调函数)

    ros::spin();//循环读取接收的数据,并调用回调函数处理

    return 0;
}

对于cmakelist的操作相同,添加构造对象及对象所需的依赖:

cpp 复制代码
add_executable(${PROJECT_NAME}_node src/subscriber.cpp)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

然后退回到工作空间所在的下层目录,进行catkin_make编译。

编写lanch文件自动启动节点

在功能包目录下新建launch目录,下面放launch文件。形如:

bash 复制代码
<launch>
    <!-- screen表示输出到屏幕上 -->
    <node pkg="publisher" type="publisher_node" name="talker" output="screen" />
</launch>

其中:

pkg="包名"

节点所属的包

type="nodeType"

节点类型(与之相同名称的可执行文件)

name="nodeName"

节点名称(在 ROS 网络拓扑中节点的名称)

测试运行

激活工作空间环境变量:

bash 复制代码
source ./devel/setup.bash

启动:

bash 复制代码
rosluanch publisher start.launch
rosluanch subscriber start.launch

ROS的目录结构

相关推荐
paid槮1 小时前
机器学习总结
人工智能·深度学习·机器学习
Hello123网站1 小时前
职得AI简历-免费AI简历生成工具
人工智能·ai工具
亚里随笔2 小时前
稳定且高效:GSPO如何革新大型语言模型的强化学习训练?
人工智能·机器学习·语言模型·自然语言处理·llm·rlhf
荼蘼2 小时前
机器学习之PCA降维
人工智能·机器学习
东方不败之鸭梨的测试笔记2 小时前
智能测试用例生成工具设计
人工智能·ai·langchain
失散135 小时前
深度学习——02 PyTorch
人工智能·pytorch·深度学习
图灵学术计算机论文辅导5 小时前
傅里叶变换+attention机制,深耕深度学习领域
人工智能·python·深度学习·计算机网络·考研·机器学习·计算机视觉
重启的码农7 小时前
ggml 介绍(4) 计算图 (ggml_cgraph)
c++·人工智能
重启的码农7 小时前
ggml 介绍(5) GGUF 上下文 (gguf_context)
c++·人工智能·神经网络
R-G-B7 小时前
OpenCV Python——报错AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘,解决办法
人工智能·python·opencv·opencv python·attributeerror·module ‘cv2‘·no attribute