【ROS第一讲】一、创建工作空间

news/2024/12/23 1:27:50/

【ROS第一讲】一、创建工作空间

  • 一、工作空间
    • 1.src:
    • 2.build:
    • 3.devel:
    • 4.install:
  • 二、创建工作空间
    • 1.工作空间的编译
    • 2.配置环境变量:
  • 三、创建功能包

一、工作空间

1.src:

放置所有功能包源码的空间

2.build:

所有在编译过程中产生的中间文件(使用的较少)

3.devel:

存放的所有编译完的可执行文件,环境变量的配置脚本(常用)

4.install:

和devel有点重复,存放的都是编译完成的可执行文件,ros2中把install和devel合并为同一个文件夹了.

二、创建工作空间

1.工作空间的编译

依赖于catkin_make工具,他的底层也是基于cmake的,只不过是基于cmake做了一点封装。
新建的工作空间内进行编译,并不会编译任何的代码(因为还没有写代码),只是会生成一些固定的文件:
在这里插入图片描述

2.配置环境变量:

配置ROS功能包的路径,使得ROS能够找到相应的环境包在什么位置。
可以用source devel/setup.bash这句来配置环境变量。在当前中断下,输入该指令,就可以告诉ros系统相应的功能包在改catkin_ws工作空间中。
但是该指令仅在当前终端生效,另外开辟一个终端的时候就会失效。
所以推荐把该命令放在终端的配置文件中即可不用每次打开都运行一遍这个命令,配置文件的位置是在home的根目录下,是一个名为.bashrc的文件脚本。
运用以下命令:vi
打开该脚本,在最后一行增加以下命令(即环境变量,功能包的路径名称): source ~/catkin_ws/devel/setup.bash
保存之后,运行命令:source -/.bashrc即可让刚才的配置在终端生效。

  • 可以用echo命令来打印出当前ros系统中的环境变量:echo $ROS_PACKAGE_PATH

在这里插入图片描述
可以看到当前有两个环境变量路径,一个是刚刚添加的,一个是安装ros系统之后添加的,终端要寻找ros相应的命令方法或者文件需要到第二个路径去找,因为第二个路径是ros系统安装的位置。

三、创建功能包

功能包中可以具体的写相关的代码,也要有各种包的依赖才行。创建功能包的时候可以写出这些具体的依赖包。
如下图所示,出现相应的反馈即代表该功能包创建完成。
在这里插入图片描述

可以看到在src目录下已经有了刚才创建的功能包:
在这里插入图片描述
点击进去之后可以看到已经初始化了该功能包:
在这里插入图片描述
这些都是默认会帮我们生成好的文件。CMakeLists文件和package文件这两个是很重要的。
CMakeLists文件会放置该功能包的一些编译选项。
package会放置描述功能包的一些具体信息,比如版本号,该功能包具体依赖哪些其他的功能包等等。
然后可以回到该工作空间的根目录,重新编译该工作空间,就可以看到编译反馈的信息已经找到了该包。
在这里插入图片描述

同一工作空间下,不可以有同名的功能包, 不同工作空间下可以有同名的功能包。
但是如果真的在不同工作空间下放着同名的功能包,ros 在运行某个功能包的时候,同名功能包运行的顺序是什么?这就要用到ros的overlaying机制了。即工作空间的覆盖。
可以用env命令来查找该系统中所有的环境变量。用env|grep ros来查找所有与ros相关的环境变量。
在这里插入图片描述
其中:ROS_PACKAGE_PATH=/home/geroge/catkin_ws/src:/opt/ros/melodic/share显示的就是ros在查找功能包的时候会去查找的两个路径。ros要查找功能包的时候会从这两个路径中依次开始查找,比如刚才建立的learning_ros功能包,如果他在第一个路径home/geroge/catkin_ws/src里面找到了这个功能包,就可以结束查找,运行该功能包中的相应节点了。
工作空间的路径依次在ROS PACKAGE PATH环境变量中记录
新设置的路径在ROS PACKAGE PATH中会自动放置在最前端
运行时,ROS会优先查找最前端的工作空间中是否存在指定的功能包
如果不存在,就顺序向后查找其他工作空间

【例】
先安装一个roscpp-turtorial包,然后我们看一下他怎么找到这个包:

sudo apt-get install ros-melodic-roscpp-tutorials

然后我们开始找这个包:

 rospack find roscpp_tutorials 

在这里插入图片描述
可以看到他已经在第二个路径中找到了该功能包。


http://www.ppmy.cn/news/987239.html

相关文章

队列数据分析积累-1

https://mp.weixin.qq.com/s/XZV_5iioPDHnMQfEPCIlMg BKMR #首先清理缓存。 rm(list ls()) #运行R包,如果没有下载要先下载。 library(bkmr) library(ggplot2) #给数据赋值,如果要自己进行研究,数据的地址以及数据的变量需要对应的自行…

紫光FPGA试用--软件篇

目录 一 软件安装启动 二 如何打开IP核?查看/修改现有IP核参数? 三 如何定义引脚? 四 如何下载code进入FPGA? 1. 下载到FPGA芯片内: 2.下载到外部FLASH中 五 如何进入在线调试模式,调试步骤 操作步骤&#xff…

【Linux命令200例】less强大的文件内容查看工具

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

cf edu152 C. Binary String Copying(字符串双哈希)

cf edu152 C. Binary String Copying(字符串双哈希) 题目链接:https://codeforces.com/contest/1849/problem/C 题目大意 给定一个01字符串,长度为n,拷贝m份,对每一份进行相应操作:将 [ L i …

vuex实现持久化存储

在使用vuex存储数据的时候刷新页面数据会消失,此时就可以使用持久化存储 使用vuex-persistedstate插件 第一步:下载插件 $ npm install vuex-persistedstate 第二步:在store的index.js里面引入插件 import createPersistedState from vue…

Redis—相关背景

Redis—相关背景 🔎Redis—特性In-memory data structures—在内存中存储数据Programmability—可编程性Extensibility—可扩展性Persistence—持久化Clustering—集群High availability—高可用 🔎Redis 为什么快🔎Redis 的使用场景Real-tim…

spring扩展点

在Spring框架中,有多个扩展点(Extension Point)可用于自定义和扩展应用程序的行为。这些扩展点允许开发人员介入Spring的生命周期和行为,并提供了灵活性和可定制性。以下是一些常见的Spring扩展点: BeanPostProcessor&…

ObjectArx 设置填充透明度问题

初始化透明度参数AcCmTransparency对象时,需要调用setAlpha设置透明度值,这里传入的值是0255,但cad特性面板上显示的是090,且经过测试发现,传入值与特性面板显示的值也是不同的,比如传入90,显示64,百度搜索了个寂寞,最后还是在谷歌找到了答案,原来设置的值和特性面板…