概述
话题
1 发布者
1.1 c++
该c++文件在功能包下的src文件夹下创建
一般步骤:
- 1 节点初始化(节点名称)
- 2 创建节点句柄
- 3 创建话题(发布)话题名称 缓存大小
- 4 话题发布消息
#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 添加依赖 在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})
运行:
roscore
rosrun 功能包名 可执行文件
rosrun practice_pkg exec_file_name
注:生成的可执行文件在 catkin4/devel/lib/功能包名/ 文件夹下,在该目录终端下,输入以下指令可直接运行
./可执行文件名
./exec_file_name
1.2 python
python是可执行文件,可以直接执行,无需编译、链接
在功能包下创建scripts文件,用于存放python文件
注意:ubuntu 默认的文件都是不可执行的,需要将文件改为可执行的文件:
第一种:在python文件目录下的终端输入:
list -l # 查看文件是否为可执行文件
chmod +111 file.py # 手动改为可执行文件
第二种:直接在文件上右击——属性——权限——勾选可执行文件
#!/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
运行文件:
rosrun practice_pkg pra_topic_publisher.py
易错点:
#!/usr/bin/env python
python文件,首行必须有这个;
作用:指定为python解释器
2 订阅者
订阅话题
- 初始化节点(起节点名)
- 创建句柄
- 创建发布者(订阅节点名,缓存,回调函数)
- 创建回调函数
2.1 c++
文件名称:pra_topic_subscriber.cpp
#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中:
# 可执行文件名 链接的文件名称
add_executable(pra_topic_subscriber src/pra_topic_subscriber.cpp)
# 可执行文件与相关库做链接
target_link_libraries(pra_topic_subscriber ${catkin_LIBRARIES})
注意:以上完成后还需要编译,即在工作空间目录下运行catkin_make
订阅的话题是topic_pub_name_cpp,因此,运行此节点时也要运行之前的发布者节点
roscore
rosrun practice_pkg pra_topic_publisher
rosrun practice_pkg pra_topic_subscriber
2.2 python
#!/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 话题话题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复