1.二进制包与源码包区别
sudo apt-get install二进制包=.deb(封装包,内容无法查看)
第三方包需要(get clone方式)下载到工作空间的src下+在工作空间进行编译(可修改代码)
小技巧:
编译或者运行时,提示缺少依赖包,这时试着安装提示依赖包。/再不行google下
2.文件系统级
ROS里边的所有都是由文件(包)构成,重点分成catkin+package(package.xml+CMakefile.txt)+metapackage
2.1Catkin编译系统
make扩充了gcc/g++,而cmake扩充了make,catkin扩充了cmake/编译源码后无需安装即可使用/自动生成find_package()代码...
编译过程:编译之前读取package.xml和CMakefile.txt信息;编译时,先递归方式找到工作空间下的所有包/某个包,然后根据找到的包里面的CMakefile.txt文件生成
makefile.txt中间缓存信息放置build文件,最后make根据中间文件编译生成可执行文件等放置devel文件下
2.2notice
编译后,cd ..回到工作空间, source ~/catkin_ws/devel/setup.bash #将新生成的可执行文件信息告知ROS系统,否则可能找不到文件
2.3package
具有统一的格式,被用来编译的包,一个package下常见的文件、路径有:
├── CMakeLists.txt #package的编译规则(必须)
├── package.xml #package的描述信息(必须)
├── src/ #源代码文件
├── include/ #C++头文件
├── scripts/ #可执行脚本
├── msg/ #自定义消息
├── srv/ #自定义服务
├── models/ #3D模型文件
├── urdf/ #urdf文件
├── launch/ #launch文件
2.3.1package.xml
遵循xml标签文本的写法,包括了package的name, description, version, maintainer(s), license,opt. authors, url's, dependencies, plugins,
etc...的描述信息
<pacakge> 根标记文件
<name> 包名
<version> 版本号
<description> 内容描述
<maintainer> 维护者
<license> 软件许可证
<buildtool_depend> 编译构建工具,通常为catkin
<depend> 指定依赖项为编译、导出、运行需要的依赖,最常用
<build_depend> 编译依赖项
<build_export_depend> 导出依赖项
<exec_depend> 运行依赖项
<test_depend> 测试用例依赖项
<doc_depend> 文档依赖项
说明:其中1-6为必备标签,1是根标签,嵌套了其余的所有标签,2-6为包的各种属性,7-9为编译相关信息。
2.3.2CMakefile.txt
一套源码到目标文件生成的编译过程规则:调用Catkin的函数/宏;解析package.xml;找到其他依赖的catkin软件包;生成可执行文件,具体规则如下:
cmake_minimum_required() #CMake的版本号
project() #项目名称
find_package() #找到编译需要的其他CMake/Catkin package
catkin_python_setup() #catkin新加宏,打开catkin的Python Module的支持
add_message_files() #catkin新加宏,添加自定义Message/Service/Action文件
add_service_files()
add_action_files()
generate_message() #catkin新加宏,生成不同语言版本的msg/srv/action接口
catkin_package() #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用
add_library() #生成库
add_executable() #生成可执行二进制文件
add_dependencies() #定义目标文件依赖于其他目标文件,确保其他目标已被构建
target_link_libraries() #链接
catkin_add_gtest() #catkin新加宏,生成测试
install() #安装至本机
2.3.3rosdep
一个较常使用的命令是rosdep install --from-paths src --ignore-src --rosdistro (indigo) -y,用于安装工作空间中src路径下所有package的依赖
项(由pacakge.xml文件指定)
3.对于为什么会有依赖项的思考
为了节省电脑空间,共享资源-相互调用即可,不需要将每个实现功能都各自拥有包
4.metapacakge中的两个必须文件和普通pacakge不同点
CMakeLists.txt:加入了catkin_metapackage()宏,指定本软件包为一个metapacakge。
package.xml:标签将所有软件包列为依赖项,标签中添加标签声明。
metapacakge在我们实际开发一个大工程时可能有用
ROS文件系统架构
最新推荐文章于 2024-05-11 11:34:31 发布