运行ROS程序与CMakeList文件

2023-05-16

一、图概念概述

Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。

Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。

Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。

Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。

rosout: ROS中相当于stdout/stderr。

roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。 

1.1 节点

一个节点其实只不过是ROS程序包中的一个可执行文件。ROS节点可以使用ROS客户库与其他节点通信。节点可以发布或接收一个话题。节点也可以提供或使用某种服务。

(节点是ros中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:

例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任 务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)

rosnode 显示当前运行的ROS节点信息。rosnode list 指令列出活跃的节点: $ rosnode list

1.2 话题

turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息。

**通俗来讲:**作者和读者相当于两个节点,两者之间通过报纸平台这个(即话题)来进行通信,报纸上的内容(即信息)。作者发布(publish)话题,读者订阅(subscriber)话题。

rostopic list能够列出所有当前订阅和发布的话题。
在运行ros工程之后才能查到list,否则会报错:

ERROR: Unable to communicate with master!

查看一下list子命令需要的参数,在一个终端中运行:$ rostopic list

1.3服务

服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)。
rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。
rosservice提供了很多可以在topic上使用的命令:$ rosservice list

rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC

rosservice type使用方法: rosservice type [service]
rosservice call 使用方法: rosservice call [service] [args]
执行$ rosservice call clear正如我们所期待的,服务清除了turtlesim_node的背景上的轨迹。

二、编译运行ROS程序

编译命令:

catkin_make

如果不带任何参数的话,catkin_make 默认编译工作空间下(一般为src)的所有功能包。

编译ros获取图像时 报如下错误:

CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
Could not find a package configuration file provided by “cv_bridge” with any of the following names:

cv_bridgeConfig.cmake
cv_bridge-config.cmake

安装对应ros版本的cv-bridge包:$ sudo apt-get install ros-kinetic-cv-bridge
出现此类错误都可以用这种方式解决。
注意下载包的命令格式为:sudo apt install ros-kinetic-缺失的包名
再次编译之后可能会报无法找到usr/lib -lr 类似的错误,打开CMakeLists看最后是不是有这两句话,删除即可。正确如下:
${OpenCV_LIBRARIES}后面没有一些-l -… - …之类的东西
在这里插入图片描述

1.打开第一个终端—启动发布器

roscore 是在运行所有ROS程序前首先要运行的命令。

$ roscore

在这里插入图片描述
如果你没有退出上次在运行的roscore,那么你可能会看到下面的错误信息:

roscore cannot run as another roscore/master is already running.
Please kill other roscore/master processes before relaunching

2.打开第二个终端—飞机的通信程序

#如果使用catkin,确保你在调用catkin_make后,在运行你自己的程序前,已经source了catkin工作空间下的./devel/setup.sh文件
$ source ~/Project/ROS/catkin_ws/devel/setup.bash
$ roslaunch bebop_driver bebop_nodelet.launch

3.打开第三个终端—运行自己写的控制

$ source ~/Project/ROS/catkin_ws/devel/setup.bash
$ rosrun bebop_control bebop_control_node   //#运行bebop_control包中的 bebop_control_node

rosrun 允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)。
可以在devel/lib下查看包名和节点名,如下:
在这里插入图片描述

用法: $ rosrun [package_name] [node_name]
包名是CMakeLists所在的文件夹的名字,节点名是CMakeLists中定义的节点的名字。
在这里插入图片描述
三、CMakeLists文件

1.基本输入:

#声明cmake最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12.1)
#声明一个cmake工程
PROJECT(bebop_capture)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")
  1. opencv和catkin依赖库:

在安装ROS时内部已经安装了opencv,虽然直接在终端查不到opencv的版本,是因为其路径的原因。通过以下find_package 命令会自动查找opencv

 #指定依赖库
 #set(OpenCV_DIR /usr/local/share/OpenCV)
 find_package(OpenCV REQUIRED)   //自动查找opencv包
 catkin_package(CATKIN_DEPENDS message_runtime std_msgs) //catkin包

2.ROS 包

#ROS包搜索
find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  geometry_msgs
  sensor_msgs
  std_msgs
  std_srvs
  image_transport
  message_generation
  roscpp
  rospy
)

3.include目录

#include目录
include_directories(
  ${OpenCV_INCLUDE_DIRS}
  ${catkin_INCLUDE_DIRS}
  ${CMAKE_CURRENT_SOURCE_DIR}/include
)

