话题通信下ROS项目的结构配置

① 创建符合ROS标准的项目框架

② 添加构建ROS标准项目文件的库

当我们使用vscode打开ROS标准项目文件时,按下Ctrl+Shift+B可以进行编译,但是我们需要设置构建ROS标准项目文件所需的功能包:

{
// 有关 tasks.json 格式的文档,请参见  // https://go.microsoft.com/fwlink/?LinkId=733558  "version": "2.0.0",  "tasks": [  {  "label": "catkin_make:debug", //代表提示的描述性信息  "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行  "command": "catkin_make",//这个是我们需要运行的命令  "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”  "group": {"kind":"build","isDefault":true},  "presentation": {  "reveal": "always"//可选always或者silence,代表是否输出信息  },  "problemMatcher": "$msCompile"  }  ]
} 

③ 创建功能包

选定 src 右击 ---> create catkin package ,然后给功能包取个名字、给功能包添加依赖项(roscpp,std_msgs)。

④ 配置package.xml和CMakelist.txt文件

package.xml文件中指明了“将项目文件编译成符合ROS标准的项目文件所需的功能包”以及“将符合ROS标准的项目文件编译成计算机可以执行的可执行文件所需的功能包”;CMakelist.txt文件则说明了“如何应用这些功能包来将项目文件一步一步地编译成可执行文件”。

在package.xml中,由于我们使用C++编写的节点文件,因此:

<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend> // 手动添加<build_export_depend>roscpp</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>  <exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend> // 手动添加

在上述代码中,我们在构建符合ROS标准的项目文件时,需要用到roscpp,std_msgs,message_generation这三个功能包,而在将符合ROS标准的项目文件编译成计算机可以识别的可执行文件时,我们需要用到roscpp,std_msgs,message_runtime三个功能包。

还记得我们一开始创建功能包时添加的依赖项吗?就是roscpp和std_msgs这两个功能包。我们在package.xml中也看到了这两个功能包贯穿项目文件编译流程的始终。但是message_generation和message_runtime这两个功能包不会在编译全周期内起作用,因此我们不可以在创建功能包时将它们作为编译依赖项。我们需要人为添加这两个功能包:message_generation和message_runtime分别在“将项目文件编译成符合ROS标准的项目文件”和“将符合ROS标准的项目文件编译成计算机可以识别的可执行文件”阶段起作用。

比起配置package.xml文件,配置CMakelist.txt文件稍微复杂一些:

find_package(catkin REQUIRED COMPONENTS  roscpp  std_msgs  message_generation
)
add_message_files(  FILES  Person.msg
)
generate_messages(  DEPENDENCIES  std_msgs
) 

这一部分为“将项目文件编译成符合ROS标准的项目文件”所需的功能包,以及指明自定义.msg消息文件(初始ROS项目框架中并没有自定义消息文件,我们必须在功能包下自定义msg文件夹,再在msg文件夹中创建XXX.msg文件即可)。上述代码的含义为:

1. “将项目文件编译成符合ROS标准的项目文件”所需的功能包是:roscpp,std_msgs,message_generation;

2. 我们自定义的消息文件是Person.msg;

3. 我们自定义的消息文件其实就是ROS基本数据类型的一个集合,因此我们需要用std_msgs功能包来对我们的自定义,msg消息文件进行编译。

