HUAT——Fasc——算法组学习笔记

目录

系列文章目录

前言

一、配置相关环境

二、创建工作空间

1.创建工作空间并初始化

2.进入 src 创建 ros 包并添加依赖

三、HelloWorld(C++版)

1.进入 ros 包的 src 目录编辑源文件

2.编辑 ros 包下的 Cmakelist.txt文件

3.进入工作空间目录并编译

四 运行程序

五 总结问题


系列文章目录

第一章 Ros入门 创建工作空间和运行ros包

前言

当你开始学习ROS(机器人操作系统)时,第一步通常是创建一个工作空间(workspace),它是你进行ROS开发的主要目录。在工作空间中,你可以组织和管理ROS软件包,构建和运行ROS节点,以及进行ROS相关的开发工作。我们的大致流程为

  1. 先创建一个工作空间;
  2. 再创建一个功能包;
  3. 编辑源文件;
  4. 编辑配置文件;
  5. 编译并执行。

这篇教程会手把手带你进行一次简单的项目构建。先可以配合视频使用https://www.bilibili.com/video/BV14642137Hn/?share_source=copy_web&vd_source=dc09b5f7d6dca9fee62fb97cb8d83044那么现在让我们开始吧

一、配置相关环境

1. 确定是否安装ros和cmake,打开终端输入

rosversion -d 
cmake --version

会显示类似于这样的界面

如果没有安装ros和ubantu,ros推荐鱼香ros一键安装

wget http://fishros.com/install -O fishros && . fishros

cmake安装:

sudo apt update
sudo apt install cmake

二、创建工作空间

1.创建工作空间并初始化

首先,我们将创建一个ROS工作空间,并在其中创建一个名为 "src" 的子目录。

在终端中执行以下命令:

mkdir -p 自定义空间名/src
cd 自定义空间名称
catkin_make

这将在你的主目录下创建一个名为 "catkin_ws" 的ROS工作空间,并在其中创建 "src" 目录。接着,执行 "catkin_make" 命令来编译工作空间。(我这里的工作空间命名为test_ws。)

编译完成后,将在工作空间中生成两个文件夹:

  1. "build" 目录:该目录用于存放构建过程中生成的中间文件和最终生成的目标文件。这些文件包括编译器生成的目标二进制文件、库文件和其他构建过程中生成的临时文件。

  2. "devel" 目录:该目录用于存放配置文件,其中包含构建系统需要的环境变量和路径信息。这些配置文件用于后续编译和运行ROS软件包。例如,"devel/setup.bash" 文件包含了设置ROS环境变量的命令,你可以在每次新打开的终端中执行该文件以设置正确的ROS环境。

2.进入 src 创建 ros 包并添加依赖

进入 "src" 目录,并使用 catkin_create_pkg 命令创建一个ROS包。在终端中执行以下命令:

cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

这些命令将在工作空间下生成一个功能包,该功能包依赖于 "roscpp"、"rospy" 和 "std_msgs"。其中,"roscpp" 是使用C++实现的库,"rospy" 是使用Python实现的库,"std_msgs" 是标准消息库。创建ROS功能包时,一般都会依赖这三个库实现基本的功能。

三、HelloWorld(C++版)

1.进入 ros 包的 src 目录编辑源文件

cd 自定义的包

cpp原文件

#include <ros/ros.h>
#include <std_msgs/String.h>int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "hello_world_node");// 创建ROS节点句柄ros::NodeHandle nh;// 创建一个发布者,发布类型为String的主题ros::Publisher pub = nh.advertise<std_msgs::String>("hello_world_topic", 10);// 设置循环的频率ros::Rate rate(1); // 发布频率为1Hzwhile (ros::ok()){// 创建一个String类型的消息std_msgs::String msg;msg.data = "Hello World";// 发布消息pub.publish(msg);// 输出消息到控制台ROS_INFO("Published: %s", msg.data.c_str());// 按照频率休眠rate.sleep();}return 0;
}

2.编辑 ros 包下的 Cmakelist.txt文件

根据视频的讲解寻找到相关的cmake源代码 并且反注释

add_executable(步骤3的源文件名src/步骤3的源文件名.cpp
)
target_link_libraries(步骤3的源文件名${catkin_LIBRARIES}
)

