ROS1快速入门学习笔记 - 05发布者Publisher编程的实现

ROS话题模型发布/订阅实现步骤
本文围绕ROS话题模型(发布/订阅)展开,介绍了实现步骤。包括创建功能包,给出所需依赖;阐述C++代码实现发布者的具体步骤;说明了配置发布者代码编译规则,以及编译和运行发布者的方法;还提及Python代码的实现,流程与C++类似。

 

目录

 一、话题模型(发布/订阅)

二、实现步骤

1. 创建一个功能包

2. C++代码的实现

3. 配置发布者代码编译规则

4. 编译并运行发布者

5. Python代码的实现


一、话题模型(发布/订阅)

二、实现步骤

1. 创建一个功能包

$ cd~/catkin_ws/src
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

 其中roscpp rospy std_msgs geometry_msgs turtlesim为创建的功能包所需要的依赖 。

2. C++代码的实现

其中实现的发布者的Publisher的C++代码如下:

/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
	// ROS节点初始化
	ros::init(argc, argv, "velocity_publisher");

	// 创建节点句柄
	ros::NodeHandle n;

	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

	// 设置循环的频率
	ros::Rate loop_rate(10);

	int count = 0;
	while (ros::ok())
	{
	    // 初始化geometry_msgs::Twist类型的消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;

	    // 发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z);

	    // 按照循环频率延时
	    loop_rate.sleep();
	}

	return 0;
}

我们将其复制到创建的learning——topic 

 

实现一个发布者的步骤:

  •  初始化ROS节点;
  • 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型;
  • 创建消息数据;
  • 按照一定频率循环发布消息;

3. 配置发布者代码编译规则

需要将以下两句话拷贝到CMakeLists.txt里面

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

add_executable用于将velovity_publisher.cpp编译成velocity_publisher的可执行文件。

target_link_libraries用于将可执行文件与ros相关的库做一些链接,如c++的接口,py的接口等。

4. 编译并运行发布者

编译步骤如下:

$ cd~/catkin_ws
$ catkin_make
$ source devel/setup.bash   //设置环境变量
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher

如果感觉每次运行都需要配置环境变量太过麻烦,可以把它复制到主文件夹下面的隐藏文件.bashrc(按ctrl+h) 。

拉到最后一行,其中home后为自己的用户名。

最后我们可以得到海龟仿真器

 

其中经过编译生成的可执文件地址如下:

 

5. Python代码的实现

为区分py文件和c++文件,我们在功能包创建一个文件夹为scripts。

对于Py文件,我们需要让它具有可执行权限,右键属性将其修改(将其点为对勾)。

Py代码如下所示

#!/usr/bin/env python
# -*- coding: utf-8 -*-

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist

import rospy
from geometry_msgs.msg import Twist

def velocity_publisher():
	# ROS节点初始化
    rospy.init_node('velocity_publisher', anonymous=True)

	# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)

	#设置循环的频率
    rate = rospy.Rate(10) 

    while not rospy.is_shutdown():
		# 初始化geometry_msgs::Twist类型的消息
        vel_msg = Twist()
        vel_msg.linear.x = 0.5
        vel_msg.angular.z = 0.2

		# 发布消息
        turtle_vel_pub.publish(vel_msg)
    	rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z)

		# 按照循环频率延时
        rate.sleep()

if __name__ == '__main__':
    try:
        velocity_publisher()
    except rospy.ROSInterruptException:
        pass

实现流程与C++一样。

 

 

 

 

 

 

 

 

 

