Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
f861280
Pin version of rcl_interfaces
esteve Dec 18, 2020
b4e64f7
Pin version of rcl_interfaces
esteve Dec 18, 2020
94d1eff
Update rosidl_generator_java for Dashing compatibility (#66)
jacobperron Jan 10, 2020
6e57187
Update rcljava for Dashing (#75)
jacobperron Feb 11, 2020
ef2805b
Update rosidl_generator_java tests (#68)
jacobperron Feb 11, 2020
e1945af
Update Android repos for dashing (#80)
talregev Mar 17, 2020
3da3111
Remove non-existent dependency on rosidl_typesupport_java (#97)
jacobperron Mar 18, 2020
dcc6a54
Shutdown default context after tests (#95)
jacobperron Mar 18, 2020
5305522
Fix service and action interface generation (#76)
jacobperron Mar 18, 2020
a86bd0f
Rename rcljava_common cpp headers to have .hpp suffix (#93)
jacobperron Mar 18, 2020
9d591b1
Update desktop repos file (#94)
jacobperron Mar 18, 2020
2357c33
Workaround dependency error when generating test message (#91)
jacobperron Mar 18, 2020
8b144db
Add GitHub workflow for Dashing (#96)
jacobperron Apr 7, 2020
601efed
Add example_interfaces to desktop repos file (#101)
jacobperron May 6, 2020
603a8f4
Readme instruction fix (#106)
nielstiben May 7, 2020
81678ab
Add Client methods for checking and waiting for service availability …
jacobperron May 7, 2020
30303d1
fix README.md android part (#107)
jayhou May 9, 2020
0506afb
Fix action generation (#108)
nielstiben Jun 9, 2020
52f5159
Disable flake8 (#111)
jacobperron Jun 24, 2020
31a6bac
Add methods to remove entities from Node (#110)
jacobperron Jun 30, 2020
3cc2e22
Trigger CI workflow on pull requests (#135)
jacobperron Sep 30, 2020
353166e
(RclJava) fix BaseExecutor.spinSome logic - run the executable even i…
sung-goo-kim Sep 30, 2020
bd10dab
(RclJava) Fix Node.testPubUInt32MultipleNodes() error (#133)
sung-goo-kim Sep 30, 2020
b3a25b1
clear node/context handle on RclJava.cleanup() (#130)
sung-goo-kim Sep 30, 2020
885fa3f
Compile generated action-related services (#140)
jacobperron Nov 9, 2020
b3c888a
Update build instructions in README and CI (#119)
jacobperron Dec 4, 2020
6ebafe1
Bump versions of ros-tooling actions in CI (#154)
jacobperron Dec 7, 2020
12e3407
change code order(methodId 'add' in for loop) (#148)
Dec 8, 2020
120be3b
Remove dependency on Connext (#161)
jacobperron Dec 14, 2020
fdfe113
Remove dependency on OpenSplice (#163)
esteve Dec 14, 2020
29539eb
Removed rmw_cyclonedds repository
esteve Dec 18, 2020
c259468
Avoid unnecessary string copies (#171)
jacobperron Jan 8, 2021
3ebac76
Simplify access to service callback (#172)
jacobperron Jan 11, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: CI

on: [push, pull_request]

jobs:
build_and_test:
runs-on: ubuntu-18.04
steps:
- name: Install Java
run: |
sudo apt-get update -qq
sudo apt-get install -y default-jdk gradle
- uses: actions/checkout@v2
- uses: ros-tooling/setup-ros@0.1.0
with:
required-ros-distributions: dashing
- uses: ros-tooling/action-ros-ci@0.1.0
with:
package-name: rosidl_generator_java rcljava_common rcljava
target-ros2-distro: dashing
vcs-repo-file-url: ${{ github.workspace }}/ros2_java_desktop.repos

build_android:
runs-on: ubuntu-18.04
steps:
- name: Install Java
run: |
sudo apt-get update -qq
sudo apt-get install -y default-jdk gradle
- uses: actions/checkout@v2
- name: Setup locale for ROS 2
run: |
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
- name: Setup sources for ROS 2
run: |
sudo apt-get update && sudo apt-get install -y curl gnupg2 lsb-release
curl -sL https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'
- name: Install ROS 2 dependencies
run: |
sudo apt-get update && sudo apt-get install -y python3-colcon-common-extensions python3-vcstool python3-lark-parser python3-dev
- name: Install colcon extensions for Gradle
run: |
sudo pip3 install git+git://github.com/colcon/colcon-gradle.git
sudo pip3 install git+git://github.com/colcon/colcon-ros-gradle.git
- name: Install Android NDK
run: |
curl -LO https://dl.google.com/android/repository/android-ndk-r21d-linux-x86_64.zip
unzip android-ndk-r21d-linux-x86_64.zip
- name: Setup workspace with VCS repo file
run: |
mkdir -p ros2_java_ws/src
cd ros2_java_ws
curl -sL file://${{ github.workspace }}/ros2_java_android.repos | vcs import src
# Use checked out version of ros2_java
rm -rf src/ros2_java/ros2_java
ln --symbolic ${{ github.workspace }} src/ros2_java
- name: Build ros2_java for Android
run: |
export PYTHON3_EXEC="$( which python3 )"
export PYTHON3_LIBRARY="$( ${PYTHON3_EXEC} -c 'import os.path; from distutils import sysconfig; print(os.path.realpath(os.path.join(sysconfig.get_config_var("LIBPL"), sysconfig.get_config_var("LDLIBRARY"))))' )"
export PYTHON3_INCLUDE_DIR="$( ${PYTHON3_EXEC} -c 'from distutils import sysconfig; print(sysconfig.get_config_var("INCLUDEPY"))' )"
export ANDROID_ABI=armeabi-v7a
export ANDROID_NATIVE_API_LEVEL=android-21
export ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-clang
export ANDROID_NDK=${PWD}/android-ndk-r21d

cd ros2_java_ws
colcon build \
--packages-ignore cyclonedds rcl_logging_log4cxx rosidl_generator_py \
--packages-up-to rcljava \
--cmake-args \
-DPYTHON_EXECUTABLE=${PYTHON3_EXEC} \
-DPYTHON_LIBRARY=${PYTHON3_LIBRARY} \
-DPYTHON_INCLUDE_DIR=${PYTHON3_INCLUDE_DIR} \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DANDROID_FUNCTION_LEVEL_LINKING=OFF \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \
-DANDROID_TOOLCHAIN_NAME=${ANDROID_TOOLCHAIN_NAME} \
-DANDROID_STL=c++_shared \
-DANDROID_ABI=${ANDROID_ABI} \
-DANDROID_NDK=${ANDROID_NDK} \
-DTHIRDPARTY=ON \
-DCOMPILE_EXAMPLES=OFF \
-DCMAKE_FIND_ROOT_PATH="${PWD}/install"
224 changes: 108 additions & 116 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,31 @@
ROS2 for Java
=============
# ROS 2 Java client library

Build status
------------
### Build status

| Target | Status |
|----------|--------|
| **Ubuntu Xenial (OpenJDK)** | [![Build Status](http://vsts-matrix-badges.herokuapp.com/repos/ros2-java/ros2-java/1/branches/master/1)](https://dev.azure.com/ros2-java/ros2-java/_build?definitionId=1) |
| **Ubuntu Xenial (Android)** | [![Build Status](http://vsts-matrix-badges.herokuapp.com/repos/ros2-java/ros2-java/1/branches/master/2)](https://dev.azure.com/ros2-java/ros2-java/_build?definitionId=1) |
| Target | Status |
|-------------------------------------------|---------------|
| **ROS Dashing - Ubuntu Bionic (OpenJDK)** | ![Build Status](https://github.com/ros2-java/ros2_java/workflows/CI/badge.svg?branch=dashing) |

Introduction
------------
## Introduction

This is a set of projects (bindings, code generator, examples and more) that enables developers to write ROS2
This is a set of projects (bindings, code generator, examples and more) that enables developers to write ROS 2
applications for the JVM and Android.

Besides this repository itself, there's also:
- https://github.com/esteve/ament_java, which adds support for Gradle to Ament
- https://github.com/esteve/ament_gradle_plugin, a Gradle plugin that makes it easier to use ROS2 in Java and Android project. The Gradle plugin can be installed from Gradle Central https://plugins.gradle.org/plugin/org.ros2.tools.gradle
- https://github.com/esteve/ros2_java_examples, examples for the Java Runtime Environment
- https://github.com/esteve/ros2_android_examples, examples for Android
- https://github.com/ros2-java/ament_java, which adds support for Gradle to Ament
- https://github.com/ros2-java/ament_gradle_plugin, a Gradle plugin that makes it easier to use ROS 2 in Java and Android project. The Gradle plugin can be installed from Gradle Central https://plugins.gradle.org/plugin/org.ros2.tools.gradle
- https://github.com/ros2-java/ros2_java_examples, examples for the Java Runtime Environment
- https://github.com/ros2-java/ros2_android_examples, examples for Android

Is this Java only?
------------------
### Is this Java only?

No, any language that targets the JVM can be used to write ROS2 applications.
No, any language that targets the JVM can be used to write ROS 2 applications.

Including Android?
------------------
### Including Android?

Yep! Make sure to use Fast-RTPS as your DDS vendor and at least [this revision](https://github.com/eProsima/Fast-RTPS/commit/5301ef203d45528a083821c3ba582164d782360b).

Features
--------
### Features

The current set of features include:
- Generation of all builtin and complex ROS types, including arrays, strings, nested types, constants, etc.
Expand All @@ -41,76 +34,80 @@ The current set of features include:
- Clients and services
- Timers
- Composition (i.e. more than one node per process)
- Time handling (system and steady, ROS time not yet supported https://github.com/ros2/ros2/issues/350)
- Time handling (system and steady, ROS time not yet supported https://github.com/ros2-java/ros2_java/issues/122)
- Support for Android
- Parameters services and clients (both asynchronous and synchronous)

Sounds great, how can I try this out?
-------------------------------------
## Sounds great, how can I try this out?

### Install dependencies

> Note: While the following instructions use a Linux shell the same can be done on other platforms like Windows with slightly adjusted commands.
>
> For Windows and Mac, first follow the steps for installing prerequisites on the binary installation page: https://github.com/ros2/ros2/wiki/Installation
>
> Stop and return here when you reach the "Downloading ROS 2" section.

Download the ament repositories in a separate workspace:
1. [Install ROS 2](https://index.ros.org/doc/ros2/Installation).

1. Install Java and a JDK.

On Ubuntu, you can install OpenJDK with:

sudo apt install default-jdk

1. Install Gradle.
Make sure you have Gradle 3.2 (or later) installed.

*Ubuntu Bionic or later*

sudo apt install gradle

*macOS*

brew install gradle

Note: if run into compatibily issues between gradle 3.x and Java 9, try using Java 8,

brew tap caskroom/versions
brew cask install java8
export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.8.0.jdk/Contents/Home

*Windows*

choco install gradle

1. Install build tools:

sudo apt install curl python3-colcon-common-extensions python3-pip python3-vcstool

```
mkdir -p ament_ws/src
cd ament_ws
curl -skL https://raw.githubusercontent.com/esteve/ament_java/master/ament_java.repos -o ament_java.repos
vcs import src < ament_java.repos
src/ament/ament_tools/scripts/ament.py build --symlink-install --isolated
```
1. Install Gradle extensions for colcon:

> Note: On Windows, use `python src/ament/ament_tools/scripts/ament.py build`, as `*.py` scripts must be prefixed with `python`, `--symlink-install` is not supported due to a bug in Python symlinks, and `--isolated` creates paths that are too long.
> Additionally, you may need to call `call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"` if you have not run from a VS 2017 terminal.
python3 -m pip install -U git+https://github.com/colcon/colcon-gradle
python3 -m pip install --no-deps -U git+https://github.com/colcon/colcon-ros-gradle

We need to split the build process between Ament and the rest of `ros2_java` workspace so that the additional build type for Gradle projects is picked up by Ament.
### Download and Build ROS 2 Java for Desktop

Make sure you have Gradle 3.2 (or later) installed. Ubuntu 16.04 ships with Gradle 2.10, you can install a more recent version of Gradle from the following PPA:
1. Source your ROS 2 installation, for example:

```
$ sudo add-apt-repository ppa:cwchien/gradle
$ sudo apt install -y gradle
```
For OSX, use homebrew command to install gradle:
source /opt/ros/dashing/setup.bash

```
$ brew install gradle
```
1. Download the ROS 2 Java repositories into a workspace:

For OSX users, there some compatibily issues have been reported between gradle 3.x and Java 9. Currently only the combination of Gradle 3.x + Java 8 has been tested successfully. Make sure to use install and use Java 8 for the building process:
mkdir -p ros2_java_ws/src
cd ros2_java_ws
curl -skL https://raw.githubusercontent.com/ros2-java/ros2_java/dashing/ros2_java_desktop.repos | vcs import src

```
$ brew tap caskroom/versions
$ brew cask install java8
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.8.0.jdk/Contents/Home
```
1. **Linux only** Install ROS dependencies:

> Note: On Windows, you may use `choco install -y gradle`
rosdep install --from-paths src -y -i --skip-keys "ament_tools"

The following sections deal with building the `ros2_java` codebase for the desktop Java runtime and for Android.
1. Build desktop packages:

Desktop
-------
colcon build --symlink-install

```
mkdir -p ros2_java_ws/src
cd ros2_java_ws
curl -skL https://raw.githubusercontent.com/esteve/ros2_java/master/ros2_java_desktop.repos -o ros2_java_desktop.repos
vcs import src < ros2_java_desktop.repos
. ../ament_ws/install_isolated/local_setup.sh
ament build --symlink-install --isolated
```
*Note, on Windows we have to use `--merge-install`*

> On Windows, if you would like to use OpenSplice, call `call "C:\opensplice67\HDE\x86_64.win64\release.bat"` before building.
colcon build --merge-install

Now you can just run a bunch of examples, head over to https://github.com/esteve/ros2_java_examples for more information.

Android
-------
### Download and Build ROS 2 Java for Android

The Android setup is slightly more complex, you'll need the SDK and NDK installed, and an Android device where you can run the examples.

Expand All @@ -122,48 +119,43 @@ We'll also need to have the [Android SDK](https://developer.android.com/studio/#

Although the `ros2_java_android.repos` file contains all the repositories for the Android bindings to compile, we'll have to disable certain packages (`python_cmake_module`, `rosidl_generator_py`, `test_msgs`) that are included the repositories and that we either don't need or can't cross-compile properly (e.g. the Python generator)

```
# define paths
ROOT_DIR = ${HOME}
AMENT_WORKSPACE=${ROOT_DIR}/ament_ws
ROS2_ANDROID_WORKSPACE=${ROOT_DIR}/ros2_android_ws

# pull and build ament
mkdir -p ${AMENT_WORKSPACE}/src
cd ${AMENT_WORKSPACE}
wget https://raw.githubusercontent.com/esteve/ament_java/master/ament_java.repos
vcs import ${AMENT_WORKSPACE}/src < ament_java.repos
src/ament/ament_tools/scripts/ament.py build --symlink-install --isolated

# android build configuration
export PYTHON3_EXEC="$( which python3 )"
export ANDROID_ABI=armeabi-v7a
export ANDROID_NATIVE_API_LEVEL=android-21
export ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-clang

# pull and build ros2 for android
mkdir -p ${ROS2_ANDROID_WORKSPACE}/src
cd ${ROS2_ANDROID_WORKSPACE}
wget https://raw.githubusercontent.com/esteve/ros2_java/master/ros2_java_android.repos
vcs import ${ROS2_ANDROID_WORKSPACE}/src < ros2_java_android.repos
source ${AMENT_WORKSPACE}/install_isolated/local_setup.sh
ament build --isolated --skip-packages test_msgs \
--cmake-args \
-DPYTHON_EXECUTABLE=${PYTHON3_EXEC} \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_FUNCTION_LEVEL_LINKING=OFF \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \
-DANDROID_TOOLCHAIN_NAME=${ANDROID_TOOLCHAIN_NAME} \
-DANDROID_STL=gnustl_shared \
-DANDROID_ABI=${ANDROID_ABI} \
-DANDROID_NDK=${ANDROID_NDK} \
-DTHIRDPARTY=ON \
-DCOMPILE_EXAMPLES=OFF \
-DCMAKE_FIND_ROOT_PATH="$AMENT_WORKSPACE/install_isolated;$ROS2_ANDROID_WORKSPACE/install_isolated" \
-- \
--parallel \
--ament-gradle-args \
-Pament.android_stl=gnustl_shared -Pament.android_abi=$ANDROID_ABI -Pament.android_ndk=$ANDROID_NDK --
```

You can find more information about the Android examples at https://github.com/esteve/ros2_android_examples
1. Download the [Android NDK](https://developer.android.com/ndk/downloads/index.html) and set the environment variable `ANDROID_NDK` to the path where it is extracted.

1. Download the [Android SDK](https://developer.android.com/studio/#downloads) and set the environment variable `ANDROID_HOME` to the path where it is extracted.

1. Clone ROS 2 and ROS 2 Java source code:

mkdir -p $HOME/ros2_android_ws/src
cd $HOME/ros2_android_ws
curl https://raw.githubusercontent.com/ros2-java/ros2_java/dashing/ros2_java_android.repos | vcs import src

1. Set Android build configuration:

export PYTHON3_EXEC="$( which python3 )"
export PYTHON3_LIBRARY="$( ${PYTHON3_EXEC} -c 'import os.path; from distutils import sysconfig; print(os.path.realpath(os.path.join(sysconfig.get_config_var("LIBPL"), sysconfig.get_config_var("LDLIBRARY"))))' )"
export PYTHON3_INCLUDE_DIR="$( ${PYTHON3_EXEC} -c 'from distutils import sysconfig; print(sysconfig.get_config_var("INCLUDEPY"))' )"
export ANDROID_ABI=armeabi-v7a
export ANDROID_NATIVE_API_LEVEL=android-21
export ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-clang

1. Build (skipping packages that we don't need or can't cross-compile):

colcon build \
--packages-ignore cyclonedds rcl_logging_log4cxx rosidl_generator_py \
--packages-up-to rcljava \
--cmake-args \
-DPYTHON_EXECUTABLE=${PYTHON3_EXEC} \
-DPYTHON_LIBRARY=${PYTHON3_LIBRARY} \
-DPYTHON_INCLUDE_DIR=${PYTHON3_INCLUDE_DIR} \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DANDROID_FUNCTION_LEVEL_LINKING=OFF \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \
-DANDROID_TOOLCHAIN_NAME=${ANDROID_TOOLCHAIN_NAME} \
-DANDROID_STL=c++_shared \
-DANDROID_ABI=${ANDROID_ABI} \
-DANDROID_NDK=${ANDROID_NDK} \
-DTHIRDPARTY=ON \
-DCOMPILE_EXAMPLES=OFF \
-DCMAKE_FIND_ROOT_PATH="${PWD}/install"

You can find more information about the Android examples at https://github.com/ros2-java/ros2_android_examples
Loading