这里我们来详细的讨论下这两行代码的含义:

  1. add_executable(步骤3的源文件名 src/步骤3的源文件名.cpp)
  • 这个命令的作用是告诉CMake要将一个可执行文件添加到构建过程中。
  • add_executable 是一个CMake的函数,它接受两个参数。
  • 第一个参数是可执行文件的名称,这里使用了"步骤3的源文件名"作为示例。
  • 第二个参数是源文件的路径,这里假设源文件位于"src"目录下,并使用了"步骤3的源文件名.cpp"作为示例文件名。
  • 这个命令会将源文件编译成一个可执行文件,并将其添加到构建过程中,以便在构建时生成该可执行文件。
  1. target_link_libraries(步骤3的源文件名 ${catkin_LIBRARIES})

    • 这个命令的作用是将目标文件与指定的库进行链接。
    • target_link_libraries 是另一个CMake的函数,它接受两个参数。
    • 第一个参数是目标文件的名称,这里使用了"步骤3的源文件名"作为示例。
    • 第二个参数是要链接的库,这里使用了${catkin_LIBRARIES}作为示例。
    • ${catkin_LIBRARIES}是一个变量,它包含了构建过程中所需的ROS相关库。
    • 通过将目标文件与指定的库进行链接,可以确保在运行可执行文件时,所需的库能够正确加载和使用。

通俗的来说:当我们编写ROS节点时,需要将源代码编译成可执行文件,并将所需的库与该可执行文件进行链接。这两行CMake代码就是用来完成这个任务的。

3.进入工作空间目录并编译

cd 自定义空间名称
catkin_make

这会生成上面提到的 build devel .... 可执行文件就在build文件里面

四 运行程序

1. 打开一个新的终端 输入

roscore

2. 在打开一个终端 cd到你对应的工作空间然后输入

source ./devel/setup.bash
rosrun 包名 C++节点

source后,在我们输入rosrun后可以按tab键快速补充。这是为什么呢?

source ./devel/setup.bash 的含义是在当前终端会话中加载ROS工作空间的环境设置。

具体来说,这段代码的作用是:

  • source 是一个Shell命令,用于执行指定脚本文件中的命令,使其在当前终端会话中生效。
  • ./devel/setup.bash 是一个脚本文件的路径,它位于ROS工作空间的 devel 目录下。
  • devel/setup.bash 是ROS构建系统生成的一个脚本文件,其中包含了设置ROS环境变量的命令。

当你运行这段代码时,它会执行 devel/setup.bash 脚本文件中的命令,设置当前终端会话的环境变量,以便正确地使用ROS工具和功能。

具体来说,devel/setup.bash 脚本文件中的命令会完成以下操作:

  • 设置 ROS_PACKAGE_PATH 环境变量,指定ROS工作空间的包路径。
  • 设置 ROS_MASTER_URI 环境变量,指定ROS主节点的URI。
  • 设置 ROS_IP 或 ROS_HOSTNAME 环境变量,指定当前主机的IP地址或主机名。
  • 将ROS工作空间的 bin 和 lib 目录添加到 PATH 和 LD_LIBRARY_PATH 环境变量中,以确保能够正确找到和加载ROS工具和库文件。

通过运行 source ./devel/setup.bash,你可以将ROS工作空间的环境设置加载到当前终端会话中,使得你可以在该终端中使用ROS工具和运行ROS节点。

需要注意的是,每次打开一个新的终端时,都需要运行这段代码,以确保每个终端会话都能正确地加载ROS工作空间的环境设置。

然后我们就可以在终端看到我们发布的 hellowrld!了

五 总结问题

1.问题一:工作空间与软件包的关系与区别  
在ROS(机器人操作系统)中,工作空间(workspace)是一个包含多个软件包(packages)的目录。工作空间是一个用于组织和构建ROS项目的容器,它提供了一种管理和编译多个软件包的机制。每个软件包代表着一个独立的功能单元,可以包含节点(nodes)、消息(messages)、服务(services)、动作(actions)以及其他相关文件。
工作空间可以包含多个软件包,这些软件包可以是你自己编写的或者是从其他人或团队获取的。通过将这些软件包组织在一个工作空间中,你可以方便地进行编译、构建和管理。


问题二:成功编译所需的CMake指令  
在ROS中,CMake是用于构建和编译ROS软件包的工具。下面是一些常用的CMake指令:
1. cmake_minimum_required(VERSION x.x.x):指定所需的最低CMake版本。
2. project(project_name):指定项目名称。
3. find_package(package_name):查找指定的依赖包。
4. add_executable(executable_name source_files):添加一个可执行文件。
5. add_library(library_name source_files):添加一个库文件。
6. target_link_libraries(target_name library_names):将目标文件与指定的库文件进行链接。
7. add_dependencies(target_name dependency_names):添加目标文件的依赖。
8. catkin_package():用于构建Catkin软件包时,用于指定包的依赖关系和其他Catkin特定的配置。
这只是一些常用的CMake指令,具体使用取决于你的项目需求。


