Code Monkey home page Code Monkey logo

abb_librws's Introduction

abb_librws

Build Status: Ubuntu Bionic (Actions) Build Status: Ubuntu Focal (Actions) Github Issues

license - bsd 3 clause

support level: community

Important Notes

RobotWare versions 7.0 and higher are currently incompatible with abb_librws (due to RWS 1.0 being replaced by RWS 2.0). See this for more information about the different RWS versions.

Pull request abb_librws#69 turned this package from a Catkin package into a plain CMake package. ROS users may use any of the following build tools to build the library:

Overview

A C++ library for interfacing with ABB robot controllers supporting Robot Web Services (RWS) 1.0. See the online documentation for a detailed description of what RWS 1.0 is and how to use it.

  • See abb_libegm for a companion library that interfaces with Externally Guided Motion (EGM).
  • See StateMachine Add-In (1.0 or 1.1) for an optional RobotWare Add-In that can be useful when configuring an ABB robot controller for use with this library.

Please note that this package has not been productized, it is provided "as-is" and only limited support can be expected.

Sketch

The following is a conceptual sketch of how this RWS library can be viewed, in relation to an ABB robot controller as well as the EGM companion library mentioned above. The optional StateMachine Add-In is related to the robot controller's RAPID program and system configuration.

RWS sketch

Requirements

  • RobotWare version 6.0 or higher (less than 7.0, which uses RWS 2.0).

Dependencies

Limitations

RWS provides access to several services and resources in the robot controller, and this library currently support the following:

  • Reading/writing of IO-signals.
  • Reading/writing of RAPID data.
  • Reading of RAPID data properties.
  • Starting/stopping/resetting the RAPID program.
  • Subscriptions (i.e. receiving notifications when resources are updated).
  • Uploading/downloading/removing files.
  • Checking controller state (e.g. motors on/off, auto/manual mode and RAPID execution running/stopped).
  • Reading the joint/Cartesian values of a mechanical unit.
  • Register as a local/remote user (e.g. for interaction during manual mode).
  • Turning the motors on/off.
  • Reading of current RobotWare version and available tasks in the robot system.

Recommendations

  • This library has been verified to work with RobotWare 6.08.00.01. Other versions are expected to work, but this cannot be guaranteed at the moment.
  • It is a good idea to perform RobotStudio simulations before working with a real robot.
  • It is prudent to familiarize oneself with general safety regulations (e.g. described in ABB manuals).
  • Consider cyber security aspects, before connecting robot controllers to networks.

Usage Hints

This is a generic library, which can be used together with any RAPID program and system configuration. The library's primary classes are:

  • POCOClient: Sets up and manages HTTP and WebSocket communication and is unaware of the RWS protocol.
  • RWSClient: Inherits from POCOClient and provides interaction methods for using the RWS services and resources.
  • RWSInterface: Encapsulates an RWSClient instance and provides more user-friendly methods for using the RWS services and resources.
  • RWSStateMachineInterface: Inherits from RWSInterface and has been designed to interact with the aforementioned StateMachine Add-In. The interface knows about the custom RAPID variables and routines, as well as system configurations, loaded by the RobotWare Add-In.

The optional StateMachine Add-In for RobotWare can be used in combination with any of the classes above, but it works especially well with the RWSStateMachineInterface class.

StateMachine Add-In [Optional]

The purpose of the RobotWare Add-In is to ease the setup of ABB robot controllers. It is made for both real controllers and virtual controllers (simulated in RobotStudio). If the Add-In is selected during a RobotWare system installation, then the Add-In will load several RAPID modules and system configurations based on the system specifications (e.g. number of robots and present options).

The RAPID modules and configurations constitute a customizable, but ready to run, RAPID program which contains a state machine implementation. Each motion task in the robot system receives its own state machine instance, and the intention is to use this in combination with external systems that require interaction with the robot(s). The following is a conceptual sketch of the RAPID program's execution flow.

To install the Add-In:

  1. Go to the Add-Ins tab in RobotStudio.
  2. Search for StateMachine Add-In in the RobotApps window.
  3. Select the desired Add-In version and retrieve it by pressing the Add button.
  4. Verify that the Add-In was added to the list Installed Packages.
  5. The Add-In should appear as an option during the installation of a RobotWare system.

