YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
ControlBoard_nws_ros2.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2023 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#ifndef YARP_DEV_CONTROLBOARD_NWS_ROS2_H
7#define YARP_DEV_CONTROLBOARD_NWS_ROS2_H
8
12
19#include <yarp/dev/IAxisInfo.h>
20#include <Ros2Spinner.h>
21
22#include <yarp/os/Stamp.h>
23#include <yarp/sig/Vector.h>
24
25#include <string>
26#include <vector>
27
28#include <rclcpp/rclcpp.hpp>
29#include <sensor_msgs/msg/joint_state.hpp>
30#include <std_msgs/msg/header.hpp>
31#include <std_msgs/msg/float64_multi_array.hpp>
32#include <std_msgs/msg/int8_multi_array.hpp>
33#include <map>
34
35//Custom ros2 interfaces
36#include <yarp_control_msgs/srv/get_control_modes.hpp>
37#include <yarp_control_msgs/srv/get_position.hpp>
38#include <yarp_control_msgs/srv/get_velocity.hpp>
39#include <yarp_control_msgs/srv/set_control_modes.hpp>
40#include <yarp_control_msgs/srv/get_available_control_modes.hpp>
41#include <yarp_control_msgs/srv/get_joints_names.hpp>
42#include <yarp_control_msgs/msg/position.hpp>
43#include <yarp_control_msgs/msg/velocity.hpp>
44#include <yarp_control_msgs/msg/position_direct.hpp>
46
47#include <mutex>
48
49
50
68{
69private:
70 sensor_msgs::msg::JointState m_ros_struct;
71
72 yarp::sig::Vector m_times; // time for each joint
73
74 std::vector<std::string> m_jointNames; // name of the joints
75 std::string m_nodeName; // name of the rosNode
76 std::string m_jointStateTopicName; // name of the rosTopic
77 std::string m_jointControlModeTopicName;
78 std::string m_posTopicName;
79 std::string m_posDirTopicName;
80 std::string m_velTopicName;
81 std::string m_getModesSrvName;
82 std::string m_getPositionSrvName;
83 std::string m_getVelocitySrvName;
84 std::string m_setModesSrvName;
85 std::string m_getJointsNamesSrvName;
86 std::string m_getAvailableModesSrvName;
87 std::map<std::string,size_t> m_quickJointRef;
88 mutable std::mutex m_cmdMutex;
89
90// yarp::os::Node* node; // ROS node
91 std::uint32_t m_counter {0}; // incremental counter in the ROS message
92
93// yarp::os::PortWriterBuffer<yarp::rosmsg::sensor_msgs::JointState> rosOutputState_buffer; // Buffer associated to the ROS topic
94// yarp::os::Publisher<yarp::rosmsg::sensor_msgs::JointState> rosPublisherPort; // Dedicated ROS topic publisher
95
96 rclcpp::Publisher<sensor_msgs::msg::JointState>::SharedPtr m_publisherJointStates;
97 rclcpp::Publisher<std_msgs::msg::Int8MultiArray>::SharedPtr m_publisherControlModes;
98 rclcpp::Node::SharedPtr m_node;
99
100 static constexpr double m_default_period = 0.02; // s
101
102 yarp::os::Stamp m_time; // envelope to attach to the state port
103
104 size_t m_subdevice_joints {0};
105
106 // Devices
107 yarp::dev::DeviceDriver* m_subdevice_ptr{nullptr};
108 yarp::dev::IAxisInfo* m_iAxisInfo{nullptr};
109 yarp::dev::IEncodersTimed* m_iEncodersTimed{nullptr};
110 yarp::dev::ITorqueControl* m_iTorqueControl{nullptr};
111 yarp::dev::IPositionDirect* m_iPositionDirect{nullptr};
112 yarp::dev::IVelocityControl* m_iVelocityControl{nullptr};
113 yarp::dev::IControlMode* m_iControlMode{nullptr};
114 yarp::dev::IPositionControl* m_iPositionControl{nullptr};
115
116 // Ros2 related attributes
117 Ros2Spinner* m_spinner{nullptr};
118 rclcpp::Subscription<yarp_control_msgs::msg::Position>::SharedPtr m_posSubscription;
119 rclcpp::Subscription<yarp_control_msgs::msg::PositionDirect>::SharedPtr m_posDirectSubscription;
120 rclcpp::Subscription<yarp_control_msgs::msg::Velocity>::SharedPtr m_velSubscription;
121 rclcpp::Service<yarp_control_msgs::srv::GetJointsNames>::SharedPtr m_getJointsNamesSrv;
122 rclcpp::Service<yarp_control_msgs::srv::GetControlModes>::SharedPtr m_getControlModesSrv;
123 rclcpp::Service<yarp_control_msgs::srv::GetPosition>::SharedPtr m_getPositionSrv;
124 rclcpp::Service<yarp_control_msgs::srv::GetVelocity>::SharedPtr m_getVelocitySrv;
125 rclcpp::Service<yarp_control_msgs::srv::SetControlModes>::SharedPtr m_setControlModesSrv;
126 rclcpp::Service<yarp_control_msgs::srv::GetAvailableControlModes>::SharedPtr m_getAvailableModesSrv;
127
128 bool setDevice(yarp::dev::DeviceDriver* device);
129 bool initRos2Control(const std::string& name);
130
131 void closeDevice();
132 void closePorts();
133 bool updateAxisName();
134
135 // Utilities
136 bool messageVectorsCheck(const std::string &valueName, const std::vector<std::string> &names, const std::vector<double> &ref_values, const std::vector<double> &derivative);
137 bool messageVectorsCheck(const std::string &valueName, const std::vector<std::string> &names, const std::vector<double> &ref_values);
138 bool messageVectorsCheck(const std::string &valueName, const std::vector<std::string> &names, const std::vector<std::string> &ref_values);
139 bool namesCheck(const std::vector<std::string> &names);
140
141 // Service callbacks
142 void getControlModesCallback(const std::shared_ptr<rmw_request_id_t> request_header,
143 const std::shared_ptr<yarp_control_msgs::srv::GetControlModes::Request> request,
144 std::shared_ptr<yarp_control_msgs::srv::GetControlModes::Response> response);
145 void getPositionCallback(const std::shared_ptr<rmw_request_id_t> request_header,
146 const std::shared_ptr<yarp_control_msgs::srv::GetPosition::Request> request,
147 std::shared_ptr<yarp_control_msgs::srv::GetPosition::Response> response);
148 void getVelocityCallback(const std::shared_ptr<rmw_request_id_t> request_header,
149 const std::shared_ptr<yarp_control_msgs::srv::GetVelocity::Request> request,
150 std::shared_ptr<yarp_control_msgs::srv::GetVelocity::Response> response);
151 void setControlModesCallback(const std::shared_ptr<rmw_request_id_t> request_header,
152 const std::shared_ptr<yarp_control_msgs::srv::SetControlModes::Request> request,
153 std::shared_ptr<yarp_control_msgs::srv::SetControlModes::Response> response);
154 void getJointsNamesCallback(const std::shared_ptr<rmw_request_id_t> request_header,
155 const std::shared_ptr<yarp_control_msgs::srv::GetJointsNames::Request> request,
156 std::shared_ptr<yarp_control_msgs::srv::GetJointsNames::Response> response);
157 void getAvailableModesCallback(const std::shared_ptr<rmw_request_id_t> request_header,
158 const std::shared_ptr<yarp_control_msgs::srv::GetAvailableControlModes::Request> request,
159 std::shared_ptr<yarp_control_msgs::srv::GetAvailableControlModes::Response> response);
160
161 //Subscription callbacks
162 void positionTopic_callback(const yarp_control_msgs::msg::Position::SharedPtr msg);
163 void positionDirectTopic_callback(const yarp_control_msgs::msg::PositionDirect::SharedPtr msg);
164 void velocityTopic_callback(const yarp_control_msgs::msg::Velocity::SharedPtr msg);
165
166public:
172 ~ControlBoard_nws_ros2() override = default;
173
174 // yarp::dev::DeviceDriver
175 bool close() override;
176 bool open(yarp::os::Searchable& prop) override;
177
178 // yarp::dev::IWrapper
179 bool attach(yarp::dev::PolyDriver* poly) override;
180 bool detach() override;
181
182 // yarp::os::PeriodicThread
183 void run() override;
184};
185
186#endif // YARP_DEV_CONTROLBOARD_NWS_ROS2_H
define control board standard interfaces
contains the definition of a Vector type
This class is the parameters parser for class ControlBoard_nws_ros2.
controlBoard_nws_ros2: A controlBoard network wrapper server for ROS2.
bool open(yarp::os::Searchable &prop) override
Open the DeviceDriver.
ControlBoard_nws_ros2(const ControlBoard_nws_ros2 &)=delete
void run() override
Loop function.
bool attach(yarp::dev::PolyDriver *poly) override
Attach to another object.
ControlBoard_nws_ros2(ControlBoard_nws_ros2 &&)=delete
~ControlBoard_nws_ros2() override=default
bool detach() override
Detach the object (you must have first called attach).
ControlBoard_nws_ros2 & operator=(const ControlBoard_nws_ros2 &)=delete
bool close() override
Close the DeviceDriver.
ControlBoard_nws_ros2 & operator=(ControlBoard_nws_ros2 &&)=delete
Interface implemented by all device drivers.
Interface for getting information about specific axes, if available.
Definition IAxisInfo.h:36
Interface for setting control mode in control board.
Control board, extend encoder interface with timestamps.
Interface for a generic control board device implementing position control.
Interface for a generic control board device implementing position control.
Interface for control boards implementing torque control.
Interface for control boards implementing velocity control.
A container for a device driver.
Definition PolyDriver.h:23
Helper interface for an object that can wrap/or "attach" to a single other device.
An abstraction for a periodic thread.
A base class for nested structures that can be searched.
Definition Searchable.h:31
An abstraction for a time stamp and/or sequence number.
Definition Stamp.h:21