pybind11_examples
pybind11_examples copied to clipboard
This repository shows minimal pybind11 examples using catkin or colcon.
pybind11_examples
This repository shows minimal pybind11 using ROS. This project depends on pybind11_catkin. It is a pybind11 wrapper for ROS packages. Despite its name pybind11_catkin can be used in combination with catkin as well as with colcon.
Installation
Install prerequisites
This project depends on pybind11_catkin. You can install it with sudo apt-get install ros-<distro>-pybind11-catkin. Depending on the ROS distribution <distro> is kinetic, melodic or noetic.
Build with catkin tools
- Create a catkin workspace or use an existing workspace.
- Clone this repository into the
src/subdirectory of the workspace:git clone https://github.com/arturmiller/pybind11_examples.git. - Compile the code
catkin build. - Source the config file:
source path_to_workspace/devel/setup.bash.
Build with colcon
- Create a colcon workspace or use an existing workspace.
- Clone this repository into the
src/subdirectory of the workspace:git clone https://github.com/arturmiller/pybind11_examples.git. - Compile the code
colcon build. - Source the config file:
source path_to_workspace/install/setup.bash.
Examples
Calling a C++ function
The first example is calling the C++ print function from Python.
You run this example with rosrun function_call hello_world.py. As output you should see hello world!.
Basic classes usage
The second example shows how to instantiate and use C++ classes in Python.
Run this example with rosrun classes pets.py. This should be your output:
<Dog named 'Bello'>
Bello
woof woof!
woof woof!
meow!
Inheritance
This example shows a Python class inheriting from a C++ class. A virtual C++ function is overriden in Python and called from the C++ base class.
Run it with rosrun inheritance dog.py. You should see something similar to this:
<__main__.Dog object at 0x7f90143954d0>
Fluffy dog Molly!
Fluffy dog Charly!
Plugin
The last two examples show, how to call C++ code in Python. This is can be very handy if you want to write a Python plugin system for a C++ library, as is the case for e.g. Tensorflow. There are multiple advantages of this approach. For example you can rerun the plugin without recompiling and running a debugger is much simpler Python.
The following classes are part of the plugin system:
- PluginRunner: The plugins are stored and called in this module.
- BasePlugin: All plugins inherit from BasePlugin.
- CustomPlugin: A custom plugin implemented in Python.
- PluginWrapper: The PluginWrapper calls the Python Plugin.
- PyBasePlugin: This module makes the base plugin accessible in Python.
Run this example with rosrun plugin plugin_runner. The Python plugin is called, with the resulting output hello world!. Now you can change the string of the print statement and rerun it without recompiling the source code.