See the Add-In's user manual (1.0 or 1.1) for more details, as well as for install instructions for RobotWare systems. The manual can also be accessed by right-clicking on the Add-In in the Installed Packages list and selecting Documentation.

Acknowledgements

The core development has been supported by the European Union's Horizon 2020 project SYMBIO-TIC. The SYMBIO-TIC project has received funding from the European Union's Horizon 2020 research and innovation programme under grant agreement no. 637107.

The open-source process has been supported by the European Union's Horizon 2020 project ROSIN. The ROSIN project has received funding from the European Union's Horizon 2020 research and innovation programme under grant agreement no. 732287.

The opinions expressed reflects only the author's view and reflects in no way the European Commission's opinions. The European Commission is not responsible for any use that may be made of the contained information.

Special Thanks

Special thanks to gavanderhoorn for guidance with open-source practices and ROS-Industrial conventions.

abb_librws's People

Contributors

de-vri-es avatar gavanderhoorn avatar jontje avatar marip8 avatar mvegter avatar traversaro avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

abb_librws's Issues

Implement version checking

As mentioned in #50, then it would be beneficial to implement a check for if the targeted robot controller's RobotWare version is supported by the version of abb_librws used.

Expose getSignals() in RWSInterface.

PR #63 adds RWSClient::getSignals() to retrieve all signals from a controller. However, it doesn't expose the function in RWSInterface yet. This should still be done.

Quoted from @jontje:

Do you also intend to expose the new function in the more user-friendly RWSInterface class? For example:

