initial
This commit is contained in:
parent
bb73c40ed2
commit
0defcbaaa6
@ -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 && \
|
||||||
|
78
README.md
78
README.md
@ -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.]
|
@ -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
|
||||||
|
@ -1 +0,0 @@
|
|||||||
numpy==1.26.4
|
|
@ -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
|
|
@ -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>
|
|
@ -1,4 +0,0 @@
|
|||||||
[develop]
|
|
||||||
script_dir=$base/lib/InteractionMetrics
|
|
||||||
[install]
|
|
||||||
install_scripts=$base/lib/InteractionMetrics
|
|
@ -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': [
|
|
||||||
],
|
|
||||||
},
|
|
||||||
)
|
|
@ -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'
|
|
@ -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)
|
|
@ -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'
|
|
@ -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()
|
|
4
src/InteractionQuery/InteractionQuery/query_node.py
Normal file
4
src/InteractionQuery/InteractionQuery/query_node.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import rclpy
|
||||||
|
from rclpy.node import Node
|
||||||
|
|
||||||
|
from interaction_msgs.srv import Query
|
@ -8,4 +8,3 @@ class RandomQuery:
|
|||||||
|
|
||||||
def query(self):
|
def query(self):
|
||||||
return self.random > self.threshold
|
return self.random > self.threshold
|
||||||
|
|
23
src/interaction_msgs/CMakeLists.txt
Normal file
23
src/interaction_msgs/CMakeLists.txt
Normal 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()
|
@ -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>
|
||||||
|
|
15
src/interaction_msgs/srv/Query.srv
Normal file
15
src/interaction_msgs/srv/Query.srv
Normal 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
|
Loading…
Reference in New Issue
Block a user