ROS 交叉编译介绍

什么是ROS?

根据维基百科的介绍,ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。

按照我的理解,其实它就是个软件框架,核心只是提供一个多进程通信的服务,但是由于开发者多了,开源了很多一些功能包,方便进行业务开发,仅此而已,和 linux 这种操作系统是有差距的,ROS 运行在 linux 之上,属于服务类。简单了解什么是 ROS 之后,官网 wiki 可以相应的安装、使用介绍,有从源码安装的介绍,链接在这,但是如何交叉编译,并没有介绍的,网上的资料也比较少,下面由我来为大家简单介绍,如何移植 ROS 到嵌入式系统,怎么进行交叉编译。

ROS 使用什么编译

通过 ROS wiki 可以了解到,ROS 使用 catkin 编译,那么,要想实现交叉编译,我们需要先了解 catkin 是什么。

catkin wiki 可以了解到,catkin 是依赖 CMake、Python 等工具,往下跟踪,可以发现,其实 catkin 就是实现了一个对 CMake 的封装而已。那么,先来移植 catkin。

而 catkin 只需要使用 CMake 就可以完成编译了,而且 catkin 是用来构建 ROS 的,而构建是在 PC 端进行交叉编译,所以实际上 catkin 不需要交叉编译。同时通过跟踪 catkin 的实现,发现它是由 python 脚本构成的,没有其它的二进制库和可执行文件,那么更加可以肯定,这个 catkin 是可以不进行交叉编译的,只需要在 PC 端编译好该工具即可。

如何编译 ROS

在 PC 端编译 ROS 包的时候,细心可以发现,实际上管理着编译操作的是 CMake 工具。上述也提到,catkin 可以理解为是 CMake 增加了一层包装。

通过查看编译信息,catkin 的编译逻辑是先根据 package 中的 package.xml 确认将要编译的 ROS 组件,这时将会打印出有哪些组件将会编译,组件的编译依赖和运行依赖分别是什么,这个 xml 文件都有相应的描述。在 package.xml 检查之后,将会通过 CMake 调用 CMakeLists.txt 进行编译。所以,我们真正需要做的如下:

  1. 根据编译时出现的信息,增加相应的依赖包编译,先编译被依赖包;
  2. 在编译时候,指定相应的交叉编译工具链即可;
  3. 处理好不同包的依赖,编译时可以查找到相应的包信息;

按照上面的介绍,大概知道需要怎么处理,下面直接给出编译的命令:

cd $(BUILD_DIR) && \										### 进入将要编译包的目录
	$(HOST_DIR)/usr/bin/catkin_make_isolated --install \	### 使用 catkin_make_isolated 进行编译处理
		--source=$(BUILD_DIR) \								### 指定编译的源码目录
		--build=$(BUILD_DIR)/build_isolated \				### 指定编译中间信息保存的目录
		-DCATKIN_DEVEL_PREFIX=$(BUILD_DIR)/devel \			### 指定编译环境???
		 -DCMAKE_INSTALL_PREFIX=$(INSTALL_DIR) \			### 编译完成之后的安装目录
		 -DCMAKE_C_COMPILER="$(TARGET_CC)" \				### 指定 C 交叉编译工具链
		-DCMAKE_CXX_COMPILER="$(TARGET_CXX)" \				### 指定 CXX 交叉编译工具链
		-DCMAKE_PREFIX_PATH="$(TARGET_DIR)/usr"				### 指定 CMake 查看头文件、库文件等的查找路径

按照上述的命令,将可以通过 catkin 命令进行交叉编译。

需要注意的地方:

ROS 的包会有一些 msg 和 srv 文件,在编译的时候,需要将这些文件转换为 python 的源文件或者是 C++ 的源文件,这些操作都是可以通过 genpy 和 gencpp 来完成转换的。

ROS 运行

在运行 ROS 节点之后,需要先运行 roscore,而且需要配置好相应的环境信息,配置以下信息即可:

#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2019 OpenWrt.org

export CMAKE_PREFIX_PATH=/usr
export PKG_CONFIG_PATH=/usr/lib/pkgconfig
export ROS_ROOT=/usr/share/ros
export ROS_PACKAGE_PATH=/usr/share
export ROS_LOG_DIR=/mnt/UDISK
export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=http://localhost:11311
export LD_LIBRARY_PATH=/usr/lib
export ROS_ETC_DIR=/usr/etc/ros
export ROS_DISTRO=kinetic
export ROS_VERSION=1
export ROSLISP_PACKAGE_DIRECTORIES=/usr/share/common-lisp

同时为了每个终端都会自动配置上述环境,可以将上面的配置文件添加到 /etc/profile.d 目录,此时每开一个终端都会自动增加上述的环境变量。

猜你喜欢

转载自blog.csdn.net/weixin_41944449/article/details/110288858
今日推荐