This commit is contained in:
Niko Feith 2024-02-15 12:04:54 +01:00
parent bb73c40ed2
commit 0defcbaaa6
21 changed files with 131 additions and 209 deletions

View File

@ -1,9 +1,9 @@
# Use ROS 2 Humble Hawksbill base image # Use ROS 2 Humble Hawksbill base image
FROM osrf/ros:humble-desktop-full FROM osrf/ros:humble-desktop-full-jammy
# Update and install dependencies # Update and install dependencies
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
python3-colcon-common-extensions \ python3-colcon-common-extensions python3-pip \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
COPY requirements.txt ./ COPY requirements.txt ./
@ -13,7 +13,7 @@ RUN pip install --no-cache-dir -r requirements.txt
WORKDIR /ros2_ws WORKDIR /ros2_ws
# Copy your ROS 2 package into the workspace # Copy your ROS 2 package into the workspace
COPY ./ros2_ws/src /ros2_ws/src COPY ./src /ros2_ws/src
# Build your package # Build your package
RUN . /opt/ros/humble/setup.sh && \ RUN . /opt/ros/humble/setup.sh && \

View File

@ -0,0 +1,78 @@
# Interactive Robot Learning Framework
Welcome to the Interactive Robot Learning Framework, a modular and extensible system designed for robotics research and development. This framework utilizes Docker and ROS2 to provide a flexible and isolated environment for experimenting with robot learning algorithms, interaction metrics, objective functions, representation models, benchmark environments, and communication messages.
## Getting Started
This section will guide you through the process of setting up the Docker container for the framework. [Final startup instructions will be provided by the user.]
### Prerequisites
- Docker
- ROS2 Foxy Fitzroy (or your target ROS2 distribution)
### Installation
1. Clone the repository:
```bash
git clone [repository-url]
cd [repository-name]
```
2. Build the Docker container:
```bash
docker build -t interactive-robot-learning-framework .
```
3. Launch the Docker container using docker-compose:
```bash
docker-compose up -d
```
## Framework Structure
The Interactive Robot Learning Framework consists of several key ROS2 packages, each responsible for different aspects of robot learning and interaction. Below is an overview of each package:
### Optimizer ROS2 Package
- **Description**: Contains various optimization algorithms designed to fine-tune robot learning parameters.
- **Key Components**: Gradient descent, genetic algorithms, simulated annealing, etc.
### InteractionQuery Package
- **Description**: Implements metrics to quantify and analyze user interactions with the optimizer, facilitating adaptive learning processes.
- **Key Components**: Engagement level, feedback quality, interaction frequency, etc.
### ObjectiveFunctions Package
- **Description**: Houses the objective functions used by optimizers to evaluate the performance of robot learning tasks.
- **Key Components**: Loss functions, reward functions, etc.
### RepresentationModel Package
- **Description**: Provides models for representing robot trajectories in a manner conducive to learning and optimization.
- **Key Components**: Graphical models, neural networks, geometric representations, etc.
### Benchmark Package
- **Description**: Includes various reinforcement learning (RL) benchmark environments for testing and evaluating learning algorithms.
- **Key Components**: Simulated robotics tasks, navigation challenges, manipulation tasks, etc.
### InteractionMsgs Package
- **Description**: Contains all necessary ROS2 messages, services, and actions for facilitating communication within the framework.
- **Key Components**: Custom message definitions, service calls for optimizer control, action definitions for task execution, etc.
## Starting Up
[This section will be completed by the user, detailing the steps to initialize the framework and begin experiments.]
## Contributing
We welcome contributions to the Interactive Robot Learning Framework! Please read our contributing guidelines for more information on how to participate in the development.
## License
[Specify the license under which the framework is released, e.g., MIT, GPL, Apache.]
## Acknowledgments
[Optional: Acknowledge any contributions, inspirations, or frameworks that assisted in the development of this project.]

View File

@ -1,9 +1,9 @@
version: '3.8' version: '3.8'
services: services:
ros2: ros2:
build: .. build: .
volumes: volumes:
- ./ros2_ws/src:/ros2_ws/src - ./src:/ros2_ws/src
networks: networks:
- ros_network - ros_network
tty: true tty: true

View File

@ -1 +0,0 @@
numpy==1.26.4

View File

