Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
41 changes: 34 additions & 7 deletions hardware_interface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ find_package(ament_cmake REQUIRED)
find_package(control_msgs REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rcpputils REQUIRED)
find_package(tinyxml2_vendor REQUIRED)
find_package(TinyXML2 REQUIRED)

add_library(
hardware_interface
Expand All @@ -26,26 +28,41 @@ add_library(
target_include_directories(
hardware_interface
PUBLIC
include)
include
)
ament_target_dependencies(
hardware_interface
control_msgs
rclcpp
rcpputils
)

# Causes the visibility macros to use dllexport rather than dllimport,
# which is appropriate when building the dll but not consuming it.
target_compile_definitions(hardware_interface PRIVATE "HARDWARE_INTERFACE_BUILDING_DLL")

add_library(
component_parser
src/component_parser.cpp
)
target_include_directories(
component_parser
PUBLIC
include
)
ament_target_dependencies(
component_parser
TinyXML2
)

target_compile_definitions(component_parser PRIVATE "HARDWARE_INTERFACE_BUILDING_DLL")

install(
DIRECTORY include/
DESTINATION include
)

install(
TARGETS
hardware_interface
TARGETS hardware_interface component_parser
RUNTIME DESTINATION bin
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib)
Expand All @@ -64,6 +81,10 @@ if(BUILD_TESTING)
target_include_directories(test_robot_hardware_interfaces PRIVATE include)
target_link_libraries(test_robot_hardware_interfaces hardware_interface)

ament_add_gmock(test_component_parser test/test_component_parser.cpp)
target_link_libraries(test_component_parser component_parser)
ament_target_dependencies(test_component_parser TinyXML2)

ament_add_gmock(test_register_actuators test/test_register_actuators.cpp)
target_include_directories(test_register_actuators PRIVATE include)
target_link_libraries(test_register_actuators hardware_interface)
Expand All @@ -73,14 +94,20 @@ if(BUILD_TESTING)
target_include_directories(test_actuator_handle PRIVATE include)
target_link_libraries(test_actuator_handle hardware_interface)
ament_target_dependencies(test_actuator_handle rcpputils)

endif()

ament_export_dependencies(
rclcpp
rcpputils
)
ament_export_include_directories(
include
)
ament_export_libraries(
hardware_interface)
hardware_interface
component_parser
)
ament_export_dependencies(
control_msgs)
control_msgs
)
ament_package()
98 changes: 98 additions & 0 deletions hardware_interface/include/hardware_interface/component_info.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Copyright 2020 ros2_control Development Team
//
// 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.


#ifndef HARDWARE_INTERFACE__COMPONENT_INFO_HPP_
#define HARDWARE_INTERFACE__COMPONENT_INFO_HPP_

#include <string>
#include <unordered_map>
#include <vector>

namespace hardware_interface
{

/**
* \brief This structure stores information about components defined in a robot's URDF.
*/
struct ComponentInfo
{
/**
* \brief name of the component.
*/
std::string name;
/**
* \brief type of the component: joint or sensor.
*/
std::string type;
/**
* \brief component's class, which will be dynamically loaded.
*/
std::string class_type;
/**
* \brief joint where component is placed.
*/
std::string joint;
/**
* \brief name of the interface, e.g. "position", "velocity", etc. for meaning of data this component holds.
*/
std::vector<std::string> interface_names;
/**
* \brief (optional) key-value pairs of components parameters.
*/
std::unordered_map<std::string, std::string> parameters;
/**
* \brief (optional) hardware class of the component that will be dynamically loaded.
* If not defined, the resources's hardware class has to be defined.
*/
std::string hardware_class_type;
/**
* \brief (optional) key-value pairs for components hardware.
*/
std::unordered_map<std::string, std::string> hardware_parameters;
};

/**
* \brief This structure stores informations about ros2-control ressource defined in robot's URDF, i.e. "ros2_control"-tag.
* A ressource is composed from one or multiple joints, actuators or systems.
*/
struct ControlRessourceInfo
{
/**
* \brief name of the ressource.
*/
std::string name;
/**
* \brief type of the ressource: system, modular or sensor.
* Note: URDF always needs a "robot" tag, nevertheless in terms of ros2_control, it can hold a definition for only a joint (e.g. motor) or sensor.
*/
std::string type;
/**
* \brief (optional) hardware class of the system, which will be dynamically loaded.
* If not defined, a hardware class for each subcomponent has to be defined.
*/
std::string hardware_class_type;
/**
* \brief (optional) key-value pairs for systems hardware.
*/
std::unordered_map<std::string, std::string> hardware_parameters;
/**
* \brief list of subcomponents in the system, i.e., list of sensors and actuators.
*/
std::vector<ComponentInfo> components;
};

} // namespace hardware_interface