<think>嗯,用户需要了解ROS发布者Publisher编程实现方法。从引用内容来看,用户提供的参考资料已经覆盖了PythonC++两种语言的实现示例,还包含编译运行步骤。用户可能正在学习ROS基础通信机制,需要清晰的代码解析和操作指引。 用户提供的引用内容很全面,包含5个不同来源的实现片段:[1]是Python版本核心代码,[2]是运行命令,[3][4][5]分别是C++实现的不同变体。需要整合这些信息,突出关键步骤的共性。注意到引用[5]有个特殊功能——允许用户实时输入速度参数,这个交互特性值得单独说明。 在整理回答时,应该把PythonC++方案分开说明,因为两者的API调用方式差异较大(比如Py的rospy.Publisher() vs C++的node.advertise())。每个代码示例都要解释初始化节点、创建发布者、设置消息、循环发布这四个必要环节。编译运行部分需要补充catkin工作空间的操作细节,引用[2]提供了具体命令但不够完整。 考虑到用户可能不熟悉ROS工程管理,在“编译与运行”环节需要强调source环境变量这个易遗漏步骤。最后生成的问题要覆盖调试技巧(比如查看topic是否生效)、参数优化(队列长度选择)、异常处理(ROSInterruptException)等实用方向。 </think>以下是ROS发布者Publisher)的编程实现方法详解,涵盖PythonC++两种常用语言实现的核心步骤: --- ### 一、Python实现流程 ```python import rospy from geometry_msgs.msg import Twist # 导入消息类型 def velocity_publisher(): # 1. 初始化ROS节点(匿名参数避免节点重名) rospy.init_node('velocity_publisher', anonymous=True) # 2. 创建Publisher对象 # 参数:话题名称、消息类型、队列长度 turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) # 3. 设置循环频率(Hz) rate = rospy.Rate(10) while not rospy.is_shutdown(): # 4. 构造消息内容 vel_msg = Twist() vel_msg.linear.x = 0.5 # 线速度 vel_msg.angular.z = 0.2 # 角速度 # 5. 发布消息 turtle_vel_pub.publish(vel_msg) rospy.loginfo("发布速度命令 [%.2f m/s, %.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z) # 6. 延时控制 rate.sleep() if __name__ == '__main__': try: velocity_publisher() except rospy.ROSInterruptException: # 处理Ctrl+C中断 pass ``` **关键步骤说明**: 1. **节点初始化**:`rospy.init_node()` 注册唯一节点名[^3] 2. **创建发布者**:`rospy.Publisher()` 定义话题名称(如`/turtle1/cmd_vel`)和消息类型(如`Twist`) 3. **消息循环**:通过 `while not rospy.is_shutdown()` 保持持续发布 4. **频率控制**:`rospy.Rate()` + `rate.sleep()` 精确控制发布频率[^1] --- ### 二、C++实现流程 ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> int main(int argc, char **argv) { // 1. 初始化节点 ros::init(argc, argv, "velocity_publisher_cpp"); // 2. 创建节点句柄 ros::NodeHandle n; // 3. 创建Publisher对象 ros::Publisher pub = n.advertise<geometry_msgs::Twist>( "/turtle1/cmd_vel", 10 // 参数:话题名、队列长度 ); // 4. 设置循环频率 ros::Rate loop_rate(10); while (ros::ok()) { // 5. 构造消息 geometry_msgs::Twist vel_msg; vel_msg.linear.x = 0.5; vel_msg.angular.z = 0.2; // 6. 发布消息 pub.publish(vel_msg); ROS_INFO("发布速度命令 [%.2f m/s, %.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z); // 7. 延时控制 loop_rate.sleep(); } return 0; } ``` **C++特有步骤**: - 节点句柄 `ros::NodeHandle` 管理资源[^4] - 发布者通过 `advertise<>()` 模板函数创建 - 使用 `ros::ok()` 检查ROS系统状态[^5] --- ### 三、通用编译与运行步骤 1. **编译程序**(在catkin工作空间内): ```bash cd ~/catkin_ws catkin_make # 自动编译src内的代码 source devel/setup.bash # 刷新环境变量 ``` 2. **运行程序**: ```bash roscore # 启动ROS Master rosrun turtlesim turtlesim_node # 启动海龟仿真器 # Pythonrosrun 包名 velocity_publisher.py # C++rosrun 包名 velocity_publisher_cpp ``` 运行效果:海龟持续做圆周运动(线速度0.5m/s + 角速度0.2rad/s)[^2] --- ### 四、进阶功能实现 **动态参数输入**(参考引用[5]): ```cpp // 在C++循环前添加: double linear_x, angular_z; std::cout << "输入线速度(m/s): "; std::cin >> linear_x; std::cout << "输入角速度(rad/s): "; std::cin >> angular_z; // 在while循环中使用输入值 vel_msg.linear.x = linear_x; vel_msg.angular.z = angular_z; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值