profile
viewpoint
G.A. vd. Hoorn gavanderhoorn @tud-cor @tud-dri @sam-xl Delft University of Technology http://cor.tudelft.nl Researcher at the DRI and COR at Delft University of Technology and ROS-Industrial contributor.

cardboardcode/rvip 2

A ROS package for easy integration of a hybrid 2D-3D robotic vision technique for industrial tasks.

G-Paris/kawapai 2

Python library for interfacing with Kawasaki D, E and F series controllers

gavanderhoorn/abb 0

ROS-Industrial abb repo

gavanderhoorn/abb_experimental 0

ROS-Industrial abb experimental meta-package. http://ros.org/wiki/abb_experimental

gavanderhoorn/abb_file_suite 0

A suite of tools used for interfacing ROS-I and an ABB robot through the use of module files that are generated and downloaded on the fly.

gavanderhoorn/abb_libegm 0

A C++ library for interfacing with ABB robot controllers supporting Externally Guided Motion (689-1)

gavanderhoorn/abb_librws 0

A C++ library for interfacing with ABB robot controllers supporting Robot Web Services

gavanderhoorn/baldor 0

Homogeneous Transformation Matrices and Quaternions

push eventros-controls/ros2_control

Bence Magyar

commit sha f559768d966141afdbb11fa8a08ebeb405c266f8

