initial
This commit is contained in:
parent
bb73c40ed2
commit
0defcbaaa6
@ -1,9 +1,9 @@
|
||||
# Use ROS 2 Humble Hawksbill base image
|
||||
FROM osrf/ros:humble-desktop-full
|
||||
FROM osrf/ros:humble-desktop-full-jammy
|
||||
|
||||
# Update and install dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
python3-colcon-common-extensions \
|
||||
python3-colcon-common-extensions python3-pip \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY requirements.txt ./
|
||||
@ -13,7 +13,7 @@ RUN pip install --no-cache-dir -r requirements.txt
|
||||
WORKDIR /ros2_ws
|
||||
|
||||
# Copy your ROS 2 package into the workspace
|
||||
COPY ./ros2_ws/src /ros2_ws/src
|
||||
COPY ./src /ros2_ws/src
|
||||
|
||||
# Build your package
|
||||
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'
|
||||
services:
|
||||
ros2:
|
||||
build: ..
|
||||
build: .
|
||||
volumes:
|
||||
- ./ros2_ws/src:/ros2_ws/src
|
||||
- ./src:/ros2_ws/src
|
||||
networks:
|
||||
- ros_network
|
||||
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):
|
||||
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-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>InteractionMsgs</name>
|
||||
<name>interaction_msgs</name>
|
||||
<version>0.0.0</version>
|
||||
<description>TODO: Package description</description>
|
||||
<maintainer email="nikolaus.feith@unileoben.ac.at">niko</maintainer>
|
||||
@ -9,6 +9,11 @@
|
||||
|
||||
<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_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