[ROS]四、发布者Publisher的编程实现
[ROS]一、ROS的基本概念
[ROS]二、命令与工具的使用
[ROS]三、建立工作空间
文章目录
- 前言
- 一、话题发布/订阅模型
- 二、实现的步骤
- 1.创建功能包(上一章节有讲)
- 2.实现发布者的流程
- 3.配置发布者代码编译规则
- 4.实现同一功能的python版程序
- 总结
前言
在之前的教程中,我们是通过命令行的形式和键盘的控制形式使得海龟动起来,现在通过程序的方式实现海龟动起来
提示:以下是本篇文章正文内容,下面案例可供参考
一、话题发布/订阅模型
这个模型中主要有两个节点(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 <ros/ros.h>
#include <geometry_msgs/Twist.h>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,队列长度10ros::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_msgvel_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文件,目的是为了
- 设置需要编译的代码和生成的可执行文件;
- 设置连接库
打开如图选中的文件
然后将下面这两句话放到这个位置
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 #第三个终端运行
执行上面的命令将会出现如下图的结果
4.实现同一功能的python版程序
在learning_topic文件创建文件夹scripts来存放python文件,如图
注意:python文件一定要赋予它可执行文件,右键选择属性,点击权限,将允许做为可执行文件这个选项打勾
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twistimport rospy
from geometry_msgs.msg import Twistdef velocity_publisher():# ROS节点初始化rospy.init_node('velocity_publisher', anonymous=True)# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10turtle_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.9vel_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]四、发布者Publisher的编程实现相关推荐
- ros(2) 发布者publisher的编程实现
1.创建功能包 cd ~/testROS_ws/src catkin_create_pkg topic_publisher std_msgs rospy roscpp geometry_msgs tu ...
- 【RK3399Pro学习笔记】六、ROS发布者Publisher的编程实现
目录 如何实现一个发布者 C++ 创建功能包 编写程序 配置CMakeLists.txt 编译并运行发布者 python 创建并编写脚本 运行 平台:华硕 Thinker Edge R 瑞芯微 RK3 ...
- 【ROS入门21讲二刷古月居】学习笔记3 发布者Publisher的编程实现
系列文章目录 第一章 ROS命令行工具 第二章 创建工作空间与功能包 第三章 发布者Publisher的编程实现 文章目录 系列文章目录 话题模型 第一步,创建功能包 如何实现一个发布者 包含库 初始 ...
- 【ROS入门21讲】发布者Publisher的编程使用
[ROS入门21讲]发布者Publisher的编程使用 本文章是针对bilibili古月居up的[ROS入门21讲]所作的笔记,笔记从第8讲开始,主要记录一些关键内容方便查阅. 视频连接:[ROS入门 ...
- ROS入门-8.发布者Publisher的编程实现
主要实现功能是:让我们在海龟仿真器里的海龟通过程序控制动起来 之前过程中,主要是通过命令行或者通过键盘控制形式来发布速度指令 以下是该话题通讯的问题模型 今天学习怎样通过一个程序来实现其中的发布者,其 ...
- 10.发布者Publisher的编程实现
学习视频:https://www.bilibili.com/video/BV1zt411G7Vn?t=1225&p=10 目标:通过程序发布指令让小海龟运动 一.创建工作空间和功能包 1.创建 ...
- ROS学习笔记publisher的编程实现c++详解
前言 基于B站ROS公开课:[古月居]古月·ROS入门21讲 基于Ubuntu 20.04.1.Noetic版本 提示:以下是本篇文章正文内容,下面案例可供参考 一.ros publisher C++ ...
- 【ROS学习笔记】(三)发布者Publisher的实现
一.目标功能 ROS Master内有两个节点,一个是Subscriber(turtlesim),一个是Publisher,发布者通过程序实现发布Message,Message的内容包括线速度.角度, ...
- QT开发(四十)——GraphicsView编程
QT开发(四十)--GraphicsView编程 一.QGraphicsScene 1.QGraphicsScene QGraphicsScene继承自QObject,是一个管理图元的容器,与QGra ...
最新文章
- 性能提升3倍的树莓派4,被爆设计缺陷!
- Tapestry IoC Decorator
- Flask 教程 第十六章:全文搜索
- jQuery的this $this $(this)
- SpringCloudConfig(了解)
- linux ntfs 密码,linux 加载ntfs和fat32分区
- 组内Linq培训记录
- 解决Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory
- springboot调用so文件
- 微信小程序实现人脸识别认证
- MySQL二进制日志文件格式
- 为什么计算机能读懂 1 和 0
- IEEE Transactions on Vehicular Technology投稿经验分享-1
- Mac 隔空投送 AirDrop 搜不到 iPhone
- android sdk tools是什么意思,android sdk tools有什么用
- 怎么把一副图片用PS调成简笔画?
- linux centos 访问根目录 not accessable
- python创建学生类姓名学号_定义一个学生类,包含学号、姓名、平时成绩和考核成绩四个数据成员和以下成员方法(用Python语言):...
- 梅科尔工作室——鸿蒙设备开发实战004:内核开发
- C语言实现简单的四则运算计算器