# tensorflow_ros_cpp
**Repository Path**: zhongshp5/tensorflow_ros_cpp
## Basic Information
- **Project Name**: tensorflow_ros_cpp
- **Description**: A copy of https://github.com/tradr-project/tensorflow_ros_cpp.git!!!
- **Primary Language**: Unknown
- **License**: BSD-3-Clause
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-03-28
- **Last Updated**: 2022-03-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# tensorflow\_ros\_cpp
[](https://travis-ci.com/tradr-project/tensorflow_ros_cpp)
A Catkin-friendly package for utilizing the C++ API of Tensorflow.
Get Tensorflow C++ API into ROS as easy as
find_package(catkin REQUIRED COMPONENTS
... your other packages ...
tensorflow_ros_cpp
)
See the usage example at [https://github.com/tradr-project/tensorflow_ros_test].
## Supported Tensorflow installations
You can choose either one of the following options to install `Tensorflow`.
- **As a pip (Python) package:** The easiest way on Ubuntu 14.04, Just `pip install tensorflow` and that's it. GPU version supported! Can be used on newer Ubuntu versions, but with important limitations.
- **Using [`tensorflow_catkin`](https://github.com/ethz-asl/tensorflow_catkin) package:** Easily compile Tensorflow for your platform. A convenient way on newer systems. Supports GPU version.
- **Using a custom build of Tensorflow built by bazel:** The least comfortable, yet most powerful way. [Compile Tensorflow yourself using bazel](https://www.tensorflow.org/install/install_sources) and tell this package where to find it.
See below for more detail about each of the installation types and how to set them up.
## Note for `rosdep` users
If you're managing dependencies via `rosdep`, it is likely that you do not want it to try to install the optional dependencies (currently `python-tensorflow-pip` and `tensorflow_catkin`). In such case, add the following to the rosdep call:
rosdep install ... --skip-keys=tensorflow_catkin --skip-keys=python-tensorflow-pip
## Tested compatible versions
If you successfully used this package on an untested configuration (marked with `?`), please, [tell us](https://github.com/tradr-project/tensorflow_ros_cpp/issues).
### Ubuntu 14.04 64bits, Python 2.7.6, ROS Indigo
TF | CUDA | CUDNN | pip tensorflow | pip tensorflow-gpu | bazel (CPU) | bazel (GPU) | tensorflow\_catkin (CPU) | tensorflow\_catkin (GPU)
--- | --- | --- | --- | --- | --- | --- | --- | ---
0.12.1 | no | no | ✓ | ✓ | ? | ? | N/A | N/A
1.0.0 | no | no | ✓ | ✓ | ? | ? | N/A | N/A
1.1.0 | 8 | 5 | ✓ | ✓ | ? | ? | N/A | N/A
1.2.0 | 8 | 5 | ✓ | ✓ | ? | ? | N/A | N/A
1.3.0 | 8 | 6 | ✓ | ✓ | ? | ? | N/A | N/A
1.4.0 | 8 | 6 | ✓ | N/A (wants CUDA 9) | ? | ? | N/A | N/A
1.5.0 | 8 | 6 | ✓ | N/A (wants CUDA 9) | ? | ? | N/A | N/A
1.6.0 | 8 | 6 | ✓ | N/A (wants CUDA 9) | ? | ? | N/A | N/A
1.7.0 | 8 | 6 | ✓ | N/A (wants CUDA 9) | ✓ | ✓ | ✓ | ✓
1.8.0 | 8 | 6 | ✓ | N/A (wants CUDA 9) | ? | ? | N/A | N/A
1.14.0 | 8 | 6 | ✓ | N/A (wants CUDA 10) | ? | ? | N/A | N/A
1.15.0 | 8 | 6 | X (link error) | N/A (wants CUDA 10) | ? | ? | N/A | N/A
### Ubuntu 14.04 64bits, Python 3.4, ROS Indigo
Had to set `TF_PYTHON_LIBRARY` manually since CMake was only finding Python 2.7 libraries.
TF | CUDA | pip3 tensorflow | pip3 tensorflow-gpu
--- | --- | --- | ---
1.8.0 | 8 | ✓ | N/A (wants CUDA 9)
### Ubuntu 16.04 64bits, Python 2.7.6, ROS Kinetic
TF | CUDA | CUDNN | pip tensorflow | pip tensorflow-gpu | bazel (CPU) | bazel (GPU) | tensorflow\_catkin (CPU) | tensorflow\_catkin (GPU)
--- | --- | --- | --- | --- | --- | --- | --- | ---
0.12.1 | 8.0 | no | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.0.0 | 8.0 | 5.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.1.0 | 8.0 | 5.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.2.0 | 8.0 | 5.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.3.0 | 8.0 | 6.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.4.0 | 8.0 | 6.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.5.0 | 9.0 | 7.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.6.0 | 9.0 | 7.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.7.0 | 9.0 | 7.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ✓ | ✓ | ✓ | ✓
1.8.0 | 9.0 | 7.0 | ✓, see ABI difference problems | ✓, see ABI difference problems | ✓ | ✓ | N/A | N/A
1.14.0 | 9.0 | 7.0 | ✓, see ABI difference problems | N/A (wants CUDA 10) | ? | ? | N/A | N/A
1.15.0 | 9.0 | 7.0 | ✓, see ABI difference problems | N/A (wants CUDA 10) | ? | ? | N/A | N/A
### Ubuntu 16.04 64bits, Python 3.5, ROS Kinetic
Had to set `TF_PYTHON_LIBRARY` manually since CMake was only finding Python 2.7 libraries.
TF | CUDA | CUDNN | pip3 tensorflow | pip3 tensorflow-gpu
--- | --- | --- | --- | ---
1.8.0 | 9.0 | 7.0 | ✓, see ABI difference problems | ✓, see ABI difference problems
### Ubuntu 18.04 64bits, Python 2.7.6, ROS Melodic
TF | CUDA | CUDNN | pip tensorflow | pip tensorflow-gpu | bazel (CPU) | bazel (GPU) | tensorflow\_catkin (CPU) | tensorflow\_catkin (GPU)
--- | --- | --- | --- | --- | --- | --- | --- | ---
1.0.0 | 8.0 | 5.0 | ✓, see ABI difference problems | ? | ? | ? | N/A | N/A
1.1.0 | 8.0 | 5.0 | ✓, see ABI difference problems | ? | ? | ? | N/A | N/A
1.2.0 | 8.0 | 5.0 | ✓, see ABI difference problems | ? | ? | ? | N/A | N/A
1.3.0 | 8.0 | 6.0 | ✓, see ABI difference problems | ? | ? | ? | N/A | N/A
1.4.0 | 8.0 | 6.0 | ✓, see ABI difference problems | ? | ? | ? | N/A | N/A
1.5.0 | 9.0 | 7.1 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.6.0 | 9.0 | 7.1 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | N/A | N/A
1.7.0 | 9.0 | 7.1 | ✓, see ABI difference problems | ✓, see ABI difference problems | ? | ? | ✓ | ✓
1.7.0 | 9.1 | 7.1 | N/A | N/A | ? | ? | ✓ | ✓
1.8.0 | 9.0 | 7.1 | ✓, see ABI difference problems | ✓, see ABI difference problems | ✓ | ✓ | N/A | N/A
1.8.0 | 9.1 | 7.1 | N/A | N/A | ✓ | ✓ | N/A | N/A
1.14.0 | 10.0 | 7.4 | ✓, see ABI difference problems | ✓, see ABI difference problems | ✓ | ? | ? | ?
1.14.0 | 10.0 | 7.4 | ✓, see ABI difference problems | ? | ? | ? | ? | ?
### Ubuntu 18.04 64bits, Python 3.6, ROS Melodic
Had to set `TF_PYTHON_LIBRARY` manually since CMake was only finding Python 2.7 libraries.
TF | CUDA | CUDNN | pip3 tensorflow | pip3 tensorflow-gpu
--- | --- | --- | --- | ---
1.8.0 | 9.0 | 7.0 | ✓, see ABI difference problems | ✓, see ABI difference problems
1.14.0 | 10.0 | 7.4 | ✓, see ABI difference problems | ✓, see ABI difference problems
### Debian Jessie 64bits, Python 2.7.6, ROS Indigo
TF | CUDA | CUDNN | pip tensorflow | pip tensorflow-gpu | bazel (CPU) | bazel (GPU) | tensorflow\_catkin (CPU) | tensorflow\_catkin (GPU)
--- | --- | --- | --- | --- | --- | --- | --- | ---
1.3.0 | 8.0 | 6 | ✓ | ✓ | ? | ? | ? | ?
### Debian Stretch 64bits, Python 2.7.6, ROS Indigo (compiled from source)
TF | CUDA | CUDNN | pip tensorflow | pip tensorflow-gpu | bazel (CPU) | bazel (GPU) | tensorflow\_catkin (CPU) | tensorflow\_catkin (GPU)
--- | --- | --- | --- | --- | --- | --- | --- | ---
1.4.0 | 8.0 | 6 | C++ ABI problems | C++ ABI problems | ✓ | ? | ? | ?
## Exported CMake variables
Except for the standard catkin variables (`tensorflow_ros_cpp_INCLUDE_DIRS`, `tensorflow_ros_cpp_LIBRARIES`, `tensorflow_ros_cpp_DEPENDS` and `tensorflow_ros_cpp_CATKIN_DEPENDS`), the following variables can be used from packages that `find_package` this package:
- `tensorflow_ros_cpp_USES_CXX11_ABI` (bool): Whether the used Tensorflow library is built using C++11 ABI or not.
## Pip installation
### Prerequisites
Assumes `tensorflow` or `tensorflow-gpu` pip package is installed. Ideally via pip, but custom installs are also supported (if they're either on `PYTHON_PACKAGE_PATH` or if you manually specify environment variable `TF_PIP_PATH`).
Install either using rosdep, or by calling
sudo pip install tensorflow
# or
pip install --user tensorflow
# or in a virtualenv
pip install tensorflow
### Note
This package uses a "hack" to link against the library that's installed by pip. I have no idea if this is currently an officially supported way of accessing the C++ API, but it seems to work.
### CMake variables:
You can change these variables either in the CMake cache file, or from commandline passing e.g. `-DTF_PIP_PATH=/my/path`
- `FORCE_TF_PIP_SEARCH:BOOL` (default `OFF`): Search for the pip-installed Tensorflow even if using a system with C++11 ABI (see below for explanation).
- `DISABLE_TF_PIP_SEARCH:BOOL` (default `OFF`): Do not search for pip-installed Tensorflow at all.
- `TF_PYTHON_VERSION:STRING` (default `2.7`): The python version used by the Tensorflow installation.
- `TF_PYTHON_LIBRARY:STRING` (default `""`): If nonempty, specifies path to libpythonx.y.so. Needed in some cases where CMake finds the wrong library, e.g. when using Python 3 pip.
- `TF_PIP_EXECUTABLE:STRING` (default `pip${TF_PYTHON_VERSION}`): Path to the `pip` executable that should be used (important to distinguish `pip2` for Python 2 and `pip3` for Python 3).
- `TF_PIP_DISABLE_SEARCH_FOR_GPU_VERSION:BOOL` (default `OFF`): Only regards the `tensorflow` pip package, even if the GPU version is installed.
- `TF_PIP_PATH:STRING` (default `""`): If the automated search process fails, manually specify path to the folder `(site|dist)-packages/tensorflow` containing e.g. `python/pywrap_tensorflow.py`.
### C++ ABI difference problems
Ubuntu systems starting with 16.04 (Xenial) are using the new C++11 ABI for all system libraries.
Until [pip bug 1707002](https://bugs.launchpad.net/ubuntu/+source/python-pip/+bug/1707002) gets resolved (if ever!), the pip-distributed Tensorflow is built againts an older C++ ABI, which is incompatible with the C++11 ABI. This means linking to the Tensorflow library will fail on such systems and there's no way around it.
The only "workaround" is to wrap all tensorflow code into a library that exposes its functions using C API (so no `std::string`s, `std::vector`s or Eigen types) and which does not link to any system library with a C++ API.
Such library can then be built separately with `-D_GLIBCXX_USE_CXX11_ABI=0`.
Then you can freely link the rest of your code using ROS, Eigen and so on to this library.
An example of this approach can be found at [kinetic-devel branch of tensorflow_ros_test](https://github.com/tradr-project/tensorflow_ros_test/tree/kinetic-devel).
A library created this way is "backwards compatible" with older systems, so it can be used everywhere.
However, separating all Tensorflow code can be a pain in the \*\*\*, so we only suggest it as a last resort option.
This is why searching for the pip-installed Tensorflow is disabled by default on systems using the new C++11 ABI (you can force it using `-DFORCE_TF_PIP_SEARCH=ON`).
## `tensorflow_catkin` installation
### Prerequisites
Add package [`tensorflow_catkin`](https://github.com/ethz-asl/tensorflow_catkin) to your Catkin workspace.
Read its readme to correctly set the required CMake variables (no setup needed for the CPU version).
Be prepared that the compilation will eat up a lot of RAM and take a long time. On my system with 8 concurrent build jobs, it ate around 20 GBs in the peak.
You can add `BUILD_COMMAND make -j2` and `INSTALL_COMMAND make -j2 install` to its `CMakeLists.txt/ExternalProject_Add` to limit the number of concurrent build jobs, which also decreases memory requierements.
### CMake variables
- `FORCE_TF_CATKIN_SEARCH:BOOL` (default `OFF`): Search for `tensorflow_catkin` even if Tensorflow has already been found.
- `DISABLE_TF_CATKIN_SEARCH:BOOL` (default `OFF`): Do not search for `tensorflow_catkin` at all.
## Custom compilation of Tensorflow using Bazel
### Prerequisites
Follow the [Installing TensorFlow from Sources](https://www.tensorflow.org/install/install_sources) guide up to "Configure the installation" (including), and build the C++ library with the following command:
bazel build --config=opt --define framework_shared_object=false tensorflow:libtensorflow_cc.so
You don't need to continue with the guide building or installing the pip package (but you might be interested, because a custom-built tensorflow can provide you with higher performance even in Python).
If you encounter memory problems during the build, you can limit the used resources using the [`--local_resources`](https://docs.bazel.build/versions/master/user-manual.html#flag--local_resources) bazel option.
### CMake variables
- `FORCE_TF_BAZEL_SEARCH:BOOL` (default `OFF`): Search for bazel-compiled Tensorflow even if Tensorflow has already been found.
- `DISABLE_TF_BAZEL_SEARCH:BOOL` (default `OFF`): Do not search for bazel-compiled Tensorflow at all.
- `TF_BAZEL_LIBRARY:STRING` (default `"${CATKIN_DEVEL_PREFIX}/../libtensorflow_cc.so"`): Full path to the build `libtensorflow_cc.so` library. If you put a symlink in your Catkin workspace root, it will be picked up by the default value.
- `TF_BAZEL_SRC_DIR:STRING` (default `"${CATKIN_DEVEL_PREFIX}/../tensorflow-include-base"`): Path to the sources folder of Tensorflow (your clone of the Git repository). If you put a symlink named `tensorflow-include-base` in your Catkin workspace root, it will be picked up by the default value.
- `TF_BAZEL_USE_SYSTEM_PROTOBUF:BOOl` (default `OFF`): Whether to use system-installed protobuf includes or those distributed with Tensorflow.
### Possible problems
If you encounter crashes when running the TF-using application, or it errors out with `Not found: No session factory registered for the given session options`, try the change to `tensorflow/BUILD` suggested in https://github.com/tradr-project/tensorflow_ros_cpp/issues/9#issuecomment-604692643, clean the bazel workspace, and build it again.
Tensorflow 1.15+ is not compatible with ROS Indigo. You will get linking errors when using the library. Please use TF 1.14 or older on Indigo.