@ -1,55 +0,0 @@
import numpy as np
from scipy.stats import norm
class MaxAcqQuery:
def __init__(self, threshold, gp,
nr_test, nr_weights,
lower=-1.0, upper=1.0,
acq="Expected Improvement",
**kwargs):
self.threshold = threshold
self.gp = gp
self.nr_test = nr_test
self.nr_weights = nr_weights
self.lower = lower
self.upper = upper
self.acq = acq
self.seed = kwargs.get('seed', None)
self.kappa = kwargs.get('kappa', 2.576)
self.beta = kwargs.get('beta', 1.2)
self.X = kwargs.get('X', None)
self.rng = np.random.default_rng(self.seed)
def query(self):
X_test = self.rng.uniform(self.lower, self.upper, (self.nr_test, self.nr_weights))
max_acq = 0
if self.acq == "Expected Improvement":
if self.X is None:
raise ValueError
y_hat = self.gp.predict(self.X)
best_y = max(y_hat)
mu, sigma = self.gp.predict(X_test, return_std=True)
z = (mu - best_y - self.kappa) / sigma
ei = (mu - best_y - self.kappa) * norm.cdf(z) + sigma * norm.pdf(z)
max_acq = np.max(ei)
if self.acq == "Probability of Improvement":
if self.X is None:
raise ValueError
y_hat = self.gp.predict(self.X)
best_y = max(y_hat)
mu, sigma = self.gp.predict(X_test, return_std=True)
z = (mu - best_y - self.kappa) / sigma
pi = norm.cdf(z)
max_acq = np.max(pi)
if self.acq == "Upper Confidence Bound":
mu, sigma = self.gp.predict(X_test, return_std=True)
cb = mu + self.beta * sigma
max_acq = np.max(cb)
return max_acq > self.threshold

View File

@ -1,18 +0,0 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>InteractionMetrics</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="nikolaus.feith@unileoben.ac.at">niko</maintainer>
<license>TODO: License declaration</license>
<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend>
<test_depend>python3-pytest</test_depend>
<export>
<build_type>ament_python</build_type>
</export>
</package>

View File

@ -1,4 +0,0 @@
[develop]
script_dir=$base/lib/InteractionMetrics
[install]
install_scripts=$base/lib/InteractionMetrics

View File

@ -1,25 +0,0 @@
from setuptools import find_packages, setup
package_name = 'InteractionMetrics'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='niko',
maintainer_email='nikolaus.feith@unileoben.ac.at',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
],
},
)

View File

@ -1,25 +0,0 @@
# Copyright 2015 Open Source Robotics Foundation, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from ament_copyright.main import main
import pytest
# Remove the `skip` decorator once the source file(s) have a copyright header
@pytest.mark.skip(reason='No copyright header has been placed in the generated source file.')
@pytest.mark.copyright
@pytest.mark.linter
def test_copyright():
rc = main(argv=['.', 'test'])
assert rc == 0, 'Found errors'

View File

@ -1,25 +0,0 @@
# Copyright 2017 Open Source Robotics Foundation, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from ament_flake8.main import main_with_errors
import pytest
@pytest.mark.flake8
@pytest.mark.linter
def test_flake8():
rc, errors = main_with_errors(argv=[])
assert rc == 0, \
'Found %d code style errors / warnings:\n' % len(errors) + \
'\n'.join(errors)

View File

@ -1,23 +0,0 @@
# Copyright 2015 Open Source Robotics Foundation, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from ament_pep257.main import main
import pytest
@pytest.mark.linter
@pytest.mark.pep257
def test_pep257():
rc = main(argv=['.', 'test'])
assert rc == 0, 'Found code style errors / warnings'

View File

@ -1,26 +0,0 @@
cmake_minimum_required(VERSION 3.8)
project(InteractionMsgs)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()

View File

@ -0,0 +1,4 @@
import rclpy
from rclpy.node import Node
from interaction_msgs.srv import Query

View File

@ -8,4 +8,3 @@ class RandomQuery:
def query(self): def query(self):
return self.random > self.threshold return self.random > self.threshold

View File

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.8)
project(interaction_msgs)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/Query.srv"
DEPENDENCIES
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()

View File

@ -1,7 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"> <package format="3">
<name>InteractionMsgs</name> <name>interaction_msgs</name>
<version>0.0.0</version> <version>0.0.0</version>
<description>TODO: Package description</description> <description>TODO: Package description</description>
<maintainer email="nikolaus.feith@unileoben.ac.at">niko</maintainer> <maintainer email="nikolaus.feith@unileoben.ac.at">niko</maintainer>
@ -9,6 +9,11 @@
<buildtool_depend>ament_cmake</buildtool_depend> <buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend> <test_depend>ament_lint_common</test_depend>

View File

@ -0,0 +1,15 @@
# random query
float32 threshold
# regular query
uint16 frequency
uint16 current_episode
# improvement query
# float32 threshold
uint16 period
uint16 last_queried_episode
float32[] rewards
---
bool interaction