问题三:rosrun的实质和devel/lib下的可执行文件  
rosrun是ROS中一个常用的命令行工具,用于运行ROS软件包中的节点。它的基本语法是:
``rosrun package_name node_name
其中,package_name是要运行的节点所在的软件包的名称,node_name是要运行的节点的名称。
当你使用rosrun命令运行一个节点时,ROS会在工作空间的devel/lib目录下查找对应的可执行文件。该目录是在你执行catkin_make或catkin build等构建命令后自动生成的,其中包含了已编译的节点可执行文件。


问题四:为什么有多个cmake文件

在ROS项目中通常会出现多个CMake文件,这是因为ROS项目的结构和功能较复杂,需要分别管理不同的部分和依赖项。以下是常见的几种CMake文件:

  1. CMakeLists.txt:这是ROS项目中最常见的CMake文件,位于ROS包的根目录。它用于定义整个ROS包的构建规则、依赖项和其他配置选项。该文件会告诉CMake如何构建该ROS包,包括编译可执行文件、创建库、生成消息和服务文件等。

  2. package.xml:虽然不是CMake文件,但它是ROS项目中必不可少的配置文件之一。package.xml 文件位于ROS包的根目录,用于定义ROS包的元数据、依赖项和其他信息。它描述了ROS包的名称、版本、作者、许可证等重要信息,同时也列出了ROS和其他软件包的依赖关系。

  3. CMakeLists.txt(子目录):在ROS包中的子目录中,可能会有额外的CMake文件。这些文件用于定义子目录中特定部分的构建规则和依赖项。例如,如果ROS包有一个独立的节点或库在子目录中,可以在该子目录中创建一个独立的CMake文件来管理该部分的构建过程。

  4. Find<package>.cmake:这些是用于查找和配置其他非ROS软件包的CMake模块文件。这些文件通常用于在ROS项目中使用外部库或工具,它们提供了与这些库和工具的集成方法。

每个CMake文件都有其特定的作用和范围,它们共同协同工作以构建和管理一个完整的ROS项目。这种分离的方式使得项目的组织和维护更加清晰,并允许不同部分的独立管理和配置。

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

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

相关文章

docker 基础(二)

常见命令 Docker最常见的命令就是操作镜像、容器的命令&#xff0c;详见官方文档&#xff1a;https://docs.docker.com/ 数据卷 命令说明文档地址docker volume create创建数据卷docker volume createdocker volume ls创建数据卷docker volume lsdocker volume rm查看所有数…

Swiper实现轮播效果

swiper官网&#xff1a;https://3.swiper.com.cn/ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

中间件-Nginx加固(控制超时时间限制客户端下载速度并发连接数)

中间件-Nginx加固&#xff08;控制超时时间&限制客户端下载速度&并发连接数&#xff09; 1.1 Nginx 控制超时时间配置1.2 Nginx 限制客户端下载速度&并发连接数 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1.1 Nginx 控制超…

机器学习图像识别如何处理标签以外的图像?

机器学习图像识别技术是一种基于人工智能的图像处理方法&#xff0c;它通过训练大量的图像数据集来让计算机学习如何识别和分类图像。在图像识别任务中&#xff0c;我们通常需要对图像进行标注和分类&#xff0c;以便让计算机能够从中学习。但是&#xff0c;有时候我们可能会遇…

大数据旅游数据分析:基于Python旅游数据采集可视化分析推荐系统

文章目录 基于Python旅游数据采集可视化分析推荐系统一、项目概述二、项目说明三、开发环境四、功能实现五、系统页面实现用户登录注册系统首页数据操作管理价格与销量分析旅游城市和景点等级分析旅游数据评分情况分析旅游数据评论情况分析旅游景点推荐Django系统后台管理 六、…

【前端早早聊直播回顾】Harmony 时代的跨端方案

上周末&#xff0c;凡泰极客CTO - 徐鹏受邀出席「前端早早聊」直播活动&#xff0c;并以【跨端新挑战-鸿蒙时代的跨端】为主题进行演讲。 摘取部分分享实录&#xff1a; 终端系统的数量和种类不断增长&#xff0c;开发者面临着多平台开发的挑战。以往开发者一般只需要维护iOS、…

2024年3月阿里云服务器大规模价格下调后优惠折扣表

阿里云服务器ECS等核心产品价格全线下调&#xff0c;最高幅度达55%&#xff0c;2024年3月1日生效&#xff0c;针对ECS部分在售产品的官网折扣价、ECS计算型节省计划进行调整&#xff0c;生效后&#xff0c;基于官网折扣价的新购和续费&#xff0c;将按照新的价格进行计费。阿里…