4.添加一个可执行程序

#添加一个可执行程序 
#语法:add_executable(程序名 源代码文件)
add_executable(bebop_capture_node src/bebop_capture.cpp)
#将程序名链接到库上
#语法:target_link_libraries(程序名 库)
target_link_libraries(bebop_capture_node
  ${catkin_LIBRARIES}
  ${OpenCV_LIBRARIES}
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行ROS程序与CMakeList文件 的相关文章

  • Git合并出问题了怎么办

    首先 xff0c 我们不要在master中去进行修改提交 xff0c 一般这个时候我们新建一个分支 xff0c 将合并后的代码复制到新的分支中去 xff0c 然后我们对分支去进行一个修改 xff0c 当修改完成之后 xff0c 再合并到ma
  • 解决win11不能开启5GHZ热点的问题

    对于电脑5GHZ波段不可用的问题解决方法如下 xff1a 手机打开5GHz先让电脑连接电脑开启5Ghz热点断开WiFi xff0c 这时就可以用电脑开的5Ghz的热点了
  • SpringBoot 各层之间的关系

    一 层级 SpringBoot 分为四层 xff1a controller层 service层 dao层 entity层 entity层 xff1a 和model层一样 xff0c 存放的是实体类 xff0c 属性值与数据库值保持一致 xf
  • IEEE 802.1至802.12各层的 功能及特点

    IEEE 802 1 通用网络概念及网桥等 IEEE 802 2 逻辑链路控制等 IEEE 802 3 CSMA CD访问方法及物理层规定 IEEE 802 4 ARCnet总线结构及访问方法 物理层规定 IEEE 802 5 Token
  • ubuntu 常用命令大全

    一 文件 文件夹管理 ls 列出当前目录文件 xff08 不包括隐含文件 xff09 ls a 列出当前目录文件 xff08 包括隐含文件 xff09 ls l 列出当前目录下文件的详细信息 cd 回当前目录的上一级目录 cd 回上一次所在
  • MyBatis mapper.xml中使用静态常量或者静态方法

    使用MyBatis技术 xff0c 书写mapper xml时 xff0c 如果在其中的ognl表达式或者sql中直接使用一些数字或者字符串的话 xff0c 会造成难以维护的问题 在Java编码中 xff0c 我们通常会把这些数字或者字符串
  • get请求和post请求的区别

    HTTP协议 什么是协议 xff1f 协议实际上是某些人 xff0c 或者某些组织提前制定好的一套规范 xff0c 大家都按照这个规范来 xff0c 这样可以做到沟通无障碍 协议就是一套规范 xff0c 就是一套标准 由其他人或其他组织来负
  • 常见网络协议

    网络协议为计算机网络中进行数据交换而建立的规则 标准或约定的集合 例如 xff0c 网络中一个微机用户和一个大型主机的操作员进行通信 xff0c 由于这两个数据终端所用字符集不同 xff0c 因此操作员所输入的命令彼此不认识 为了能进行通信
  • C++ 栈(stack)使用简述

    目录 1 有关函数的作用 2 测试用例 至于栈的结构与原理 xff08 先入后出 xff09 这里就不细说了 xff0c 这里主要记录下 C 43 43 的头文件 lt stack gt 有关栈的操作是如何使用的 1 有关函数的作用 sta
  • 解决一个镜像ID同时拥有多个tag的问题

    docker rmi span class token operator lt span REPOSITORY TAG span class token operator gt span
  • 蜂鸣器介绍

    蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件 xff0c 常用来产生设备的按键音 报警音等提示信号 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器 有源蜂鸣器 xff1a 内部自带振荡源 xff0c 将正负极接上直流电压即可持续发声
  • DS1302时钟芯片(SPI协议)

    DS1302时钟芯片 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 它可以对年 月 日 周 时 分 秒进行计时 xff0c 且具有闰年补偿等多种功能 可以把该芯片看成一个小型的单片机 xff0c 其内部
  • ESP8266与单片机通信共地问题

    ESP8266与单片机通信共地问题 1 共地 xff1a 在数字电路中 xff0c 要判断一个电平信号的高低 xff0c 就需要一个标准来判断 xff0c 这个判断标准就是0电平 也叫地 xff09 xff0c 要把所有IC芯片的地连在一起
  • RS-485接口协议详解

    RS 485详解 通信协议 通讯协议主要是实现两个设备之间的数据交换功能 xff0c 通讯协议分硬件层协议和软件层协议 硬件层协议决定数据如何传输问题 xff0c 比如要在设备1向设备2发送0x63 xff0c 0x63的二进制数为0110
  • 使用阿里云IoT Studio建立物模型可视化界面

    使用阿里云IoT Studio建立物模型可视化界面 上一篇文章介绍了如何使用ESP 01S上报数据到物模型 xff1a https blog csdn net weixin 46251230 article details 12899671
  • 51单片机 简易光电循迹小车

    前言 应学校暑期课程要求 xff0c 也作为和小组成员完成一次对51单片机的练手 xff0c 制作了简易的光电小车 xff0c 完成了循迹功能 xff0c 下面包括较为详细的小车搭建过程以及完整代码 硬件部分准备 电源 可充电的电池组是智能
  • 阶段学习的总结

    当程序中存在多个对象的时候 xff0c 如何确定这些对象的析构顺序 单个对象创建时构造函数的调用顺序 调用父类的构造过程 调用成员变量的构造函数 xff08 调用顺序与声明顺序相同 xff09 调用类自身的构造函数 多个对象析构时 析构顺序
  • stm32学习笔记-1 STM32简介

    1 STM32简介 文章目录 1 STM32简介1 1 套件简介1 2 STM32芯片内部的外设1 3 STM32芯片系统结构1 4 STM32芯片引脚定义1 5 STM32最小系统 注 xff1a 笔记主要参考B站 江科大自化协 教学视频
  • Jetson Xavier NX 配置opencv3.4.5

    主要参考Jetson Xavier NX安装opencv3 x以及踩过的坑 xff0c 纪录下自己的错误 下载opencv3 4 5 链接 xff1a https pan baidu com s 17mASm87RNbgfmM 31vlxb
  • C++ 队列(queue、priority_queue)使用简述

    目录 1 queue有关函数的作用 2 priority queue 有关函数作用 3 queue 测试用例 4 priority queue 测试用例 至于队列的结构与原理 xff08 FIFO xff0c 先入先出 xff09 这里就不

随机推荐

  • 前端 | 数据可视化之ECharts

    文章目录 一 数据可视化1 1 什么是数据可视化1 2 数据可视化的使用场景1 3 常见可视化库1 4 小结 二 ECharts简介2 1 什么是ECharts 三 ECharts的快速入门3 1 ECharts使用五部曲3 2 选择不同类
  • Oracle数据库修改账户密码

    Oracle数据库用户密码忘记了怎么办 xff1f 1 首先需要进入cmd命令格式 xff1b 2 输入sqlplus as sysdba 超级用户角色 xff1b 3 SQL命令下输入alter user 用户名 account unlo
  • 如何让进程后台运行?(TX)

    一 运行指令 43 amp xff08 如 a out amp xff09 这样是将命令放入到一个作业队列中了 表现 xff1a 1 结果会输出到终端 2 前台出现进程号 3 使用Ctrl 43 C发送SIGINT信号 xff0c 程序免疫
  • Ubuntu20.04.2+ROS noetic打开rviz报错:...symbol lookup error...librviz.so: undefined symbol:

    打开rviz闪退 xff0c shell显示如下 xff1a 一开始我的独立显卡是安装好了的 xff0c 界面显示的OpenGL也是独显的 xff0c 但是用的其他博客的方法 xff1a span class token function
  • 计算机网络谢希仁第七版第四章习题

    4 09 xff1a xff08 1 xff09 子网掩码为 255 255 255 0 代表什么意思 xff1f xff08 2 xff09 一个网络的现在掩码为 255 255 255 248 xff0c 问该网络能够连接多少个主机 x
  • Ubuntu Linux操作系统——图形界面与命令行

    文章目录 Linux和Ubuntu命令行界面使用仿真终端窗口Shell基础正则表达式通配符模式表达式 Shell中的特殊字符 Linux命令行的使用命令行语法格式命令行基本用法命令行输入与输出执行Shell脚本vi编辑器vi操作模式打开vi
  • SDN控制器Ryu、Floodlight、OpenDayLight的安装以及Mininet连接

    文章中文件名内的xxx需要替换成自己文件的具体版本 ubuntu下安装之前可以先用 sudo apt cache madison soft name查看一下apt安装的版本 xff0c 如果版本合适的话用apt更加方便 Ryu控制器 Ryu
  • 调试时出现:undefined Expecting 'EOF','}',',',']', got STRING以下错误的解决方法

    网上查了很多跟此问题相关的答案 xff0c 都没彻底解决 xff0c 今天亲自遇到这个问题和解决方法了 xff0c 特写下来 问题描述 xff1a 代码是这样的 xff1a VM523 1 undefined Expecting EOF g
  • tensorflow详细安装过程

    我电脑安装的python是3 7 4的 xff0c 所以python如果版本不一样的话 xff08 不是3 7的 xff09 xff0c 下边的内容不建议完全参考 xff0c 可以适当参考 主要是注意很多numpy和models与你安装的t
  • FOC——无刷电机的简单驱动

    文章目录 一 什么是无刷电机 xff1f 1 长什么样 xff1f 2 怎么工作 xff1f 二 试着让它转起来1 STM32CubeMX配置2 keil Clion代码编写3 结果分析 参考的资料 写这个是为了记录学习过程 xff0c 为
  • C++ 链表(list)使用简述

    目录 1 有关函数的作用 2 测试用例 C 43 43 STL 库的 list 容器是一个双向链表 包含在头文件 lt list gt 中 1 有关函数的作用 list 本身 xff1a list lt type gt li 定义一个参数类
  • KEIL5打开KEIL4工程的方法

    解决的问题 xff1a 当使用KEIL5打开KEIL4工程的时候会提示让你下载支持包 xff0c 可以参考以下流程安装你的KEI5版本对应的支持包 步骤 xff1a 一 打开KEIL5 xff0c 点击左上角的HELP About uVis
  • Ubuntu shell脚本自动输入密码

    Ubuntu脚本实现自动输入密码 执行shell脚本的时候若遇到权限问题 xff0c 会需要手动输入密码 xff0c 自动化脚本就变得加个引号了 解决方法 描述太麻烦 xff0c 举例说明 xff1a 想要获取权限删除文件 密码为00000
  • H3C华三链路聚合的原理及配置

    1 链路聚合的作用 xff1a 将多条物理链路捆绑在一起形成一条以太网逻辑链路 xff0c 实现增加链路带宽 的目的 xff0c 同时这些捆绑在一起的链路通过相互动态备份 xff0c 可以有效地提高链路的可靠性 2 聚合模式 xff1a 静
  • 【算法】电机-几种直流无刷电机控制优化算法

    除了电机控制里经常使用的经典PID控制方法 xff0c 目前还存在几种常用的优化控制算法在这里给大家普及一下 xff0c 明白它们的大概原理及相互之间的区别 目录 xff1a 1 经典PID控制 2 模糊控制 3 滑膜变结构控制 1 经典P
  • 记一次 jenkins 构建失败 “Cannot find module ‘core-js/modules/es.promise.finally‘”

    目录 前言排查过程解决方案总结 前言 这是一次前端项目构建失败的惨案 xff0c 项目已经部署很久了 xff0c 一直相安无事 因为开发更新了代码 xff0c 在构建的时候报错 xff1a main js Cannot find modul
  • VSCode主题颜色的更改,让字体变暗一些,不那么刺眼(类IDEA风)

    VSCode默认主题就是Dark 43 直接打开settings json文件更改 1 工作区界面的颜色更改 xff0c 主要是背景色2 代码颜色3 总的代码 1 工作区界面的颜色更改 xff0c 主要是背景色 在这一部分 xff0c 我主
  • Error committing transaction. Cause: org.apache.ibatis.executor.ExecutorException: Cannot commit, t

    一 出现这个问题是因为在你的事务提交的时候 关闭sqlSession会话已经执行了 导致会话无法提交 解决方法就是先提交事务 再关闭流操作
  • 考研复试——C、C++

    文章目录 C语言 C 43 43 1 C和C 43 43 的区别 xff1f 2 封装 继承 多态分别是什么意思 xff1f 3 new delete malloc free的关系 xff1f 4 什么是引用 xff0c 引用和指针的区别
  • 运行ROS程序与CMakeList文件

    一 图概念概述 Nodes 节点 一个节点即为一个可执行文件 xff0c 它可以通过ROS与其它节点进行通信 Messages 消息 xff0c 消息是一种ROS数据类型 xff0c 用于订阅或发布到一个话题 Topics 话题 节点可以发