[ROS]四、发布者Publisher的编程实现

[ROS]一、ROS的基本概念
[ROS]二、命令与工具的使用
[ROS]三、建立工作空间

文章目录

  • 前言
  • 一、话题发布/订阅模型
  • 二、实现的步骤
    • 1.创建功能包(上一章节有讲)
    • 2.实现发布者的流程
    • 3.配置发布者代码编译规则
    • 4.实现同一功能的python版程序
  • 总结


前言

在之前的教程中,我们是通过命令行的形式和键盘的控制形式使得海龟动起来,现在通过程序的方式实现海龟动起来


提示:以下是本篇文章正文内容,下面案例可供参考

一、话题发布/订阅模型

[ROS]四、发布者Publisher的编程实现_第1张图片这个模型中主要有两个节点(node)一个是速度发布节点Publisher(Turtle Velovity),一个是订阅节点Subscriber(turtlesim)即海龟仿真器,今天要通过程序实现的就是速度发布节点Publisher(Turtle Velovity),来发布Message,这个Message的结构是geometry_msgs::Twist,里面分为角速度和线速度,再通过话题Topic(/turtle1/cmd_vel)这个管道把数据传送给Subscriber(turtlesim),Subscriber(turtlesim)就可以订阅这些数据来控制海龟

二、实现的步骤

1.创建功能包(上一章节有讲)

打开终端输入下面的命令
cd ~/catkin_ws_me/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim  #learning_topic功能包的名称,后面就是依赖

2.实现发布者的流程

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

首先切换到learning_topic/src目录下

cd ~/catkin_ws_me/src/learning_topic/src

创建名为velocity_publisher.cpp的文件,将如下的代码粘贴进去,这个是采用c++来实现的

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

int main(int argc, char **argv)
{
     
	// 用ros::init完成ROS节点初始化,(argc, argv是两个参数,默认就可以了,不需要配置)velocity_publisher为节点名,注意节点名称是不可以重复的
	ros::init(argc, argv, "velocity_publisher");

	// 创建节点句柄,管理ros的API接口
	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
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;

	    // 发布消息。利用publish方法发布vel_msg数据内容
		turtle_vel_pub.publish(vel_msg);
	    //类似print使得相关信息显示
		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;
}

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

这个时候就需要编辑CMakelists.txt文件,目的是为了

  • 设置需要编译的代码和生成的可执行文件;
  • 设置连接库
    打开如图选中的文件
    [ROS]四、发布者Publisher的编程实现_第2张图片然后将下面这两句话放到这个位置
    [ROS]四、发布者Publisher的编程实现_第3张图片add_executable(velocity_publisher src/velocity_publisher.cpp)这句话的意思是将src/velocity_publisher.cpp这个文件编译生成velocity_publisher可执行文件;target_link_libraries的功能是将velocity_publisher可执行文件跟ros的一些库做连接,eg.C++或则python的一些接口。
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

然后回到工作空间的根目录下来做编译。

cd ~/catkin_ws_me
catkin_make
source devel/setup.bash	#添加换进变量。
roscore #第一个终端运行
rosrun turtlesim turtlesim_node	#第二个终端运行
rosrun learning_topic velocity_publisher	#第三个终端运行

执行上面的命令将会出现如下图的结果
[ROS]四、发布者Publisher的编程实现_第4张图片

4.实现同一功能的python版程序

在learning_topic文件创建文件夹scripts来存放python文件,如图
[ROS]四、发布者Publisher的编程实现_第5张图片
注意:python文件一定要赋予它可执行文件,右键选择属性,点击权限,将允许做为可执行文件这个选项打勾
[ROS]四、发布者Publisher的编程实现_第6张图片

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布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.9
        vel_msg.angular.z = 0.9

		# 发布消息
        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



总结

好了今天就学到这里了,不要放弃前进的脚步。

你可能感兴趣的:(ros,c++,python,linux)