ROS 工作空间与功能包的创建(三)

news2024/11/28 20:34:26

执行命令: 

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src/
catkin_init_workspace 
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc 

效果:

 输入命令查看添加成功了没有

tail ~/.bashrc 

编译工程:执行命令

cd ~/catkin_ws/
catkin_make

 

好了,现在开始建立工程包

cd ~/catkin_ws/src/
catkin_create_pkg helloworld std_msgs rospy roscpp

然后编译包

 cd ~/catkin_ws/
catkin_make

 执行:可以按Tab 键来补全。

roscd helloworld/

 我们安装一个vim的工具来编写文件 ,后面输入Y

apt install vim 

然后进入src目录

vim helloworld.cpp

复制代码 然后 shift+insert 粘贴进去

#include <ros/ros.h>
int main(int argc,char **argv){
    ros::init(argc,argv,"hello_node");
    ros::NodeHandle nh;
    ROS_INFO_STREAM("hello world!!!");
    ros::spinOnce();
}

代码解释:

这是一个 ROS 节点的 C++ 代码,用于在 ROS 中输出 "hello world!!!" 消息。以下是代码的详细说明:

  1. #include <ros/ros.h>

    在代码的开头,我们包含了 ROS C++ 客户端库的头文件 ros/ros.h。这个头文件包含了一些 ROS 节点开发所需的基本函数和类。

  2. int main(int argc,char **argv){}

    这是 C++ 程序的主函数。在 ROS 中,每个节点都必须包含一个 main 函数,用于初始化 ROS 节点并执行节点的主要逻辑。

    ``argcargv 参数是传递给节点的命令行参数。在 ROS 中,argc 参数表示命令行参数的数量,argv` 参数是一个字符串数组,包含所有命令行参数的值。

  3. ros::init(argc,argv,"hello_node");

    ``ros::init函数用于初始化 ROS 节点。在此示例中,我们将argcargv参数传递给ros::init` 函数,以便 ROS 节点可以解析命令行参数并进行必要的初始化。另外,我们将节点的名称设置为 "hello_node"。

  4. ros::NodeHandle nh;

    ``ros::NodeHandle类用于创建一个节点句柄,以便节点可以与 ROS 系统进行通信。在此示例中,我们创建了一个名为nh` 的节点句柄,用于向 ROS 发布和接收消息,以及订阅 ROS 主题。

  5. ROS_INFO_STREAM("hello world!!!");

    ``ROS_INFO_STREAM` 函数用于在 ROS 中输出日志消息。在此示例中,我们输出了一个 "hello world!!!" 的消息。这个消息将显示在 ROS 的日志窗口中。

  6. ros::spinOnce();

    ``ros::spinOnce()函数用于让节点处理等待中的回调函数,例如订阅 ROS 主题时的回调函数。在此示例中,我们没有订阅任何主题,因此ros::spinOnce()` 函数没有任何作用。但是,如果节点需要订阅主题或接收服务请求,则需要在主循环中调用此函数来处理回调函数。

综上所述,这个 ROS 节点的主要逻辑是输出一个 "hello world!!!" 的消息。在节点的 main 函数中,我们首先使用 ros::init 函数初始化 ROS 节点,并将节点的名称设置为 "hello_node"。然后,我们创建了一个名为 nh 的节点句柄,以便节点可以与 ROS 系统进行通信。接下来,我们使用 ROS_INFO_STREAM 函数输出一个 "hello world!!!" 的消息。最后,我们调用 ros::spinOnce() 函数,以便节点可以处理等待中的回调函数。

 输入按esc 然后 :wq  就是保存退出的意思  

 我们就有文件了

然后再进入

 添加如下内容:

add_executable(helloworld ./src/helloworld.cpp)
target_link_libraries(helloworld ${catkin_LIBRARIES})

参数解释:两个版本

这两行代码是用于在 CMakeLists.txt 文件中定义 ROS 软件包的可执行文件的,具体含义如下:

  1. add_executable(helloworld ./src/helloworld.cpp)

    ``add_executable函数用于定义可执行文件,并将其与指定的源文件进行链接。在此示例中,我们定义了一个名为helloworld的可执行文件,并将其链接到./src/helloworld.cpp` 源文件。

  2. target_link_libraries(helloworld ${catkin_LIBRARIES})

    ``target_link_libraries函数用于将可执行文件链接到指定的库。在此示例中,我们将helloworld可执行文件链接到catkin_LIBRARIES变量所包含的 ROS 库。这些库包括 ROS C++ 客户端库roscpp` 和其他依赖项。

这两行代码一起定义了一个 ROS 软件包的可执行文件,该可执行文件名为 helloworld,源文件为 ./src/helloworld.cpp,并链接到 ROS C++ 客户端库和其他依赖项。在构建软件包时,CMake 会使用这些定义来编译可执行文件,并将其安装到运行目录中,以便在 ROS 节点中使用。

这两行代码是用于在 ROS 软件包中定义可执行文件的,具体含义如下:

  1. add_executable(helloworld ./src/helloworld.cpp)

    ``add_executable()函数用于定义可执行文件,并将其与指定的源文件进行链接。在此示例中,我们定义了一个名为helloworld的可执行文件,并将其链接到./src/helloworld.cpp` 源文件。

    在 ROS 中,每个节点都是一个可执行文件。因此,在 ROS 软件包中定义一个可执行文件实际上是定义一个 ROS 节点。在此示例中,我们定义了一个名为 helloworld 的节点,用于输出 "Hello, world!" 消息。

  2. target_link_libraries(helloworld ${catkin_LIBRARIES})

    ``target_link_libraries()函数用于将可执行文件链接到指定的库。在此示例中,我们将helloworld可执行文件链接到catkin_LIBRARIES变量所包含的 ROS 库。这些库包括 ROS C++ 客户端库roscpp` 和其他依赖项。

    在 ROS 中,节点需要使用 ROS 的客户端库来与其他节点进行通信。在 C++ 中,我们可以使用 roscpp 库来编写 ROS 节点的客户端代码。因此,将 helloworld 可执行文件链接到 roscpp 库是为了让节点能够使用 roscpp 库中的函数和类来与其他节点进行通信。

    此外,catkin_LIBRARIES 变量包含了其他 ROS 依赖项的库,如消息传输库 roslib。将 helloworld 可执行文件链接到 catkin_LIBRARIES 变量中的库可以确保节点能够使用这些库中的函数和类来实现其功能。

综上所述,将 helloworld 可执行文件链接到 roscpp 和其他 ROS 依赖项的库中是为了让节点能够使用 ROS 客户端库和其他 ROS 依赖项来实现其功能,并与其他节点进行通信。

粘贴后,按esc 然后输入:wq 回车就可以了

 按以下图写代码

 效果:

然后启动两个终端,一个运行

必须先运行这个

roscore
rosrun helloworld helloworld

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/550653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

csdn文章markdown格式下载

前言 网上下载CSDN文章的方式多种多样&#xff0c;有的直接下载为pdf格式&#xff0c;有的利用python/java代码将文章下载为md格式&#xff0c;也有的用JavaScript下载文章&#xff0c;但下载的文章仅限于自己写的&#xff08;会介绍&#xff09;&#xff0c;这里也提供一种简单…

关于接口中的一些常用实例以及比较方法的区别

文章目录 &#x1f490;文章导读&#x1f334;Object 类toString() 获取对象信息equals 对象比较方法hashCode 获得对象的具体位置 &#x1f334;接口使用实例Comparable 接口Comparator 接口 &#x1f490;文章导读 在本篇文章中&#xff0c;详解了什么是Object类&#xff0c;…

MyBatis中三级缓存的理解

文章目录 前言1. 环境搭建1.1 依赖引入1.2 mybatis-config.xml配置配置db.properties在mybatis-config.xml引入db.properties 1.3 实体类1.4 mappermapper接口mapper映射文件 1.5 测试 2.缓存2.1 一级缓存mybatis-config.xml 配置日志开启日志配置日志文件logback.xml测试相同m…

深度学习之搭建LSTM模型预测股价

大家好&#xff0c;我是带我去滑雪&#xff01; 本期利用Google股价数据集&#xff0c;该数据集中GOOG_Stock_Price_Train.csv为训练集&#xff0c;GOOG_Stock_Price_Test.csv为测试集&#xff0c;里面有开盘价、最高股价、最低股价、收盘价、调整后的收盘价、成交量&#xff0…

Flutter项目webview加载没有HTTPS证书的网页在Android和iOS设备上无法显示的解决方案

一、问题描述 Flutter项目使用谷歌官方webview库 webview_flutter&#xff0c;加载自签名证书、证书失效、无证书等HTTPS网页地址时&#xff0c;在Android或pc浏览器中提示证书失效&#xff0c;在iOS设备上为空白页&#xff0c;为了加载自签名证书的网页&#xff0c;需要饶过i…

AVR单片机ATemga328P中断原理的介绍

1、一AVR单片机中断原理的介绍 ATmega328P微控制器具有两个外部中断引脚&#xff0c;分别是INT0和INT1。 外部中断0&#xff08;INT0&#xff09;&#xff1a;它对应的引脚是PD2&#xff08;数字引脚2&#xff09;。INT0可以用于响应外部信号的边沿触发&#xff08;上升沿、下…

【服务器】使用Nodejs搭建HTTP web服务器

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 [TOC] 转载自内网穿透…

Unity Addressables学习笔记(1)---创建远程服务器加载资源

例子1&#xff1a;加载一个图片 1.首先创建一个UI Image&#xff0c;空白图片,资源打包方式选择真是部署的 2.修改远程发布和加载配置 Bulid Path选择RemoteBuildPath Load Path我选择了custom,地址是http://localhost:8080/WebGL/ 遇坑1 :最开始我选择的Build Path 是 Loca…

windows安装mysql 5.7.41

前言 要学mysql&#xff0c;肯定得本地装上一个玩一玩啦&#xff0c;下面一起来安装mysql吧 一、下载 https://downloads.mysql.com/archives/community/ 顺便说一下&#xff0c;下载按钮下方有个md5&#xff0c;可以验证下文件是否被篡改&#xff0c;理论上官网下载的应该问…

初识结构体

目录 结构体的声明 结构体的基础知识 结构体的声明 结构体成员的类型 结构体变量的定义和初始化 定义 初始化 结构体成员的访问 结构体变量访问成员 结构体指针访问指向变量的成员 结构体传参 传地址 传结构体 结论 结构体的声明 结构体的基础知识 数组&#xff…

【ChatGPT】IOS如何下载注册使用ChatGPT的APP(教学)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

iptables 防火墙

iptables概述 Linux系统的防火墙&#xff1a;ip信息过滤系统&#xff0c;它实际上由两个组件netfilter和iptables组成。 主要工作在网络层&#xff0c;针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上 netfilter / iptables关系&#xff1a; netfilter:属于…

Electron中如何创建模态窗口?

目录 前言一、模态窗口1.Web页面模态框2.Electron中的模态窗口3.区分父子窗口与模态窗口 二、实际案例使用总结 前言 模态框是一种常用的交互元素&#xff0c;无论是在 Web 网站、桌面应用还是移动 APP 中&#xff0c;都有其应用场景。模态框指的是一种弹出窗口&#xff0c;它…

【TES714】JFM7K325T(复旦微FPGA)+HI3531DV200(华为海思)的综合视频处理平台设计原理图及调试经验

板卡概述 TES714是自主研制的一款5路HD-SDI视频采集图像处理平台&#xff0c;该平台采用上海复旦微的高性能Kintex系列FPGA加上华为海思的高性能视频处理器HI3531DV200来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&#xff0c;支持多种…

【运维知识进阶篇】集群架构-Nginx动静分离详解

我们先前将静态资源放到NFS&#xff0c;动态资源放到MySQL&#xff0c;一是为了提高我们Web服务器性能&#xff0c;减轻它的压力&#xff0c;另一面如果Web宕机了&#xff0c;我们的静态和动态资源还可以访问到。但是之前方式不管是静态还是动态文件&#xff0c;都是走的代码文…

ssl vpn 与 ipsec vpn 区别

VPN 安全协议有两种主要类型&#xff0c;IPsec 和 SSL&#xff0c;了解它们之间的区别对于确保客户的安全至关重要。在本文中&#xff0c;我们将解释IPsec 和 SSL VPN 协议之间的区别&#xff0c;以及如何选择合适的协议来满足客户的需求。了解更多SSL技术最新信息&#xff0c;…

Linux_证书_Openssl实现对称加密、非对称加密、CA颁布证书

文章目录 OpenSSLopenssl实现对称加密openssl实现非对称加密生成密钥对非对称加密数字签名小结 根据CA颁布证书生成ca私钥和ca证书根据ca生成证书 尾声 OpenSSL 常用证书生成工具包括三个&#xff1a;ssh-keygen、cfssl、openssl。这里介绍 OpenSSL , OpenSSL 是一个开源项目&…

【Python从入门到进阶】20、HTML页面结构的介绍

接上篇《19、Python异常处理》 上一篇我们学习了Python中有关异常&#xff08;捕获异常、处理异常等&#xff09;的知识。从本篇开始&#xff0c;我们进入Python的实战教程&#xff0c;学习爬虫的相关技术&#xff0c;本篇主要讲解要爬取的HTML页面的结构。 一、一个场景 假设…

Godot引擎 4.0 文档 - 入门介绍 - Godot 编辑器

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; First look at Godots editor — Godot Engine (stable) documentation in English Godot的编辑器 本页将为您简要介绍 Godot 的界面。我们将查看不同的主屏幕和停靠栏…

C语言:字符函数和字符串函数详解及部分函数的模拟实现(前篇)

文章目录 求字符串长度strlenstrlen函数的模拟实现: 长度不受限制的字符串函数strcpystrcatstrcmp总结 长度受限制的字符串函数介绍strncpystrncatstrncmp 前言&#xff1a; C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串…