* Implementing a `struct` for an IO-signal list item according to the [documentation](http://developercenter.robotstudio.com/blobproxy/devcenter/Robot_Web_Services/html/ios_signals_get_page.html), which contains:
  
  * name: IO-signal name
  * type: Signal type {DO | DI | AO | AI | GI | GO}
  * category: Signals list item
  * lvalue: Signal value
  * lstate: Signals state {simulated | not simulated}

* Parsing the XML document into a vector of such IO-signal list items, similar to [RWSInterface::getRAPIDModulesInfo(...)](https://github.com/ros-industrial/abb_librws/blob/master/src/rws_interface.cpp#L233-L250).

If not, can you open an issue for that?

Can you also update the PR to be in sync with the base branch?

Not able to set IO Signal

I'm using the sample code that jontje, specifically a2_io_signal_node.cpp, and I'm finding that I can correctly retrieve the current IO value, however it does not change upon calling setIOSignal, and a 0 is returned by the function.

Any tips on where to look to correct this?

Python wrapper?

Being able to use RWS from a Python application would be perfect.

I've titled this issue "Python wrapper" as that could of course be one way to do this. It may however complicate things needlessly.

Searching around, I've been able to find some mentions of using requests to interface with RWS, but I haven't been able to find any proper Python package.

As RWS purports to be a REST based interface: @jontje would you happen to know whether RWS comes with an API spec (OpenAPI, Swagger, RADL, RAML, RSDL, something else) which would make it possible auto-generate (Python) wrappers or runtime code generate them?

I'm not entirely up-to-date on REST and web APIs, but there are definitely more advanced (and convenient) ways of consuming a REST interface than Python requests and composing raw URIs.

Expand the readme

Add sections for:

  • Structure/class descriptions
  • Troubleshooting
  • Acknowledgements

How to handle subscription event asynchronously?

hello,
How to handle subscription event asynchronously?
As a library could you give some application examples to show how to use the library to handle the subscription event?
I think it should be handled when subscripted robot resources change? But how ?
Thank you very much!

Add support for additional RWS services

As per title.

There are many more RWS services that can be made more easily accessible, by implementing specific APIs for them.

For a complete list of available services see the RWS documentation.

This can for example be done by expanding the RWSClient and RWSInterface classes.

How to use the RWS to realize automatic loading of modules

Hello,
In the configuration some instance have name attributes, so i can use the command like this curl –digest -u "Default User":robotics -d "name=testinstance" -X POST "http://localhost/rw/cfg/eio/INDUSTRIAL_NETWORK/instances?action=create-default" to create the default instance the Data Params is name, name of instance. Then use the RWS to set the other attributes value, use the command like this curl –digest - u "Default User" : robotics -d "Simulated=True" - X POST "http://localhost/rw/cfg/eio/INDUSTRIAL_NETWORK/instances/testinstance?action=set" . . But about the instance of Automatic loading of Modules in the configuration, it no have the name attributes, so even i success to create the default instance, the file attributes value is blank, the result is shown below.

image

So if i want use rws to realize the automatic load the module file features and bind the specific task, Just like the use RobotStudio to set the configuration instance value. what i should do.

Thank you very much!

Problem with the Build of the library

Hi community,
I'm a newbie of ROS and i'm working on a project which involves a robot ABB Yumi (IRB 14000) and i'm using this library: library link. In order to control the camera i have seen that is needed the RWS library and i found this repository associated to that. So i cloned the in the src folder this package and i tried catkin build and catkin_make_isolated and i had errors like the one reported. How can i solve?
I'm using ROS Kinetic Kame with Ubuntu 16.04 Xenial.

catkin build output
kappa95@kappa95-VivoBook-ASUS-Laptop-X505ZA-X505ZA:~/yumi_depends_ws$ catkin build
------------------------------------------------------------------
Profile:                     default
Extending:          [cached] /opt/ros/kinetic
Workspace:                   /home/kappa95/yumi_depends_ws
------------------------------------------------------------------
Build Space:        [exists] /home/kappa95/yumi_depends_ws/build
Devel Space:        [exists] /home/kappa95/yumi_depends_ws/devel
Install Space:      [unused] /home/kappa95/yumi_depends_ws/install
Log Space:          [exists] /home/kappa95/yumi_depends_ws/logs
Source Space:       [exists] /home/kappa95/yumi_depends_ws/src
DESTDIR:            [unused] None
------------------------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        None
------------------------------------------------------------------
Additional CMake Args:       None
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
------------------------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
------------------------------------------------------------------
Workspace configuration appears valid.
------------------------------------------------------------------
[build] Found '27' packages in 0.0 seconds.                                    
[build] Updating package table.                                                
Starting  >>> abb_irb2400_moveit_plugins                                       
Starting  >>> abb_irb2400_support                                              
Starting  >>> abb_irb5400_support                                              
Starting  >>> abb_irb6600_support                                              
Starting  >>> abb_irb6640_support                                              
Starting  >>> abb_librws                                                       
Starting  >>> gazebo_mimic                                                     
Starting  >>> industrial_deprecated                                            
Finished  <<< abb_irb6600_support                          [ 0.2 seconds ]     
Starting  >>> industrial_msgs                                                  
Finished  <<< abb_irb6640_support                          [ 0.2 seconds ]     
Starting  >>> industrial_trajectory_filters                                    
Finished  <<< abb_irb2400_moveit_plugins                   [ 0.3 seconds ]     
Starting  >>> industrial_utils                                                 
Finished  <<< gazebo_mimic                                 [ 0.2 seconds ]     
Starting  >>> yumi_cameras                                                     
Finished  <<< abb_irb2400_support                          [ 0.2 seconds ]     
Starting  >>> yumi_description                                                 
Finished  <<< industrial_deprecated                        [ 0.1 seconds ]     
Starting  >>> yumi_moveit_demos                                                
Finished  <<< abb_irb5400_support                          [ 0.2 seconds ]     
Starting  >>> yumi_support                                                     
Finished  <<< industrial_trajectory_filters                [ 0.2 seconds ]     
Finished  <<< industrial_utils                             [ 0.2 seconds ]     
Finished  <<< yumi_cameras                                 [ 0.2 seconds ]     
Finished  <<< yumi_description                             [ 0.2 seconds ]     
Starting  >>> yumi_test_controllers                                            
Starting  >>> yumi_control                                                     
Starting  >>> yumi_moveit_config                                               
Finished  <<< yumi_moveit_demos                            [ 0.2 seconds ]     
Finished  <<< industrial_msgs                              [ 0.7 seconds ]     
Starting  >>> simple_message                                                   
Finished  <<< yumi_support                                 [ 0.2 seconds ]     
Finished  <<< yumi_control                                 [ 0.2 seconds ]     
Finished  <<< yumi_test_controllers                        [ 0.2 seconds ]     
Finished  <<< yumi_moveit_config                           [ 0.2 seconds ]     
_______________________________________________________________________________
Errors     << abb_librws:make /home/kappa95/yumi_depends_ws/logs/abb_librws/build.make.000.log
In file included from /home/kappa95/yumi_depends_ws/src/abb_librws/include/abb_librws/rws_client.h:48:0,
                 from /home/kappa95/yumi_depends_ws/src/abb_librws/src/rws_client.cpp:41:
/home/kappa95/yumi_depends_ws/src/abb_librws/include/abb_librws/rws_poco_client.h:42:38: fatal error: Poco/Net/HTTPCredentials.h: File o directory non esistente
In file included from /home/kappa95/yumi_depends_ws/src/abb_librws/src/rws_poco_client.cpp:43:0:
/home/kappa95/yumi_depends_ws/src/abb_librws/include/abb_librws/rws_poco_client.h:42:38: fatal error: Poco/Net/HTTPCredentials.h: File o directory non esistente
In file included from /home/kappa95/yumi_depends_ws/src/abb_librws/include/abb_librws/rws_client.h:48:0,
                 from /home/kappa95/yumi_depends_ws/src/abb_librws/include/abb_librws/rws_interface.h:40,
                 from /home/kappa95/yumi_depends_ws/src/abb_librws/src/rws_interface.cpp:40:
/home/kappa95/yumi_depends_ws/src/abb_librws/include/abb_librws/rws_poco_client.h:42:38: fatal error: Poco/Net/HTTPCredentials.h: File o directory non esistente
compilation terminated.
compilation terminated.
compilation terminated.
make[2]: *** [CMakeFiles/abb_librws.dir/src/rws_interface.cpp.o] Errore 1
make[2]: *** Attesa per i processi non terminati....
make[2]: *** [CMakeFiles/abb_librws.dir/src/rws_client.cpp.o] Errore 1
make[2]: *** [CMakeFiles/abb_librws.dir/src/rws_poco_client.cpp.o] Errore 1
make[1]: *** [CMakeFiles/abb_librws.dir/all] Errore 2
make: *** [all] Errore 2
cd /home/kappa95/yumi_depends_ws/build/abb_librws; catkin build --get-env abb_librws | catkin env -si  /usr/bin/make --jobserver-fds=6,7 -j; cd -
...............................................................................
Failed     << abb_librws:make                              [ Exited with code 2 ]
Failed    <<< abb_librws                                   [ 1.7 seconds ]     
Abandoned <<< abb_irb2400_moveit_config                    [ Unrelated job failed ]
Abandoned <<< abb_irb6640_moveit_config                    [ Unrelated job failed ]
Abandoned <<< industrial_robot_client                      [ Unrelated job failed ]
Abandoned <<< industrial_robot_simulator                   [ Unrelated job failed ]
Abandoned <<< yumi_hw                                      [ Unrelated job failed ]
Abandoned <<< yumi_launch                                  [ Unrelated job failed ]
Finished  <<< simple_message                               [ 0.3 seconds ]     
[build] Summary: 18 of 25 packages succeeded.                                  
[build]   Ignored:   2 packages were skipped or are blacklisted.               
[build]   Warnings:  None.                                                     
[build]   Abandoned: 6 packages were abandoned.                                
[build]   Failed:    1 packages failed.                                        
[build] Runtime: 2.1 seconds total.                                            
[build] Note: Workspace packages have changed, please re-source setup files to use them.

Add contribution guidelines

In order to streamline community contributions, we need to add contribution guidelines.

This would be similar to #16, but specific to this repository.

500 : Internal Server Error

Hi,
I have a problem and would appreciate any help, Whenever i perform a request, for example like the below code snippet :

#include "abb_librws/rws_state_machine_interface.h"
using namespace abb;
using namespace rws;
using namespace std;

int main()
{
string ip_address = "192.xxx.xxx.xxx";
RWSStateMachineInterface IRB_120(ip_address);
TriBool State;
State = IRB_120.isRAPIDRunning();
return 0;
}

I get 500 Internal Server Error

here's the output from wireShark:

image

I have basic robotstudio version 6.07, robotware 6.08.01
I am using the state machine Add-In.

Ship a Poco find script that supports checking versions

The FindPoco.cmake provided by cmake_modules doesn't set the required variables for CMake to actually verify that it found the requested version of libpoco. At the moment the find_package(Poco .. 1.4.3 ..) is thus not enforced. This can lead to build issues on systems where libpoco-dev is installed, but not the right version.

This should be fixed by adapting FindPoco.cmake to also extract the version of the found libpoco-dev, and then shipping that version of the find script with the sources.

Improve the RWS subscription implementation

The current implementation for using RWS subscriptions is a bit unwieldy. This can be made more user friendly.

As it is right now, when a subscription event occurs, then the user is required to handle a XML document and process it themselves. Also, if the event content is inconsequential, then the XML document handling is just in the way.

Simple example (for the latter case)
Robot controller (RC): Requests an external computer to do some work when needed
External computer (EC): Performs some computational heavy calculations (e.g. image processing)

  1. The EC can register a RWS subscription (e.g. on a IO-signal), and wait for a subscription event.
  2. At some later time the RC sends a notification (e.g. triggered by the RAPID program), and continues with some other task until the results from the EC are really needed.
  3. The EC receives a subscription event and performs its task, and then it can send the results back to the RC (e.g. via the methods for writing to RAPID variables). The EC can then start waiting for a new subscription event.
  4. Finally, the RC processes the results and continue with its program.

IO signal subscription Issue

Hi,
When subscribe to digital output signal , if only wanna to monitor up edge(from 0 to 1) but not down edge (from 1 to 0), it seems no such option? Which means every time signal changes, from 0 to 1 and from 1 to 0, the event will trigger?

Thank you!

I have a question about subscription

I can't subscription to the "ValueChanged event" of the "RapidData" instance,when i begun to subscribed;
In the virtual controller of 6.06,this is perfect;
But in the actual matching of version "6.01",it failed, i bought "pc interface" module from abb,but it does not work too;
when i debug the info,i find that the web socket that used to listen to the subscriptions is not
set up.

Subscribe to more than one resources with ctrlexecstate

_abb::rws::RWSClient::SubscriptionResources subscription_resources;
subscription_resources.addIOSignal(io_signal, abb::rws::RWSClient::SubscriptionResources::HIGH);
subscription_resources.add("/rw/rapid/execution;ctrlexecstate", abb::rws::RWSClient::SubscriptionResources::MEDIUM);

if I subscribe two resources, one is io singal and other is rapid state like above code , but sometimes when I exit program and then try to run it again, it will have error of "failed to subription".
But if tried to subscribe to two io_signal when restart my program , no such issue.
Could you try it on your computer the above code and restart test programs several times to reproduce the issue?
Thanks!

Start adding tests

As #76 highlighted, we need to start adding tests to important parts of the library to avoid regressions.

Initially I would suggest we focus on serialisation and deserialisation interfacing code, to document our expectations about the RWS msgs and make sure code layered on-top doesn't break when those messages change.

Receive timeout for subscriptions too short

The robot controller sends out ping messages every 30 seconds, and currently the receive timeout is set to 10 seconds for the WebSocket connections. This makes the implementation think that the connection is lost, since it doesn't wait long enough.

Access RAPID arrays

New issue for @ScottYang1982's follow-up question in #64 (comment), about how to access RAPID arrays.

Currently, the RWSInteface class has no function implemented to parse a RAPID array. However, it is possible to directly use the base class RWSClient instead.

Rough example:

void main()
{
  abb::rws::RWSClient::RWSResult rws_result;
  std::string value;

  // Note: This example assume the following:
  // - The RAPID task "T_ROB1" exists.
  // - The task has a module named "TRobMain".
  // - The module has a RAPID num array, of size 5, declared as "VAR num my_num_array{5};".
  abb::rws::RWSClient::RAPIDResource rapid_resource("T_ROB1", "TRobMain", "my_num_array");

  abb::rws::RWSClient rws_client("127.0.0.1");

  //--------------------------------------------------------------
  // Get the RAPID array
  //--------------------------------------------------------------
  rws_result = rws_client.getRAPIDSymbolData(rapid_resource);
  value = abb::rws::xmlFindTextContent(rws_result.p_xml_document, abb::rws::SystemConstants::RWS::XMLAttributes::CLASS_VALUE);
  
  std::cout << value << "\n";

  //--------------------------------------------------------------
  // Set the RAPID array
  // Note: Important to have the correct number of elements.
  //       Here it is assumed that the array has a size of 5.
  //--------------------------------------------------------------
  rws_result = rws_client.setRAPIDSymbolData(rapid_resource, "[1, 2, 3, 4, 5]");

  //--------------------------------------------------------------
  // Get the RAPID array
  //--------------------------------------------------------------
  rws_result = rws_client.getRAPIDSymbolData(rapid_resource);
  value = abb::rws::xmlFindTextContent(rws_result.p_xml_document, abb::rws::SystemConstants::RWS::XMLAttributes::CLASS_VALUE);

  std::cout << value << "\n";
}

The output should be something like this:

[0,0,0,0,0]
[1,2,3,4,5]

Possibility to adjust the "level" system parameter used by Externally Guided Motion.

Reading in the Applicaiton manual - Controller software IRC5 I find the table below presenting an EGM system parameter called "level". As we are working towards real-time control of an ABB IRB14000 we are looking for ways to reduce latency. In this context, it would be interesting to experiment with level 0 control.

Is it possible to configure for EGM level 0 control, if so, how can it be done?

image

Apologies if this issue belongs at abb_libegm

How to set header ?

Hi,
How to set the below header when run httpPost? Do not see any setting.

Headers 
Content-Type=application/x-www-form-urlencoded;v=1.0

"v" represents API version, which can vary. 

Implement a RAPID module builder/generator class

A RAPID module builder/generator would be quite useful. This could for example be used to execute a path in RAPID code.

Example:
From a vector of abb:rws::JointTarget elements, and some additional specifications, it is straight forward to generate a RAPID module like this:

MODULE <module_name>
   CONST jointtarget jt1 := <values>;
   CONST jointtarget jt2 := <values>;
   ...

   PROC <path_name>()
       MoveAbsJ jt1, <speed>, <zone>, <tool>;
       MoveAbsJ jt2, <speed>, <zone>, <tool>;
       ...
   ENDPROC
ENDMODULE

RWS can then be used to transfer the module to the controller, load it into a RAPID task, and then request the execution of the path.

The class could also be expanded to generate other types of modules (e.g. Cartesian motions, or a specific process including control of a tool, etc.).

Convert to pure CMake package

Adapt CMakeLists.txt so we can accomodate building the library without Catkin / in a non-ROS (build) environment.

Enable Travis

As per subject.

This would enable CI for this repository.

Create code samples

Create samples to showcase how to use the interface classes, including:

  • C++ code
  • RAPID code (and possibly a RobotStudio Pack&Go file for a simulation setup)
  • Instructions

Improve descriptions for constructors

Right now the code contains several "A constructor" or "A default constructor" descriptions. It would be nicer to have more descriptive documentation.

Document white-listing IPs when using RobotStudio

Using a proxy to work-around the HTTP 500 Internal Server Error problems (#47) is OK, but it might be better to use white-listing of IPs which are allowed to access the RWS server instead.

While both options will allow access to the machine which is running the Virtual Controller in RS, the proxy approach essentially allows any remote host access, while the white-list will allow only the IPs / hosts which are listed access.

This is more fine-grained and easier to setup as well.

The general procedure is described in Using RobotWebServices to access a remote Virtual Controller on the RS forum.

It would be good to duplicate the steps for this procedure here locally in this repository to avoid depending on external resources (which may go off-line at any moment).

Sample code for use of Smart Gripper services supplied in RWSStateMachineInterface.

Hi,

I am using the library againts a ABB IRB14000 YuMi and are experienceing issues using the Smart Gripper services supplied in rws_state_machine_interface.h. The robot have both the SmartGripper Add-In and Statemachine Add-In installed.

Have successfully interfaced against the robot controller with services supplied by rws_state_machine interface.h and other parts of the library. Robot is in auto mode with motors on. Tests performed both with the StateMachine running and stopped. Computer configured to use ip "192.168.125.50". Can read information about robot using http://192.168.125.1/rw?debug=1 succesfully.

As no hints or sample code is supplied for interfacing against the Smart Grippers I am unsure where my mistake is located. Would it be possible to supply sample code on how to interface against the Smart Grippers?

ubuntu xenial: Invalid arguments to find_dependency

When attempting to build an application which depends on abb_librws with CMake, the build is aborted with the following error:

CMake Error at /usr/share/cmake-3.5/Modules/CMakeFindDependencyMacro.cmake:45 (message):
  Invalid arguments to find_dependency
Call Stack (most recent call first):
  /home/user/ros_ws/devel/share/abb_librws/abb_librwsConfig.cmake:10 (find_dependency)
  CMakeLists.txt:39 (find_package)

This happens on an up-to-date Ubuntu Xenial, with CMake 3.5.1.

Using RWS capabilities not currently in the interface

I'm looking to use this library to issue commands to a controller remotely in ways that are not explicitly supported by the RWSClient or RWSInterface but which are specifiable by HTTP request (such as dynamically loading/unloading modules from the file system, setting the program pointer to certain procedures, etc.). What is the recommended way of extending the capability of this library to do actions supported by RWS that are not implemented in either abstraction class?

I could use the POCOClient directly, but I would rather get something like an RWSResult back from these actions. My current approach makes the parseMessage, checkAcceptedOutcomes, and evaluatePOCOResult public members of the RWSClient class, posts "custom" HTTP requests using httpPost, and checks the result with those functions. I wonder if those functions should be static methods, separate function utilities, or if RWSClient should wrap HTTP posting/putting/getting and return an RWSResult. Or should I be going about this some other way? Any advice you could give would be helpful

Rework the RWSSimpleStateMachineInterface class

The RWSSimpleStateMachineInterface class is obsolete and needs to be reworked.

The new class will be called RWSStateMachineInterface and it will be designed to interact with a RobotWare AddIn called StateMachine AddIn. For example, if the AddIn is included during system installation, then it will load several RAPID modules and configurations based on the system specifications. This is to simply the setup of an ABB robot controller, so it can more easily be used together with external systems (e.g. systems based on ROS).

Safely stopping `waitForSubscriptionEvent()` from another thread.

First of all, thanks for the library. Very useful :)

When using subscriptions, it is necessary to call waitForSubscriptionEvent(), likely in a loop. However, since this can block arbitrarily long, it generally has to be put in a separate thread from a different event loop like ros::spin().

When it's time to quit the program, it becomes necessary to stop the background thread. However, from what I gathered, I don't think there is a thread safe way to do this.

Firstly, both waitForSubscriptionEvent() and endSubscription() mutate a member evaluation_conditions_. So they can't safely be called from different threads at the same time. I didn't look further, but it could be that webSocketRecieveFrame() called from waitForSubscriptionEvent() does more thread unsafe things.

Secondly, endSubscription() only seems to ask the robot controller to remove the subscription. It doesn't do anything to stop waitForSubscriptionEvent(). Should communication with the controller be broken at this point, it may take arbitrarily long for waitForSubscriptionEvent() to return. Also, I'm not sure if the robot controller closes the websocket connection at all when the subscriptions are deleted. The documentation doesn't say anything on the subject.

Note that maybe endSubscription() shouldn't interrupt a running waitForSubscriptionEvent(). But then another function to do so would be very useful to cleanly terminate an application. Doing it in a separate function allows to limit thread safety guarantees to the interrupt function only, which wouldn't necessarily have to do an HTTP request. So that might keep things easier.

EGM : Proportional Position Gain

Hi,
In the document describing EGM motion (Position Guidance) and control loop there are two main control parameters that i can control, one is the Low Pass Filter the other is Proportional Position Gain, but i can't seem to find any way to control Proportion Position Gain while the code is running, is the only way to change it through hard coding in RobotStudio?, isn't there anyway to change it using abb_librws?

Here is the part where it's mentioned:

prop_gain_issue_1

Also is it the "K-factor" in these descriptions?

prop_gain_issue_2

Side Note : There's another parameter called Position Correction Gain that varies from (0 to 1), that's not the one I'm talking about.

Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.