当前位置: 首页 > news >正文

ROS基础学习4-发布者publisher编程实现

我发布的主题叫test,.cpp文件叫publisher_test

创建功能包

创建发布者代码

创建新的cpp文件:touch main.cpp

功能包一定放在工作空间的src路径下 ,功能包的功能实现文件.cpp文件放在功能包src路径下

在功能包的src文件里可以放入各种功能代码如cpp文件

驱动小乌龟运行的一个示例代码:

// 引入ROS核心头文件,提供ROS节点、话题通信等基础功能 #include <ros/ros.h> // 引入几何消息类型头文件,对应速度控制的 Twist 类型 #include <geometry_msgs/Twist.h> // 主函数:ROS节点入口 int main(int argc, char **argv) { // 1. 初始化ROS节点 // 参数:argc/argv(命令行参数)、节点名称(唯一)、匿名命名可选 ros::init(argc, argv, "velocity_publisher"); // 2. 创建ROS节点句柄 // 节点句柄是ROS操作的核心,用于创建发布者、订阅者等 ros::NodeHandle n; // 3. 创建发布者(Publisher) // 作用:向指定话题发布消息 // 参数:话题名("/turtle1/cmd_vel")、消息类型(geometry_msgs::Twist)、队列长度(10) ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10); // 4. 设置循环发布频率(10Hz = 每秒发布10次) ros::Rate loop_rate(10); // 初始化计数变量(可控制发布次数,这里无强制限制,循环持续) int count = 0; // 5. 循环发布消息(ROS节点未关闭时持续运行) while (ros::ok()) { // 6. 初始化速度控制消息 // geometry_msgs::Twist 是ROS标准速度消息,包含线速度和角速度 geometry_msgs::Twist vel_msg; // 线速度x轴:控制乌龟前后移动(正值向前,负值向后),这里设0.5 m/s vel_msg.linear.x = 0.5; // 角速度z轴:控制乌龟旋转(正值逆时针,负值顺时针),这里设0.2 rad/s vel_msg.angular.z = 0.2; // 7. 发布消息到话题 turtle_vel_pub.publish(vel_msg); // 8. 打印日志信息(终端输出发布状态) ROS_INFO("Publish velocity: linear.x=%.2f, angular.z=%.2f", vel_msg.linear.x, vel_msg.angular.z); // 9. 按照设定频率休眠(保证10Hz的发布频率) loop_rate.sleep(); // 计数递增(可选,用于监控循环次数) count++; } // 节点正常退出 return 0; }

配置发布者代码编译规则

配置cmakelists.txt中的编译规则

编译内容放在build条目下:

add_executable(publisher_test src/publisher_test.cpp)

target_link_libraries(publisher_test ${catkin_LIBRARIES})

第一行描述把 .cpp编译成什么样的可执行文件

第二行链接ros和库

编译并运行发布者

编译要回到工作空间的根目录下:用catkin_make编译

source devel行在设置环境变量,必须进行。为了方便,直接利用:

Ctrl+h显示隐藏文件,在最最最主目录下.bashrc中设置工作空间环境变量

Ros执行python文件时,要右键属性确定是否是可执行文件

http://www.cnnetsun.cn/news/1264907.html

相关文章:

  • 基于协同过滤的房屋租赁推荐系统:打造便捷租房体验
  • (实战篇)手把手实战:利用永恒之蓝(MS17-010)漏洞深入理解渗透测试+修复方法
  • 最新全工具版本Qt+OpenCV通用视觉框架全套源码。 工具可扩展。 除了opencv和相机s...
  • 最近在捣鼓信号异常检测的时候,发现有个挺有意思的方法。不需要复杂的深度学习框架,直接在MATLAB里用传统信号处理+图像处理思路就能搞定。咱们先看个实际案例
  • AI应用架构师总结:智能搜索系统优化的8个核心指标与提升方法
  • 序列线性规划(SLP)在可再生能源系统优化中的应用与挑战
  • 提示工程架构师必学:Agentic AI中的强化学习结合策略
  • Qwen3-VL-8B与STM32的跨界实践:嵌入式设备视觉问答原型开发
  • 轻松抓取虫虫钢琴在线音频的实用技巧
  • GLM-4V-9B开源大模型应用:科研论文插图智能解读+方法复现提示生成
  • SpringBoot Jar包热更新秘籍:零停机修改配置文件的运维技巧
  • postgresql链接详解
  • 深夜还在敲代码?别硬撑,你已经很辛苦了
  • Python实战:身份证OCR识别与结构化数据提取全攻略
  • MLX90614红外测温传感器在天空星HC32F4A0开发板上的SMBus驱动移植与实战
  • Heron Handoff 插件:Figma 设计标注的离线革命与跨平台协作新体验
  • Qwen3-ASR-1.7B模型安全教程:防御对抗样本攻击
  • Mac 上高效编写 LaTeX:VSCode + LaTeX Workshop 完全配置指南
  • SillyTavern进阶配置指南:打造个性化AI对话体验
  • 从零到上线:基于快马平台实战构建可部署的trae国际版音乐应用
  • 【bypass-paywalls-chrome-clean】:开源内容访问优化工具的核心价值与实战指南
  • 模电实战:从比例到积分,运算电路的工程设计与避坑指南
  • GD32实战:用485和Ymodem协议实现远程固件升级(含完整代码解析)
  • 【MySQL】索引原理详解
  • Sambert镜像快速入门:部署、测试、应用,一站式语音合成体验
  • ai辅助开发:让快马平台的智能模型成为你的私人c++面试教练
  • 从“獬豸杯”赛题解析:实战演练电子数据取证的核心流程与技术要点
  • 【ubuntu】systemd 服务依赖关系实战:从基础配置到故障排查
  • GD32VW553驱动0.96寸IPS彩屏(ST7735)移植与显示实战
  • 造相Z-Image进阶应用:结合提示词工程,打造你的专属绘画风格