【自动驾驶】话题通信

目录

切换到工作空间的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的目录结构

相关推荐
weixin_437497772 小时前
读书笔记:Context Engineering 2.0 (上)
人工智能·nlp
喝拿铁写前端2 小时前
前端开发者使用 AI 的能力层级——从表面使用到工程化能力的真正分水岭
前端·人工智能·程序员
goodfat2 小时前
Win11如何关闭自动更新 Win11暂停系统更新的设置方法【教程】
人工智能·禁止windows更新·win11优化工具
北京领雁科技2 小时前
领雁科技反洗钱案例白皮书暨人工智能在反洗钱系统中的深度应用
人工智能·科技·安全
落叶,听雪2 小时前
河南建站系统哪个好
大数据·人工智能·python
清月电子3 小时前
杰理AC109N系列AC1082 AC1074 AC1090 芯片停产替代及资料说明
人工智能·单片机·嵌入式硬件·物联网
Dev7z3 小时前
非线性MPC在自动驾驶路径跟踪与避障控制中的应用及Matlab实现
人工智能·matlab·自动驾驶
七月shi人3 小时前
AI浪潮下,前端路在何方
前端·人工智能·ai编程
橙汁味的风3 小时前
1隐马尔科夫模型HMM与条件随机场CRF
人工智能·深度学习·机器学习
itwangyang5203 小时前
AIDD-人工智能药物设计-AI 制药编码之战:预测癌症反应,选对方法是关键
人工智能