#endif // HARDWARE_INTERFACE__COMPONENT_INFO_HPP_
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Copyright 2020 ros2_control Development Team
//
// 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.

#ifndef HARDWARE_INTERFACE__COMPONENT_INTERFACES__JOINT_INTERFACE_HPP_
#define HARDWARE_INTERFACE__COMPONENT_INTERFACES__JOINT_INTERFACE_HPP_

#include <algorithm>
#include <array>
#include <string>
#include <vector>

#include "hardware_interface/component_info.hpp"
#include "hardware_interface/types/hardware_interface_return_values.hpp"
#include "hardware_interface/visibility_control.h"

namespace hardware_interface
{

class JointInterface
{
public:
HARDWARE_INTERFACE_PUBLIC
JointInterface() = default;

HARDWARE_INTERFACE_PUBLIC
virtual
~JointInterface() = default;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type configure(const ComponentInfo & actuator_info) = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
std::string get_interface_name() const = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type start() = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type stop() = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
bool is_started() const = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type read(double & data) = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type write(const double & data) = 0;
};

} // namespace hardware_interface
#endif // HARDWARE_INTERFACE__COMPONENT_INTERFACES__JOINT_INTERFACE_HPP_
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Copyright 2020 ros2_control Development Team
//
// 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.

#ifndef HARDWARE_INTERFACE__COMPONENT_INTERFACES__SENSOR_INTERFACE_HPP_
#define HARDWARE_INTERFACE__COMPONENT_INTERFACES__SENSOR_INTERFACE_HPP_

#include <string>

#include "hardware_interface/component_info.hpp"
#include "hardware_interface/types/hardware_interface_return_values.hpp"
#include "hardware_interface/visibility_control.h"

namespace hardware_interface
{

class SensorInterface
{
public:
HARDWARE_INTERFACE_PUBLIC
SensorInterface() = default;

HARDWARE_INTERFACE_PUBLIC
virtual
~SensorInterface() = default;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type configure(const ComponentInfo & sensor_info) = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
std::string get_interface_name() const = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type start() = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type stop() = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
bool is_started() const = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type read(double & data) = 0;
};

} // namespace hardware_interface
#endif // HARDWARE_INTERFACE__COMPONENT_INTERFACES__SENSOR_INTERFACE_HPP_
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Copyright 2020 ros2_control Development Team
//
// 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.

#ifndef HARDWARE_INTERFACE__COMPONENT_INTERFACES__SYSTEM_INTERFACE_HPP_
#define HARDWARE_INTERFACE__COMPONENT_INTERFACES__SYSTEM_INTERFACE_HPP_

#include <string>
#include <vector>

#include "hardware_interface/component_info.hpp"
#include "hardware_interface/types/hardware_interface_return_values.hpp"
#include "hardware_interface/visibility_control.h"

namespace hardware_interface
{

class SystemInterface
{
public:
HARDWARE_INTERFACE_PUBLIC
SystemInterface() = default;

HARDWARE_INTERFACE_PUBLIC
virtual
~SystemInterface() = default;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type configure(const SystemInfo & system_info) = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
std::vector<std::string> get_interface_names() const = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type start() = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type stop() = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
bool is_started() const = 0;

HARDWARE_INTERFACE_PUBLIC
virtual
return_type read(std::vector<double> & data) = 0;
Comment on lines +58 to +60
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as mentioned yesterday, it is not really clear to me what read does here. Imagine I have a robot with an integrated sensor. First off, how do I know which sensor to address here and their size of data? You can imagine that different sensors have different types of data to return.


return_type
virtual
write(const std::vector<double> & data) = 0;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this vector data comes from the resource manager? Or which entity is allocating the memory for the data?

};

typedef SystemInterface RobotInterface;

} // namespace hardware_interface
#endif // HARDWARE_INTERFACE__COMPONENT_INTERFACES__SYSTEM_INTERFACE_HPP_
Loading