程序媛的mac修炼手册-- Node.js入门篇

最近因为参与一个微信小程序的开发&#xff0c;开始摸索JavaScript。期间&#xff0c;需要基于Node.js安装微信开发工具的依赖项&#xff0c;所以又顺带学习了Node.js的包管理工具npm&#xff08;Node Package Manager&#xff09;。不过&#xff0c;之前看到国外的全栈大佬​​…

flutter学习(一) 安装以及配置环境

首先需要下载flutter&#xff0c;然后解压 然后配置环境变量&#xff0c;配置到bin目录就行 配置完之后cmd运行flutter doctor 你就会发现&#xff0c;都是错 此时脑海里响起&#xff0c;卧槽&#xff0c;怎么回事&#xff0c;咋办 别着急&#xff0c;我教你。。。 问题 这…

内网穿透 nas/树莓派+ipv4服务器 (ipv6)

nas 1.有个服务器 2.有个nas https://github.com/snail007/goproxy/blob/master/README_ZH.md https://github.com/snail007/proxy_admin_free/blob/master/README_ZH.md 2个官网一个是程序&#xff0c;一个是网站 手册 https://snail007.host900.com/goproxy/manual/zh/#/?i…

rocketmq+rocket-dashboard win10安装部署+注册为Windows服务

1.1 首先去官网下载zip包 选择自己需要的版本 下载 | RocketMQ 1.2 、下载后&#xff0c;解压到指定目录 1.3、配置RocketMQ环境变量 注意&#xff0c;看对应的版本需要jdk版本 1.4、启动mqnameserver 进入bin目录下&#xff0c;双击启动mqnamesrv.cmd 启动后&#xff0c;…

事物管理(黑马学习笔记)

事物回顾 在数据库阶段我们已学习过事务了&#xff0c;我们讲到&#xff1a; 事物是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功&#xff0c;要么同时…

Gson使用Object接收长数字问题

近期发现公司同事在使用Gson对数字进行反序列列化时出现丢失精度的问题&#xff0c;在这里搬运一下&#xff0c;做个记录~ 现象 使用Gson反序列化长Long数字(大于16位),如果用Object类型来接收则会丢失精度。 Gson会将数字反序列化为double类型,double类型本身就容易丢精度。…

小程序基础

小程序基础 1. 认识什么是小程序 什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装&#xff0c;用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念&#xff0c;用户不用关心安装太多应用的问题。它…

Metasploit安装及使用教程(非常详细)从零基础入门到精通,看完这一篇就够了。

通过本篇文章&#xff0c;我们将会学习以下内容&#xff1a; 1、在Windows上安装Metasploit 2、在Linux和MacOS上安装Metasploit 3、在Kali Linux中使用 Metasploit 4、升级Kali Linux 5、使用虚拟化软件构建渗透测试实验环境 6、配置SSH连接 7、使用SSH连接Kali 8、配…

JVM运行流程

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; JVM 1. 运行流程2. 运行时数据区2.1 堆&am…

ubuntu新建ap热点并分享

测试环境ubuntu16,只有一台笔记本电脑&#xff0c;不插网线&#xff0c;无线网卡既连wifi&#xff0c;又作为热点 1.方法1 直接手动新建ap热点 参考https://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html https://jingyan.baidu.com/article/363872ecd8f35d6e4ba…

机试指南:Ch5:线性数据结构 Ch6:递归与分治

文章目录 第5章 线性数据结构1.向量 vector2.队列 queue(1)队列的特点、应用(2)基本操作(3)例题例题1&#xff1a;约瑟夫问题2 &#xff08;难度&#xff1a;中等&#xff09; (4)习题习题1&#xff1a;排队打饭 &#xff08;难度&#xff1a;中等&#xff09; 3.栈 stack(1)栈…

前端 JS 经典:Content-type 详解

1. 什么是 Content-Type Content-Type 是 HTTP 协议中的一个请求头或响应头字段&#xff0c;用于指示发送或接收的实体的媒体类型&#xff0c;告诉服务器或客户端如何解析和处理请求或响应的主体部分。 2. Content-Type 的构成 Content-Type 由两部分组成&#xff1a;媒体类型…

视频在线压缩

video2edit 一款免费的在线视频编辑软件&#xff0c;可以进行视频合并、视频剪辑、视频压缩以及转换视频格式等。 链接地址&#xff1a;在线视频编辑器和转换器 - 编辑&#xff0c;转换和压缩视频文件 打开视频压缩页面&#xff0c;上传想要压缩视频&#xff0c;支持MP4&…