catkin_package(  CATKIN_DEPENDS roscpp std_msgs message_runtime
)
add_executable(publisher src/publisher.cpp)
add_executable(subscriber src/subscriber.cpp)  add_dependencies(publisher ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(subscriber ${PROJECT_NAME}_generate_messages_cpp)  target_link_libraries(publisher  ${catkin_LIBRARIES}
)
target_link_libraries(subscriber  ${catkin_LIBRARIES}
)  

1. 将符合ROS标准的项目文件编译成计算机可执行的文件需要的功能包有:roscpp,std_msgs,message_runtime;

2. 在这个功能包中,C++源文件为publisher.cpp,subscriber.cpp,我们要将这两个文件进行编译链接最终生成可执行文件。

⑤ 编写XXX.msg自定义消息文件(这里我自定义的消息名称为Person.msg)

Header header
float32 height
string name  

待编写玩全部文件之后,按下Ctrl+Shift+B既可编译,编译得到devel/include下Person.h

但是,这时候由于Vscode的工作目录并没有包含Person.h文件的目录,因此,当我们在其他文件调用Person.h文件时,会报错。我们可以在c_cpp_properties.json文件中添加devel/include下Person.h的工作目录即可解决上述问题。

⑥ 编写C++源文件:

1. 订阅端.cpp源文件:

#include "ros/ros.h"
#include "Topic/Person.h"  void CallbackFunc(const Topic::Person::ConstPtr& ptr) // 回调函数——负责处理接收到的消息
{  ROS_INFO("Time:%d,Seq:%d,Frame:%s\n\t",ptr->header.stamp.sec,ptr->header.seq,ptr->header.frame_id.c_str());  ROS_INFO("height:%f,name:%s\n\t",ptr->height,ptr->name.c_str());
}  int main(int argc, char* argv[])
{  setlocale(LC_ALL,""); // 将设置本地化——确保写中文不会出乱码ros::init(argc,argv,"subscriber"); // 节点接收参数的入口ros::NodeHandle nh; // 节点句柄——节点与master主节点交流的通道ros::Subscriber sub = nh.subscribe<Topic::Person>("chatter",10,CallbackFunc); // 将订阅者的信息利用subscriber函数发布至master主节点之中等待与对应的发布者配对,一旦配对成功节点句柄就会返回一个订阅者对象——相当于接收消息的通道ros::spin();  // 阻塞函数:等待发布端消息,接收到消息立刻跳转至回调函数return 0;
} 

2. 发布端.cpp源文件:

#include "ros/ros.h"
#include "Topic/Person.h"  int main(int argc, char* argv[])
{  setlocale(LC_ALL,"");  ros::init(argc,argv,"publisher");  ros::NodeHandle nh;  ros::Publisher pub = nh.advertise<Topic::Person>("chatter",10);  Topic::Person p;  p.header.frame_id = "earth"; // Header头文件中用于说明数据所在的坐标系 p.height = 10.0;  p.name = "father";  ros::Rate r(1); // 每1s发送一次数据ros::Duration(3); // 在此等待3秒,等待收发双方准备完毕  while(ros::ok())  {  p.header.seq++; // 接受数据的序号 p.header.stamp = ros::Time::now();  // 时间戳——接收到数据时的时间pub.publish(p); // 通过TCP数据传输通道发布数据 r.sleep(); // 如果一次循环不够1s,那么再次等待直至1s到达,这样可使得while循环得时间周期为1s与数据发布时间相匹配}  return 0;
}

话题通信下ROS项目的结构配置相关推荐

  1. windows下yolov4-deepsort项目tensorflowGPU版本配置+项目实战

    目录 0. yolov4-deepsort简介 1. cuda环境 2. 配置项目环境 2.1 所需环境 2.2 环境配置 3. 模型权值的下载 4. 运行程序 5. 本人项目demo展示 0. yo ...

  2. ROS话题通信c++和python实现

    机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达.摄像头.GPS...)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的进程,每一个进程都是独立运行的.更确切的讲 ...

  3. 【ROS入门-4】嘴对嘴讲解ROS的核心概念——ROS话题通信机制

    文章目录 前言 ROS系列文章 ROS的通信机制 话题(topic) 发布者 订阅者 消息(Message) 用C++来写话题通信的代码 发布者 订阅者 使用rqt_graph 源码附录 引用说明 参 ...

  4. Nginx下本机多项目虚拟主机配置[一个端口多个站点]

    nginx下多项目虚拟主机配置: 假如你需要在一台机子上,用不同的域名访问和运行不同的项目,这个时候你就需要vhost配置: "本机虚拟域名.一个端口多个站点" 0.hosts文件 ...

  5. ROS话题通信自定义msg实现发送接收(六)c++、python

    目录 自定义msg简介 自定义msg实现 话题通信自定义msg调用(C++) vscode配置 实现发布方 实现订阅方 Python实现 编写发布方 实现订阅方 自定义msg简介 在 ROS 通信协议 ...

  6. 【ROS话题通信】发布者和订阅者

    前言 本文记录ROS话题通信的学习过程,便于后续复习.首先明确,ROS中的话题通信,在ROS通信中非常重要,实现了分布式发布接收消息,也是实现了不同编程语言间的解耦,下面记录下自己学习过程中的相关代码 ...

  7. ROS通信机制一---话题通信

    文章目录 总述 1. 话题通信模型 2. 话题通信基本实现示例 2.1 发布者 2.1.1 创建发布者topic_pub.cpp文件 2.1.2 修改CMakeLists.txt文件 2.1.3 编译 ...

  8. ROS通信机制(一)--话题通信基本操作

    话题通信 话题通信是基于发布订阅模式的,即一个节点发布消息,另一个节点订阅该消息. 流程:编写发布方实现–编写订阅方实现–(用python实现时,为python文件编写可执行权限)–编写配置文件–编译 ...

  9. ros发布节点信息python_vscode开发ROS1(13)-python实现话题通信(msg)

    写在最前面 1, ros也是可以使用python进行编程的, 而且相比c++来说, ros更加简单. 使用python创建第一个ROS程序 1, 在ros_test目录下, 新建一个scripts文件 ...

最新文章

  1. 一些基于深度学习的视觉里程计/SLAM开源代码
  2. neutron linux网络命令,OpenStack Neutron网络组件介绍(重要)
  3. linux学习--shell重定向
  4. python免费课程讲解-Python快速入门免费课程
  5. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  6. 【网摘】Oracle Dedicated server 和 Shared server(专用模式 和 共享模式) 说明
  7. 关于 app测试工具
  8. 关于反射调用方法的一个log
  9. [Oracle]如何查看一个数据文件是否是自动扩展
  10. LeetCode113. 路径总和||
  11. Spark SQL概念学习系列之Spark SQL入门(八)
  12. weightad interval scheduling problems
  13. 【SQL Server】bak文件和mdf文件辨析
  14. vscode调整代码大小
  15. setResult(RESULT_OK, intent)回调不执行问题
  16. Redis缓存读写策略
  17. 二级分销系统平台软件开发
  18. matlab求心率变异性的程序,心率变异性及其相关算法的实现
  19. DAU与GMV的差异,蛋鸡与肉鸡的区别
  20. 20、Docker基础知识-Image Index 和 manifest

热门文章

  1. 减速器性能测试软件,减速机性能测试台
  2. ٩( ‘ω‘ )و 【超详细!!!C语言scanf问题】scanf吃掉回车或空格问题
  3. Python画一箭穿心源码
  4. LocalActivityManager详解
  5. JAVA——迷宫问题
  6. Java实现 LeetCode 402 移掉K位数字
  7. kali国内更新源+中文输入法安装+SSH
  8. process lasso key注册版
  9. Koltin-用法总结
  10. 人性弱点-如何赢得朋友和影响别人