ROS话题通信总结3(自定义发布文本)(调用)
Posted Z_FIEND°
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS话题通信总结3(自定义发布文本)(调用)相关的知识,希望对你有一定的参考价值。
ROS话题通信总结3(自定义发布文本)(调用)
目录
一、ROS话题通信总结1:https://blog.csdn.net/qq_33001335/article/details/117121210?spm=1001.2014.3001.5502
二、ROS话题通信总结2:(自定义发布文本)(配置):https://blog.csdn.net/qq_33001335/article/details/117195740
前言:
- 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty.... 但是,这些数据一般只包含一个 data 字段
- 结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如: 激光雷达的信息... std_msgs 由于描述性较差而显得力不从心,这种场景下可以使用自定义的消息类型
- 该文承接(二、ROS话题通信总结2:(自定义发布文本)(配置))一文,如若没有阅读,请阅读该文后返回
一、ROS话题通信总结1:https://blog.csdn.net/qq_33001335/article/details/117121210?spm=1001.2014.3001.5502
二、ROS话题通信总结2:(自定义发布文本)(配置):https://blog.csdn.net/qq_33001335/article/details/117195740
0.vscode 配置
不使用vscode的这一步可以跳过(不需要提示词的也可以跳过)
为了方便代码提示以及避免误抛异常,需要先配置 vscode,将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:
"/用户名/工作空间名/devel/include/**" //配置 head 文件的路径
如下图:
三、话题通信基本操作(C++)(自定义发布文本版)
注意事项:(基本操作之如果你不会C语言)
int main(int argc,char *argv[])//main函数模板
{
setlocale(LC_ALL,"");//防止中文乱码
ROS_INFO("THIS IS THE PUB DATA");//当启动该节点时会输出日志提示节点启动
//↓↓从这里开始写代码↓↓
/
return 0;
}
1.发布方实现
- 基本流程:
pub C++
- 1.include ros(包含ros的头文件)
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
- 2.ros_node init(ros节点初始化)
ros::init(argc,argv,"node_name");
//参数1与参数2 后期为节点传值使用
//参数3为节点名称(可随意取名),于rqt_graph命令中清晰查看节点信息
- 3.create node_handle(ros句柄创建)
ros::NodeHandle nh;//该类中封装了一些常用的ros功能
- 4.create pub(创建发布者对象)
ros::Publisher pub = nh.advertise<plumbing_pub_sub::person>("liaotian",10);
//参数1为要发布到的话题(话题名称可随意)
//参数2为队列中保存的消息数,超出此阈值的,先进的先销毁
- 4-1.<plumbing_pub_sub::person>代表调用工作空间下的devel/include/plumbing_pub_sub中的person.h头文件
- 5.write pub data,output data(组织被被发布的数据,并编写发布的数据)
- 5-1.pub data write(数据动态)
plumbing_pub_sub::person person;
//调用plumbing_pub_sub中的person结构体的person变量
- 5-2.set data(初始化结构体成员)
person.name = "zhangsan";
person.age = 18;
person.height = 1.73;
- 5-2.output speed set (输出频率设置)
ros::Rate rate(1);//每秒钟输出10次
- 5-3.while(输出循环)
while(ros::ok())
{
//每循环一次年龄增加一次,用来可视化通信成功后的时长
person.age++;
//发布消息(消息封装在person对象中)
pub.publish(person);
//输出日志(内容,姓名,年龄,身高)
ROS_INFO("PUB DATA:%s,%d,%.2f",person.name.c_str(),person.age,person.height);
//根据前面制定的发送频率自动休眠 休眠时间 = 1/频率
rate.sleep();
//暂无作用,官方推荐
ros::spinOnce();
}
CMakeList.TXT文件修改
//108行
//添加message_runtime依赖包
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES plumbing_pub_sub
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
//140行
//demo01_pub和demo01_pub.cpp分别为两个需要配置的参数,为.C文件映射的名称
add_executable(demo03_pub_person src/demo03_pub_person.cpp)
//151行
//这是为了防止依赖包难以被找到
add_dependencies(demo03_pub_person ${PROJECT_NAME}_generate_messages_cpp)
//160-162行
target_link_libraries(demo03_pub_person
${catkin_LIBRARIES}
)
package.xml文件修改
//55行添加
<build_depend>message_generation</build_depend>
//64行添加
<exec_depend>message_runtime</exec_depend>
2.订阅方实现
- 基本流程:
sub C++
- 1.include ros(包含ros头文件)
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
- 2.ros_node init(ros节点初始化)
ros::init(argc,argv,"node_name");
//参数1与参数2 后期为节点传值使用
//参数3为节点名称(可随意取名),于rqt_graph命令中清晰查看节点信息
- 3.create node_handle(创建句柄)
ros::NodeHandle nh;
- 4.create sub (创建订阅者对象)
ros::Subscriber sub = nh.subscribe("topic_name",10,doPerson);
/*
参数1为话题名称
参数2为队列中保存消息数
参数3为回调函数
*/
//回调函数:
void doPerson(const plumbing_pub_sub::person::ConstPtr& person)
{
ROS_INFO("SUB PERSON DATA:%s,%d,%.2f",person->name.c_str(),person->age,person->height);
}
- 注意:发布方与订阅方话题名称需要相同,否则无法进行话题通信
- 5.solve sub data(处理发布者数据)
- 6.spain del (回调函数)
ros::spin();
CMakeList.TXT文件修改
//142行
add_executable(demo04_sub_person src/demo04_sub_person.cpp)
//152行
add_dependencies(demo04_sub_person ${PROJECT_NAME}_generate_messages_cpp)
//163-165行
target_link_libraries(demo04_sub_person
${catkin_LIBRARIES}
)
实现运行:
//于工作空间下
$ source ./devel/setup.bash
$ rosrun plumbing_pub_sub demo03_pub_person
实现发布方
新开一个terminal窗口
$ source ./devel/setup.bash
$ rosrun plumbing_pub_sub demo04_sub_person
实现订阅方
三、话题通信基本操作(Python)(自定义发布文本版)
1.发布方实现
- 基本流程:
pub Python
1.import rospy(导入ros包)
2.ros_node init(ros节点初始化)
3.create pub(创建发布者对象)
4.create pub date and output data(组织被被发布的数据,并编写发布的数据)
因为Python代码实现较为简单,原理上的东西就不重复说,这里主要说一下用到的函数中的参数
Python代码实现发布方如下
#! /usr/bin/env python
#import ros
import rospy
from plumbing_pub_sub.msg import person
if __name__ == "__main__":
#2.ros_node init
rospy.init_node("dama")//参数1:节点名
#3.create pub
pub = rospy.Publisher("jiaoshetou",person,queue_size=10)
#参数1:话题名称
#参数2:"msgs.data class" (发布数据的数据类型)
#参数3:队列中保存消息数
#4.create pub data and output data
#4-1.create person data
p = person()
p.name = "aoteman"
p.age = 8
p.height = 1.85
#4-2.set rate
rate = rospy.Rate(1)
#4-3.while
while not rospy.is_shutdown():
pub.publish(p)
rospy.loginfo("pub data:%s,%d,%.2f",p.name,p.age,p.height)
rate.sleep()
CMakeList.TXT文件修改
#176行
并且.py因为在linux操作系统中没有可执行权限,还需在scripts(就是放.py文件的文件夹,一般于功能包目录下创建,与src目录平行)目录下添加:
$ chmod +x *.py
catkin_install_python(PROGRAMS
scripts/demo01_pub_p.py
scripts/demo02_sub_p.py
scripts/demo03_pub_person_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
2.发布方实现
- 基本流程:
sub Python
- 1.import rospy(导入ros包)
- 2.ros_node init(ros节点初始化)
- 3.create sub(创建订阅者对象)
- 4.back del (编写回调函数)
- 5.spin()
- 代码如下:
#! /usr/bin/env python
import rospy
from plumbing_pub_sub.msg import person
def doperson(p):
rospy.loginfo("sub data of person :%s,%d,%.2f",p.name,p.age,p.height)
if __name__ == "__main__":
#2.ros_node init
rospy.init_node("daye")
#3.create sub
sub = rospy.Subscriber("jiaoshetou",person,doperson)
#4.deal sub data
#5.spin()
rospy.spin()
CMakeList.TXT文件修改
#176行
并且.py因为在linux操作系统中没有可执行权限,还需在scripts(就是放.py文件的文件夹,一般于功能包目录下创建,与src目录平行)目录下添加:
$ chmod +x *.py
catkin_install_python(PROGRAMS
scripts/demo01_pub_p.py
scripts/demo02_sub_p.py
scripts/demo03_pub_person_p.py
scripts/demo04_sub_person_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
到此实现C++和Python的话题通信(自定义发布文本版)
以上是关于ROS话题通信总结3(自定义发布文本)(调用)的主要内容,如果未能解决你的问题,请参考以下文章