我是靠谱客的博主 想人陪帆布鞋,这篇文章主要介绍【ros学习笔记】-3 话题话题,现在分享给大家,希望可以做个参考。

话题

1 发布者

1.1 c++

该c++文件在功能包下的src文件夹下创建

一般步骤:

  • 1 节点初始化(节点名称)
  • 2 创建节点句柄
  • 3 创建话题(发布)话题名称 缓存大小
  • 4 话题发布消息
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <ros/ros.h> #include <geometry_msgs/Twist.h> int main(int agrc,char **agrv){ //节点名称 ros::init(agrc,agrv,"pra_topic_publisher"); //节点句柄 ros::NodeHandle n; // 话题消息类型 话题名称 缓存大小 ros::Publisher pub = n.advertise<geometry_msgs::Twist>("topic_pub_name_cpp",10); //循环 ros::Rate r(1); geometry_msgs::Twist msg; msg.linear.x=1; msg.linear.y=1; float var=0; while(ros::ok()) { //话题发布消息 pub.publish(msg); //向屏幕打印 ROS_INFO("x:%.0f,y:%.0f",msg.linear.x,msg.linear.y); var = msg.linear.x; msg.linear.x = msg.linear.x + msg.linear.y; msg.linear.y = var; r.sleep(); } return 0; }

c++语言不可直接执行,需要编译成可执行文件,并与相关库链接

在功能包里的CMakeList文件:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1 添加依赖 在find_package添加roscpp等用到的依赖 find_package(catkin REQUIRED COMPONENTS roscpp std_msgs rospy ) # 2 include_directories( # include ${catkin_INCLUDE_DIRS} ) # 3 编译成可执行文件,并链接 # 编译成可执行文件 # 可执行文件名称(名称最好与节点名相同,好分辨) 对应的文件 add_executable(exec_file_name src/pub4.cpp) # 生成的可执行的文件与库链接 target_link_libraries(exec_file_name ${catkin_LIBRARIES})

运行:

复制代码
1
2
roscore
复制代码
1
2
3
rosrun 功能包名 可执行文件 rosrun practice_pkg exec_file_name

:生成的可执行文件在 catkin4/devel/lib/功能包名/ 文件夹下,在该目录终端下,输入以下指令可直接运行

复制代码
1
2
3
./可执行文件名 ./exec_file_name

1.2 python

python是可执行文件,可以直接执行,无需编译、链接
在功能包下创建scripts文件,用于存放python文件

注意:ubuntu 默认的文件都是不可执行的,需要将文件改为可执行的文件:
第一种:在python文件目录下的终端输入:

复制代码
1
2
3
list -l # 查看文件是否为可执行文件 chmod +111 file.py # 手动改为可执行文件

在这里插入图片描述
第二种:直接在文件上右击——属性——权限——勾选可执行文件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python # 上面的命令必须存在 此命令指定为python解释器 import rospy from geometry_msgs.msg import Twist def func(): # 节点名 anonymous默认是false,当是true时,出现同名节点会自动补一串数字,用以区分 rospy.init_node("pra_topic_publisher",anonymous=True) # 创建一个发布者 话题名称 消息类型 缓存 pub = rospy.Publisher("py_pub_topic",Twist,queue_size=10) #循环频率是2 rat = rospy.Rate(2) msg = Twist() msg.linear.x=1 msg.linear.y=1 while not rospy.is_shutdown(): # 话题发布消息 pub.publish(msg) # 向屏幕打印消息 rospy.loginfo(f'x:{msg.linear.x},y:{msg.linear.y}') msg.linear.x , msg.linear.y=msg.linear.x+msg.linear.y , msg.linear.x rat.sleep() if __name__=='__main__': try: func() except: pass

运行文件:

复制代码
1
2
rosrun practice_pkg pra_topic_publisher.py

在这里插入图片描述

易错点:

复制代码
1
2
#!/usr/bin/env python

python文件,首行必须有这个;
作用:指定为python解释器

2 订阅者

订阅话题

  • 初始化节点(起节点名)
  • 创建句柄
  • 创建发布者(订阅节点名,缓存,回调函数)
  • 创建回调函数

2.1 c++

文件名称:pra_topic_subscriber.cpp
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <ros/ros.h> #include <geometry_msgs/Twist.h> //创建回调函数,接受到订阅的消息,会自动进入回调函数 void CallBack(const geometry_msgs::Twist::ConstPtr& msg) { ROS_INFO("subscriber:x:%.0f,y:%.0f,z:%.0f",(msg->linear).x,(msg->linear).y,(msg->linear).z); } int main(int agrc,char **agrv){ //初始化节点 节点名 ros::init(agrc,agrv,"pra_node_subscriber_cpp"); //创建句柄 ros::NodeHandle n; //创建订阅者,订阅 叫topic_pub_name_cpp 的话题,缓存是20,接收到消息进入 回调函数 ros::Subscriber sub = n.subscribe("topic_pub_name_cpp",20,CallBack); //循环等待回调函数 ros::spin(); return 0; }

这个文件也需要配置,在CMakeList中:

复制代码
1
2
3
4
5
# 可执行文件名 链接的文件名称 add_executable(pra_topic_subscriber src/pra_topic_subscriber.cpp) # 可执行文件与相关库做链接 target_link_libraries(pra_topic_subscriber ${catkin_LIBRARIES})

注意:以上完成后还需要编译,即在工作空间目录下运行catkin_make

订阅的话题是topic_pub_name_cpp,因此,运行此节点时也要运行之前的发布者节点

复制代码
1
2
roscore
复制代码
1
2
rosrun practice_pkg pra_topic_publisher
复制代码
1
2
rosrun practice_pkg pra_topic_subscriber

在这里插入图片描述

2.2 python

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist # 回调函数 def CallBack(msg): rospy.loginfo(f"x:{msg.linear.x},y:{msg.linear.y}") def func(): # 节点初始化 rospy.init_node("pra_node_name_py") # 订阅信息,订阅的是名叫topic_name的话题 缓存20 rospy.Subscriber("topic_name",Twist,CallBack,queue_size=20) # 循环等待回调函数 rospy.spin() if __name__ == "__main__": try: func() except: pass

注意:不要忘了将文件改为可执行文件
在这里插入图片描述
注:必须先启动roscore

最后

以上就是想人陪帆布鞋最近收集整理的关于【ros学习笔记】-3 话题话题的全部内容,更多相关【ros学习笔记】-3内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部