Remove unused return values (#257)

view details

push time in 3 minutes

PR merged ros-controls/ros2_control

Reviewers
Remove unused return values

Resolves #220

+0 -15

0 comment

1 changed file

bmagyar

pr closed time in 3 minutes

issue closedros-controls/ros2_control

[hardware_interface]: Remove uncecessary return codes

Since we are currently using @Karsten1987's implementation, some return codes are uncecessary. This should be removed.

https://github.com/ros-controls/ros2_control/blob/3d542bb045860cdc7e7338c2e16a73985e387511/hardware_interface/include/hardware_interface/types/hardware_interface_return_values.hpp#L27-L39

closed time in 3 minutes

destogl

push eventros-controls/ros2_control

Bence Magyar

commit sha f585e294ea5bb0c63d148bb5ec6370d6a1858595

Cleanup hw interface (#259) * Remove unused ActuatorHandle from hardware_interface * Remove unused control_type

view details

push time in 3 minutes

PR merged ros-controls/ros2_control

Reviewers
Cleanup hw interface
+0 -123

0 comment

4 changed files

bmagyar

pr closed time in 3 minutes

push eventros-controls/ros2_controllers

Bence Magyar

commit sha efaab9eb6c4f6caa65bd010d0c3cc44424210e63

Remove components namespace (#123)

view details

push time in 18 minutes

PR merged ros-controls/ros2_controllers

Reviewers
Remove components namespace

Can be merged after https://github.com/ros-controls/ros2_control/pull/258

+1 -1

0 comment

1 changed file

bmagyar

pr closed time in 19 minutes

pull request commentros-controls/ros2_control

Remove components namespace

@bmagyar Over the next few days, I'll update and provide necessary updates on the Gazebo plugin side with a PR.

bmagyar

comment created time in 2 hours

push eventros-controls/ros2_control

Bence Magyar

commit sha 0df6c985d39ed9cc4af59d34382d6d6bb8211d31

Remove components namespace and folders (#258)

view details

push time in 2 hours

PR merged ros-controls/ros2_control

Reviewers
Remove components namespace

Resolves #230

@ahcorde @guru-florida @chapulina last change that's not on master yet but may affect you guys

+112 -147

0 comment

23 changed files

bmagyar

pr closed time in 2 hours

issue closedros-controls/ros2_control

remove ::components sub-namespace from hardware interface

After seeing hardware_interface::components::SystemInterface et al a couple of times I think that the components middle namespace is soon going to outlive it's usefulness, we should aim to remove it & perhaps rename the hardware_interface package.

Originally posted by @bmagyar in https://github.com/ros-controls/ros2_control/pull/224#discussion_r519194123

closed time in 2 hours

Karsten1987

issue commentros-controls/ros2_control

Foxy release

How should we provide doc? Or how do we want to provide it? also in the long-term.

bmagyar

comment created time in 3 hours

Pull request review commentros-controls/ros2_control

Add simple transmission class

+// Copyright 2020 PAL Robotics S.L.+//+// 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 TRANSMISSION_INTERFACE__SIMPLE_TRANSMISSION_H_+#define TRANSMISSION_INTERFACE__SIMPLE_TRANSMISSION_H_++#include <algorithm>+#include <cassert>+#include <string>+#include <vector>++#include "transmission_interface/transmission.h"+#include "transmission_interface/transmission_interface_exception.h"++namespace transmission_interface+{++/**+ * \brief Implementation of a simple reducer transmission.+ *+ * This transmission relates <b>one actuator</b> and <b>one joint</b> through a reductor (or amplifier).+ * Timing belts and gears are examples of this transmission type, and are illustrated below.+ * \image html simple_transmission.png+ *+ * <CENTER>+ * <table>+ * <tr><th></th><th><CENTER>Effort</CENTER></th><th><CENTER>Velocity</CENTER></th><th><CENTER>Position</CENTER></th></tr>+ * <tr><td>+ * <b> Actuator to joint </b>+ * </td>+ * <td>+ * \f[ \tau_j = n \tau_a \f]+ * </td>+ * <td>+ * \f[ \dot{x}_j = \dot{x}_a / n \f]+ * </td>+ * <td>+ * \f[ x_j = x_a / n + x_{off} \f]+ * </td>+ * </tr>+ * <tr><td>+ * <b> Joint to actuator </b>+ * </td>+ * <td>+ * \f[ \tau_a = \tau_j / n\f]+ * </td>+ * <td>+ * \f[ \dot{x}_a = n \dot{x}_j \f]+ * </td>+ * <td>+ * \f[ x_a = n (x_j - x_{off}) \f]+ * </td></tr></table>+ * </CENTER>+ *+ * where:+ * - \f$ x \f$, \f$ \dot{x} \f$ and \f$ \tau \f$ are position, velocity and effort variables, respectively.+ * - Subindices \f$ _a \f$ and \f$ _j \f$ are used to represent actuator-space and joint-space variables, respectively.+ * - \f$ x_{off}\f$ represents the offset between motor and joint zeros, expressed in joint position coordinates.+ * - \f$ n \f$ is the transmission ratio, and can be computed as the ratio between the output and input pulley+ *   radii for the timing belt; or the ratio between output and input teeth for the gear system.+ *   The transmission ratio can take any real value \e except zero. In particular:+ *     - If its absolute value is greater than one, it's a velocity reducer / effort amplifier, while if its absolute+ *       value lies in \f$ (0, 1) \f$ it's a velocity amplifier / effort reducer.+ *     - Negative values represent a direction flip, ie. actuator and joint move in opposite directions. For example,+ *       in timing belts actuator and joint move in the same direction, while in single-stage gear systems actuator and+ *       joint move in opposite directions.+ *+ * \ingroup transmission_types+ */+  class SimpleTransmission: public Transmission+  {+public:+    /**+     * \param reduction Reduction ratio.+     * \param joint_offset Joint position offset used in the position mappings.+     * \pre Nonzero reduction value.+     */+    SimpleTransmission(+      const double reduction,+      const double joint_offset = 0.0);++    void configure(+      const std::vector<JointHandle> & joint_handles,+      const std::vector<ActuatorHandle> & actuator_handles) override;++    /**+     * \brief Transform \e effort variables from actuator to joint space.+     * \param[in]  act_data Actuator-space variables.+     * \param[out] jnt_data Joint-space variables.+     * \pre Actuator and joint effort vectors must have size 1 and point to valid data.+     *  To call this method it is not required that all other data vectors contain valid data, and can even remain empty.+     */+    void actuator_to_joint() override;++    /**+     * \brief Transform \e effort variables from joint to actuator space.+     * \param[in]  jnt_data Joint-space variables.+     * \param[out] act_data Actuator-space variables.+     * \pre Actuator and joint effort vectors must have size 1 and point to valid data.+     *  To call this method it is not required that all other data vectors contain valid data, and can even remain empty.+     */+    void joint_to_actuator() override;++    std::size_t num_actuators() const override {return 1;}+    std::size_t num_joints()    const override {return 1;}++    double get_actuator_reduction() const {return reduction_;}+    double get_joint_offset()       const {return jnt_offset_;}++protected:+    double reduction_;+    double jnt_offset_;++    JointHandle joint_position = {"", "", nullptr};+    JointHandle joint_velocity = {"", "", nullptr};+    JointHandle joint_effort = {"", "", nullptr};++    ActuatorHandle actuator_position = {"", "", nullptr};+    ActuatorHandle actuator_velocity = {"", "", nullptr};+    ActuatorHandle actuator_effort = {"", "", nullptr};+  };++  inline SimpleTransmission::SimpleTransmission(+    const double reduction,+    const double joint_offset)+  : reduction_(reduction),+    jnt_offset_(joint_offset)+  {+    if (0.0 == reduction_) {+      throw Exception("Transmission reduction ratio cannot be zero.");+    }+  }++  template<class HandleType>+  HandleType get_by_interface(+    const std::vector<HandleType> & handles,+    const std::string & interface_name)+  {+    const auto result =+      std::find_if(+      handles.cbegin(), handles.cend(), [&interface_name](+        const auto handle) {return handle.get_interface_name() == interface_name;});+    if (result == handles.cend()) {+      return HandleType("", "", nullptr);+    }+    return *result;+  }++  void SimpleTransmission::configure(+    const std::vector<JointHandle> & joint_handles,+    const std::vector<ActuatorHandle> & actuator_handles)+  {+    // check that joint / act names are identical+    // check that joint interfaces and actuator interfaces match++    joint_position = get_by_interface(joint_handles, "position");+    joint_velocity = get_by_interface(joint_handles, "velocity");+    joint_effort = get_by_interface(joint_handles, "effort");++    actuator_position = get_by_interface(actuator_handles, "position");+    actuator_velocity = get_by_interface(actuator_handles, "velocity");+    actuator_effort = get_by_interface(actuator_handles, "effort");+  }++  inline void SimpleTransmission::actuator_to_joint()+  {+    if (joint_effort && actuator_effort) {+      joint_effort.set_value(actuator_effort.get_value() * reduction_);+    }++    if (joint_velocity && actuator_velocity) {+      joint_velocity.set_value(actuator_velocity.get_value() / reduction_);+    }++    if (joint_position && actuator_position) {+      joint_position.set_value(actuator_position.get_value() / reduction_ + jnt_offset_);+    }++//   *jnt_data.absolute_position[0] = *act_data.absolute_position[0] / reduction_ + jnt_offset_;+//   *jnt_data.torque_sensor[0] = *act_data.torque_sensor[0] * reduction_;+  }+++  inline void SimpleTransmission::joint_to_actuator()+  {+    if (joint_effort && actuator_effort) {+      actuator_effort.set_value(joint_effort.get_value() / reduction_);

What should we do here instead? Acceleration? Torque? same handling for both?

bmagyar

comment created time in 4 hours

issue commentros-planning/moveit

Melodic Perception Pipeline Tutorial loads empty rViz

Hi. I investigated it the whole day and I found the solution. But for the deeper reason behind, I'm still confused. I would like to share it, maybe you know the answer.

Error reason: The problem comes from the file "cylinder_segment.cpp" under the src folder of perception_pipeline. There is a private variable with a data type of structure pointer called "cylinder_params", which is also mentioned the tutorial. It's declared as "AddCylinderParams* cylinder_params". In the callback function "cloudCB", this variable will be used as "cylinder_params->direction_vec[0] = coefficients_cylinder->values[3];", which is exactly where the error comes from. It is impossible to assign a value to a structure pointer like "cylinder_params->direction_vec[0]".

( But i don't understand why. If you like to investigate it, here is some experience of mine: instead of running command "roslaunch moveit_tutorials detect_and_add_cylinder_collision_object_demo.launch ", you could run "roslaunch moveit_tutorials obstacle_avoidance_demo.launch " and in another shell run "rosrun moveit_tutorials cylinder_segment", which does exactly the same thing as written in the launch file. You could see the error message from the second shell, which says "segmentation fault (core dumped)". The error happens exactly after the code "cylinder_params->direction_vec[0] = coefficients_cylinder->values[3];". The error message "segmentation fault (core dumped)" has something to do with something like accessing data from a wrong address. This explains why using a pointer of structure raise an error here. But I think it's a bug somewhere in ROS and I don't understand why I can't do it here.)

My solution: I changed the variable "cylinder_params" from a pointer of the structure to a structure. Declare it as "AddCylinderParams cylinder_params;". And in the whole file, change "cylinder_params->"
to "cylinder_params.". Just "call by value or call by reference" thing. Then the program works.

Best regards!

myFree

comment created time in 5 hours

pull request commentPickNikRobotics/ros_control_boilerplate

Support for combined_robot_hw::CombinedRobotHW

Hey, i created a POC on the combined_robot_hw_draft branch. Could you check if this works with your GenericHWInterface and report back?

9fb6a76eef94651cb1331ce27a3c1e64a709aca1 exports SimHWInterface, you should be able to do that with your interface as well. 86e808d632a07dc9becac88b1b56e64cffa65dd1 demos usage of this by creating an alternative rrbot_simulation.launch which uses two hardware interfaces in a combined_robot_hw, each controlling one joint. You can try this out as well using

roslaunch ros_control_boilerplate rrbot_combined_simulation.launch

As for the design: I decided to stick to a template-based solution. The main reason for this is that this allows you to use the exported interface without any interface-specific code in your combined_robot_hw-using main. This turns using an interface into "just configuration". I agree that i should document that more clearly, if this solution works for you i'll improve the documentation and do all the points listed in #34.

Things i don't like right now:

  • I am not super keen on the name CombinableGenericHWAdapter
  • Due to the strange interplay between polymorphism and overloading in c++ i had to define the read(time, period) and write(time, period) adapter functions in SimHWInterface again, even though i already added them to GenericHWInterface in #38. An alternative solution would be to just call the read(elapsed_time) variant from the adapter (i think i prefer this right now), even though this leads to weird behaviors if anyone should ever derive from GenericHWInterface and override read(time, period) (not really sure why one would ever do that, but that's why i used this version in the draft).
  • The adapter handles the whole RobotHW api, which is verbose. Not really a problem, but i don't like it.
  • (I noticed GenericHWInterface still uses canSwitch, which doesn't really work since https://github.com/ros-controls/ros_control/pull/218... Might have to fix this at some point)

Happy to hear your feedback, if this works for you i'd beautify this some more and create a PR for noetic (which should just get cherry-picked to melodic, this should not require any code change) and merge it after review.

Tuebel

comment created time in 6 hours

Pull request review commentros-controls/ros2_control

Add simple transmission class

+// Copyright 2020 PAL Robotics S.L.+//+// 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 TRANSMISSION_INTERFACE__SIMPLE_TRANSMISSION_H_+#define TRANSMISSION_INTERFACE__SIMPLE_TRANSMISSION_H_++#include <algorithm>+#include <cassert>+#include <string>+#include <vector>++#include "transmission_interface/transmission.h"+#include "transmission_interface/transmission_interface_exception.h"++namespace transmission_interface+{++/**+ * \brief Implementation of a simple reducer transmission.+ *+ * This transmission relates <b>one actuator</b> and <b>one joint</b> through a reductor (or amplifier).+ * Timing belts and gears are examples of this transmission type, and are illustrated below.+ * \image html simple_transmission.png+ *+ * <CENTER>+ * <table>+ * <tr><th></th><th><CENTER>Effort</CENTER></th><th><CENTER>Velocity</CENTER></th><th><CENTER>Position</CENTER></th></tr>+ * <tr><td>+ * <b> Actuator to joint </b>+ * </td>+ * <td>+ * \f[ \tau_j = n \tau_a \f]+ * </td>+ * <td>+ * \f[ \dot{x}_j = \dot{x}_a / n \f]+ * </td>+ * <td>+ * \f[ x_j = x_a / n + x_{off} \f]+ * </td>+ * </tr>+ * <tr><td>+ * <b> Joint to actuator </b>+ * </td>+ * <td>+ * \f[ \tau_a = \tau_j / n\f]+ * </td>+ * <td>+ * \f[ \dot{x}_a = n \dot{x}_j \f]+ * </td>+ * <td>+ * \f[ x_a = n (x_j - x_{off}) \f]+ * </td></tr></table>+ * </CENTER>+ *+ * where:+ * - \f$ x \f$, \f$ \dot{x} \f$ and \f$ \tau \f$ are position, velocity and effort variables, respectively.+ * - Subindices \f$ _a \f$ and \f$ _j \f$ are used to represent actuator-space and joint-space variables, respectively.+ * - \f$ x_{off}\f$ represents the offset between motor and joint zeros, expressed in joint position coordinates.+ * - \f$ n \f$ is the transmission ratio, and can be computed as the ratio between the output and input pulley+ *   radii for the timing belt; or the ratio between output and input teeth for the gear system.+ *   The transmission ratio can take any real value \e except zero. In particular:+ *     - If its absolute value is greater than one, it's a velocity reducer / effort amplifier, while if its absolute+ *       value lies in \f$ (0, 1) \f$ it's a velocity amplifier / effort reducer.+ *     - Negative values represent a direction flip, ie. actuator and joint move in opposite directions. For example,+ *       in timing belts actuator and joint move in the same direction, while in single-stage gear systems actuator and+ *       joint move in opposite directions.+ *+ * \ingroup transmission_types+ */+  class SimpleTransmission: public Transmission+  {+public:+    /**+     * \param reduction Reduction ratio.+     * \param joint_offset Joint position offset used in the position mappings.+     * \pre Nonzero reduction value.+     */+    SimpleTransmission(+      const double reduction,+      const double joint_offset = 0.0);++    void configure(+      const std::vector<JointHandle> & joint_handles,+      const std::vector<ActuatorHandle> & actuator_handles) override;++    /**+     * \brief Transform \e effort variables from actuator to joint space.+     * \param[in]  act_data Actuator-space variables.+     * \param[out] jnt_data Joint-space variables.+     * \pre Actuator and joint effort vectors must have size 1 and point to valid data.+     *  To call this method it is not required that all other data vectors contain valid data, and can even remain empty.+     */+    void actuator_to_joint() override;++    /**+     * \brief Transform \e effort variables from joint to actuator space.+     * \param[in]  jnt_data Joint-space variables.+     * \param[out] act_data Actuator-space variables.+     * \pre Actuator and joint effort vectors must have size 1 and point to valid data.+     *  To call this method it is not required that all other data vectors contain valid data, and can even remain empty.+     */+    void joint_to_actuator() override;++    std::size_t num_actuators() const override {return 1;}+    std::size_t num_joints()    const override {return 1;}++    double get_actuator_reduction() const {return reduction_;}+    double get_joint_offset()       const {return jnt_offset_;}++protected:+    double reduction_;+    double jnt_offset_;++    JointHandle joint_position = {"", "", nullptr};+    JointHandle joint_velocity = {"", "", nullptr};+    JointHandle joint_effort = {"", "", nullptr};++    ActuatorHandle actuator_position = {"", "", nullptr};+    ActuatorHandle actuator_velocity = {"", "", nullptr};+    ActuatorHandle actuator_effort = {"", "", nullptr};+  };++  inline SimpleTransmission::SimpleTransmission(+    const double reduction,+    const double joint_offset)+  : reduction_(reduction),+    jnt_offset_(joint_offset)+  {+    if (0.0 == reduction_) {+      throw Exception("Transmission reduction ratio cannot be zero.");+    }+  }++  template<class HandleType>+  HandleType get_by_interface(+    const std::vector<HandleType> & handles,+    const std::string & interface_name)+  {+    const auto result =+      std::find_if(+      handles.cbegin(), handles.cend(), [&interface_name](+        const auto handle) {return handle.get_interface_name() == interface_name;});+    if (result == handles.cend()) {+      return HandleType("", "", nullptr);+    }+    return *result;+  }++  void SimpleTransmission::configure(+    const std::vector<JointHandle> & joint_handles,+    const std::vector<ActuatorHandle> & actuator_handles)+  {+    // check that joint / act names are identical+    // check that joint interfaces and actuator interfaces match++    joint_position = get_by_interface(joint_handles, "position");+    joint_velocity = get_by_interface(joint_handles, "velocity");+    joint_effort = get_by_interface(joint_handles, "effort");++    actuator_position = get_by_interface(actuator_handles, "position");+    actuator_velocity = get_by_interface(actuator_handles, "velocity");+    actuator_effort = get_by_interface(actuator_handles, "effort");+  }++  inline void SimpleTransmission::actuator_to_joint()+  {+    if (joint_effort && actuator_effort) {+      joint_effort.set_value(actuator_effort.get_value() * reduction_);+    }++    if (joint_velocity && actuator_velocity) {+      joint_velocity.set_value(actuator_velocity.get_value() / reduction_);+    }++    if (joint_position && actuator_position) {+      joint_position.set_value(actuator_position.get_value() / reduction_ + jnt_offset_);+    }++//   *jnt_data.absolute_position[0] = *act_data.absolute_position[0] / reduction_ + jnt_offset_;+//   *jnt_data.torque_sensor[0] = *act_data.torque_sensor[0] * reduction_;

wasn't sure what to do with these

bmagyar

comment created time in 7 hours

Pull request review commentros-controls/ros2_control

Add simple transmission class

 find_package(TinyXML2 REQUIRED) add_library(transmission_parser SHARED src/transmission_parser.cpp) target_include_directories(transmission_parser PUBLIC include) ament_target_dependencies(transmission_parser hardware_interface tinyxml2_vendor TinyXML2)-ament_export_dependencies(hardware_interface tinyxml2_vendor TinyXML2)+ament_export_dependencies(transmission_parser tinyxml2_vendor TinyXML2)

moved

bmagyar

comment created time in 7 hours

Pull request review commentros-controls/ros2_control

Add simple transmission class

 find_package(TinyXML2 REQUIRED) add_library(transmission_parser SHARED src/transmission_parser.cpp) target_include_directories(transmission_parser PUBLIC include) ament_target_dependencies(transmission_parser hardware_interface tinyxml2_vendor TinyXML2)-ament_export_dependencies(hardware_interface tinyxml2_vendor TinyXML2)+ament_export_dependencies(transmission_parser tinyxml2_vendor TinyXML2) target_compile_definitions(transmission_parser PRIVATE "TRANSMISSION_INTERFACE_BUILDING_DLL") +#add_library(transmission_plugins SHARED+#  include/transmission_interfrace/simple_transmission.h+#)+#target_include_directories(transmission_plugins PUBLIC include)+#ament_target_dependencies(transmission_plugins hardware_interface tinyxml2_vendor TinyXML2)+#ament_export_dependencies(transmission_plugins hardware_interface tinyxml2_vendor TinyXML2)+#target_compile_definitions(transmission_plugins PRIVATE "TRANSMISSION_INTERFACE_BUILDING_DLL")+

yup, gone

bmagyar

comment created time in 7 hours

Pull request review commentros-controls/ros2_control

Add simple transmission class

+// Copyright 2020 PAL Robotics S.L.+//+// 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 TRANSMISSION_INTERFACE__SIMPLE_TRANSMISSION_H_+#define TRANSMISSION_INTERFACE__SIMPLE_TRANSMISSION_H_++#include <algorithm>+#include <cassert>+#include <string>+#include <vector>++#include "transmission_interface/transmission.h"+#include "transmission_interface/transmission_interface_exception.h"++namespace transmission_interface+{++/**+ * \brief Implementation of a simple reducer transmission.+ *+ * This transmission relates <b>one actuator</b> and <b>one joint</b> through a reductor (or amplifier).+ * Timing belts and gears are examples of this transmission type, and are illustrated below.+ * \image html simple_transmission.png+ *+ * <CENTER>+ * <table>+ * <tr><th></th><th><CENTER>Effort</CENTER></th><th><CENTER>Velocity</CENTER></th><th><CENTER>Position</CENTER></th></tr>+ * <tr><td>+ * <b> Actuator to joint </b>+ * </td>+ * <td>+ * \f[ \tau_j = n \tau_a \f]+ * </td>+ * <td>+ * \f[ \dot{x}_j = \dot{x}_a / n \f]+ * </td>+ * <td>+ * \f[ x_j = x_a / n + x_{off} \f]+ * </td>+ * </tr>+ * <tr><td>+ * <b> Joint to actuator </b>+ * </td>+ * <td>+ * \f[ \tau_a = \tau_j / n\f]+ * </td>+ * <td>+ * \f[ \dot{x}_a = n \dot{x}_j \f]+ * </td>+ * <td>+ * \f[ x_a = n (x_j - x_{off}) \f]+ * </td></tr></table>+ * </CENTER>+ *+ * where:+ * - \f$ x \f$, \f$ \dot{x} \f$ and \f$ \tau \f$ are position, velocity and effort variables, respectively.+ * - Subindices \f$ _a \f$ and \f$ _j \f$ are used to represent actuator-space and joint-space variables, respectively.+ * - \f$ x_{off}\f$ represents the offset between motor and joint zeros, expressed in joint position coordinates.+ * - \f$ n \f$ is the transmission ratio, and can be computed as the ratio between the output and input pulley+ *   radii for the timing belt; or the ratio between output and input teeth for the gear system.+ *   The transmission ratio can take any real value \e except zero. In particular:+ *     - If its absolute value is greater than one, it's a velocity reducer / effort amplifier, while if its absolute+ *       value lies in \f$ (0, 1) \f$ it's a velocity amplifier / effort reducer.+ *     - Negative values represent a direction flip, ie. actuator and joint move in opposite directions. For example,+ *       in timing belts actuator and joint move in the same direction, while in single-stage gear systems actuator and+ *       joint move in opposite directions.+ *+ * \ingroup transmission_types+ */+  class SimpleTransmission: public Transmission+  {+public:+    /**+     * \param reduction Reduction ratio.+     * \param joint_offset Joint position offset used in the position mappings.+     * \pre Nonzero reduction value.+     */+    SimpleTransmission(+      const double reduction,+      const double joint_offset = 0.0);++    void configure(+      const std::vector<JointHandle> & joint_handles,+      const std::vector<ActuatorHandle> & actuator_handles) override;++    /**+     * \brief Transform \e effort variables from actuator to joint space.+     * \param[in]  act_data Actuator-space variables.+     * \param[out] jnt_data Joint-space variables.+     * \pre Actuator and joint effort vectors must have size 1 and point to valid data.+     *  To call this method it is not required that all other data vectors contain valid data, and can even remain empty.+     */+    void actuator_to_joint() override;++    /**+     * \brief Transform \e effort variables from joint to actuator space.+     * \param[in]  jnt_data Joint-space variables.+     * \param[out] act_data Actuator-space variables.+     * \pre Actuator and joint effort vectors must have size 1 and point to valid data.+     *  To call this method it is not required that all other data vectors contain valid data, and can even remain empty.+     */+    void joint_to_actuator() override;++    std::size_t num_actuators() const override {return 1;}+    std::size_t num_joints()    const override {return 1;}++    double get_actuator_reduction() const {return reduction_;}+    double get_joint_offset()       const {return jnt_offset_;}++protected:+    double reduction_;+    double jnt_offset_;++    JointHandle joint_position = {"", "", nullptr};+    JointHandle joint_velocity = {"", "", nullptr};+    JointHandle joint_effort = {"", "", nullptr};++    ActuatorHandle actuator_position = {"", "", nullptr};+    ActuatorHandle actuator_velocity = {"", "", nullptr};+    ActuatorHandle actuator_effort = {"", "", nullptr};

done

bmagyar

comment created time in 7 hours

issue commentros-controls/ros2_control

Foxy release

I've added doc and source jobs to Foxy for ros2_control

https://github.com/ros/rosdistro/pull/27622

bmagyar

comment created time in 8 hours

PR opened ros-controls/ros2_controllers

Remove components namespace

Can be merged after https://github.com/ros-controls/ros2_control/pull/258

+1 -1

0 comment

1 changed file

pr created time in 8 hours

PR opened ros-controls/ros2_control

Reviewers
Cleanup hw interface
+0 -123

0 comment

4 changed files

pr created time in 8 hours

PR opened ros-controls/ros2_control

Reviewers
Remove components namespace

Resolves #230

+112 -270

0 comment

26 changed files

pr created time in 8 hours

PR opened ros-controls/ros2_control

Remove unused return values

Resolves #220

+0 -15

0 comment

1 changed file

pr created time in 9 hours

issue closedros-controls/ros2_control

Make use of DynamicJointState message internally to store values & interface names for joints

Joint handles could still be used & served to clients, pointing to values stored in this message structure.

https://github.com/ros-controls/control_msgs/blob/foxy-devel/control_msgs/msg/DynamicJointState.msg

https://github.com/ros-controls/control_msgs/blob/foxy-devel/control_msgs/msg/InterfaceValue.msg

closed time in 9 hours

bmagyar

issue closedros-controls/ros2_control

ros2ci foxy source job failing on master

I couldn't reproduce the issue, it seems that there's a failure with taking down the launch test.

here's the relevant snippet from https://github.com/ros-controls/ros2_control/pull/209/checks?check_run_id=1313191689

2020-10-27T07:04:10.5108897Z [0.689s] 2: [joint_limits_rosparam_test-1] [==========] Running 2 tests from 1 test case.
2020-10-27T07:04:10.5109709Z [0.689s] 2: [joint_limits_rosparam_test-1] [----------] Global test environment set-up.
2020-10-27T07:04:10.5110642Z [0.689s] 2: [joint_limits_rosparam_test-1] [----------] 2 tests from JointLimitsRosParamTest
2020-10-27T07:04:10.5111886Z [0.690s] 2: [joint_limits_rosparam_test-1] [ RUN      ] JointLimitsRosParamTest.GetJointLimits
2020-10-27T07:04:10.5114021Z [0.690s] 2: [joint_limits_rosparam_test-1] [ERROR] [1603782246.659434414] [JointLimitsRosparamTestNode]: No joint limits specification found for joint 'bad_joint' in the parameter server (node: JointLimitsRosparamTestNode param name: joint_limits.bad_joint).
2020-10-27T07:04:10.5116674Z [0.690s] 2: [joint_limits_rosparam_test-1] [ERROR] [1603782246.659543314] [JointLimitsRosparamTestNode]: No joint limits specification found for joint 'unknown_joint' in the parameter server (node: JointLimitsRosparamTestNode param name: joint_limits.unknown_joint).
2020-10-27T07:04:10.5118746Z [0.700s] 2: [joint_limits_rosparam_test-1] [       OK ] JointLimitsRosParamTest.GetJointLimits (24 ms)
2020-10-27T07:04:10.5120246Z [0.701s] 2: [joint_limits_rosparam_test-1] [ RUN      ] JointLimitsRosParamTest.GetSoftJointLimits
2020-10-27T07:04:10.5122002Z [0.705s] 2: [joint_limits_rosparam_test-1] [       OK ] JointLimitsRosParamTest.GetSoftJointLimits (5 ms)
2020-10-27T07:04:10.5123576Z [0.705s] 2: [joint_limits_rosparam_test-1] [----------] 2 tests from JointLimitsRosParamTest (29 ms total)
2020-10-27T07:04:10.5124389Z [0.705s] 2: [joint_limits_rosparam_test-1] 
2020-10-27T07:04:10.5125119Z [0.706s] 2: [joint_limits_rosparam_test-1] [----------] Global test environment tear-down
2020-10-27T07:04:10.5126069Z [0.706s] 2: [joint_limits_rosparam_test-1] [==========] 2 tests from 1 test case ran. (29 ms total)
2020-10-27T07:04:10.5126860Z [0.706s] 2: [joint_limits_rosparam_test-1] [  PASSED  ] 2 tests.
2020-10-27T07:04:10.5127660Z [0.709s] 2: [INFO] [joint_limits_rosparam_test-1]: process has finished cleanly [pid 25372]
2020-10-27T07:04:10.5128488Z [0.711s] 2: [INFO] [python3-2]: sending signal 'SIGINT' to process[python3-2]
2020-10-27T07:04:10.5129340Z [0.711s] 2: [python3-2] Fatal Python error: init_import_size: Failed to import the site module
2020-10-27T07:04:10.5130157Z [0.712s] 2: [python3-2] Python runtime state: initialized
2020-10-27T07:04:10.5130823Z [0.746s] 2: [python3-2] Traceback (most recent call last):
2020-10-27T07:04:10.5131674Z [0.746s] 2: [python3-2]   File "/usr/lib/python3.8/site.py", line 79, in <module>
2020-10-27T07:04:10.5132334Z [0.747s] 2: [python3-2]     import os
2020-10-27T07:04:10.5133021Z [0.747s] 2: [python3-2]   File "/usr/lib/python3.8/os.py", line 59, in <module>
2020-10-27T07:04:10.5133744Z [0.748s] 2: [python3-2]     import posixpath as path
2020-10-27T07:04:10.5134553Z [0.748s] 2: [python3-2]   File "/usr/lib/python3.8/posixpath.py", line 28, in <module>
2020-10-27T07:04:10.5135295Z [0.749s] 2: [python3-2]     import genericpath
2020-10-27T07:04:10.5136079Z [0.749s] 2: [python3-2]   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
2020-10-27T07:04:10.5137010Z [0.749s] 2: [python3-2]   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
2020-10-27T07:04:10.5137961Z [0.750s] 2: [python3-2]   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
2020-10-27T07:04:10.5138842Z [0.750s] 2: [python3-2]   File "<frozen importlib._bootstrap_external>", line 779, in exec_module
2020-10-27T07:04:10.5139783Z [0.751s] 2: [python3-2]   File "<frozen importlib._bootstrap_external>", line 911, in get_code
2020-10-27T07:04:10.5140760Z [0.751s] 2: [python3-2]   File "<frozen importlib._bootstrap_external>", line 580, in _compile_bytecode
2020-10-27T07:04:10.5141589Z [0.752s] 2: [python3-2] KeyboardInterrupt
2020-10-27T07:04:10.5142431Z [0.752s] 2: [ERROR] [python3-2]: process has died [pid 25375, exit code 1, cmd '/usr/bin/python3 -c 
2020-10-27T07:04:10.5142908Z [0.752s] 2: try:
2020-10-27T07:04:10.5143218Z [0.752s] 2:     while True:
2020-10-27T07:04:10.5143522Z [0.752s] 2:         pass
2020-10-27T07:04:10.5143948Z [0.752s] 2: except KeyboardInterrupt:
2020-10-27T07:04:10.5144297Z [0.752s] 2:     pass
2020-10-27T07:04:10.5144703Z [0.753s] 2: '].
2020-10-27T07:04:10.5144970Z [0.753s] 2: ok
2020-10-27T07:04:10.5145250Z [0.753s] 2: 
2020-10-27T07:04:10.5145727Z [0.754s] 2: ----------------------------------------------------------------------
2020-10-27T07:04:10.5146047Z [0.754s] 2: Ran 1 test in 0.046s
2020-10-27T07:04:10.5146338Z [0.754s] 2: 
2020-10-27T07:04:10.5146544Z [0.754s] 2: OK
2020-10-27T07:04:10.5147735Z [0.755s] 2: test_exit_code (joint_limits_interface.TestJointLimitInterfaceTestAfterShutdown) ... FAIL

while when I locally run the same, I get this

$ launch_test src/ros2_control/joint_limits_interface/test/joint_limits_rosparam.launch.py 
[INFO] [launch]: All log files can be found below /home/bence/.ros/log/2020-10-27-07-27-19-181182-blackbrick-297797
[INFO] [launch]: Default logging verbosity is set to INFO
test_termination (joint_limits_rosparam.launch.TestJointLimitInterface) ... [INFO] [joint_limits_rosparam_test-1]: process started with pid [297800]
[INFO] [python3-2]: process started with pid [297802]
[joint_limits_rosparam_test-1] [==========] Running 2 tests from 1 test case.
[joint_limits_rosparam_test-1] [----------] Global test environment set-up.
[joint_limits_rosparam_test-1] [----------] 2 tests from JointLimitsRosParamTest
[joint_limits_rosparam_test-1] [ RUN      ] JointLimitsRosParamTest.GetJointLimits
[joint_limits_rosparam_test-1] [ERROR] [1603783639.205507749] [JointLimitsRosparamTestNode]: No joint limits specification found for joint 'bad_joint' in the parameter server (node: JointLimitsRosparamTestNode param name: joint_limits.bad_joint).
[joint_limits_rosparam_test-1] [ERROR] [1603783639.205618005] [JointLimitsRosparamTestNode]: No joint limits specification found for joint 'unknown_joint' in the parameter server (node: JointLimitsRosparamTestNode param name: joint_limits.unknown_joint).
[joint_limits_rosparam_test-1] [       OK ] JointLimitsRosParamTest.GetJointLimits (10 ms)
[joint_limits_rosparam_test-1] [ RUN      ] JointLimitsRosParamTest.GetSoftJointLimits
[joint_limits_rosparam_test-1] [       OK ] JointLimitsRosParamTest.GetSoftJointLimits (4 ms)
[joint_limits_rosparam_test-1] [----------] 2 tests from JointLimitsRosParamTest (14 ms total)
[joint_limits_rosparam_test-1] 
[joint_limits_rosparam_test-1] [----------] Global test environment tear-down
[joint_limits_rosparam_test-1] [==========] 2 tests from 1 test case ran. (14 ms total)
[joint_limits_rosparam_test-1] [  PASSED  ] 2 tests.
[INFO] [joint_limits_rosparam_test-1]: process has finished cleanly [pid 297800]
ok

----------------------------------------------------------------------
Ran 1 test in 0.028s

OK
[INFO] [python3-2]: sending signal 'SIGINT' to process[python3-2]
[INFO] [python3-2]: process has finished cleanly [pid 297802]
test_exit_code (joint_limits_rosparam.launch.TestJointLimitInterfaceTestAfterShutdown) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

@piraka9011 @Karsten1987 do you guys have any clue why we'd be seeing this? Anyone worth contacting?

closed time in 9 hours

bmagyar

issue commentros-controls/ros2_control

ros2ci foxy source job failing on master

Fixed via updates

bmagyar

comment created time in 9 hours

issue closedros-planning/moveit_calibration

Crash in calibration after image topic is selected

Hello.

I'm trying to calibrate my realsense and UR3 setup using this toolkit. I have ROS Melodic and Ubuntu 18.04 OpenCV version is 3.4

I have installed UR_ROBOT_DRIVER and compiled the calibration toolbox. When I run rviz I see the plugin GUI but it crashes once I pick the camera topic from the drop list. It gives me this error.

[ERROR] [1606993910.391483979]: Invalid target measured dimensions: marker_size 0,000000, marker_seperation 0,000000

I definitely set the numbers in the GUI but for some reason the backend is not aware of them

Does anybody else experience this?

closed time in 9 hours

vixtor-qm
more