On 25/09/15 13:36, Thomas Timm Andersen wrote:
> Hello ROS-Industrial users
>
> (Sorry for cross-posting)
>
> I am glad to share my new driver for the Universal Robots:
> https://github.com/ThomasTimm/ur_modern_driver
>
> The driver is written in c++ and is designed to replace the old driver
> transparently, while solving some issues, improving usability as well as
> enabling compatibility of ros_control.
[..]
> Please try it out and report any issues / incompatibilities so it hopefully
> can make it into Jade (or indigo?)
[..]
Hi Thomas,
thanks for making this available. I had a quick look, and tried to
summarise my understanding of your class hierarchy. I've included it
below this email.
Looking through the code, I got the impression that this driver mimics
the Python driver in quite a few places. Was that intentional? I was
especially surprised by the use of 'driverProg' and seeing
UrDriver::servoj() use the same binary protocol. Is that because there
is no more performant way, and re-using the existing structure is then
convenient, or do you have some other reason for this?
Would it make sense to completely do away with UrDriver::doTraj(), and
only support a ros_control based driver that just uses
UrDriver::setSpeed() for both position and velocity control? Or is the
local loop on the UR controller better suited (accuracy, robustness) for
this?
Do you know if there is any difference in execution paths taken by
scripts uploaded through the RT port vs the secondary interface? I would
not expect there to be any, but I seem to remember reports of other
(non-ROS) users that tried to do high-rate speedj() control over the
secondary interface, and never got above ~10 Hz. It's at least a nice
coincidence that the secondary interface broadcasts at the same frequency.
>> Would it make sense to completely do away with UrDriver::doTraj(), and
>> only support a ros_control based driver that just uses
>> UrDriver::setSpeed() for both position and velocity control? Or is the
>> local loop on the UR controller better suited (accuracy, robustness) for
>> this?
>
> In time, I think that would make sense, yes.
> I would guess that a controller that takes dynamics into account would
> probably be needed before it can compete with the accuracy of the servoj
> command, but this is purely speculative. Also, I haven't done much to tune
> the PID gains. But I don't see any reason why it shouldn't be possible to
> do just as good with speedj as with the servoj command in terms of
> accuracy.
> W.r.t robustness; if anything the speedj is better. speedj commands also
> executes much faster (in the next control loop after reception as compared
> to the +150 ms).
If I understand you correctly: _any_ command other than speedj() will
have this 150ms+ delay before it is executed?
Or is it just the current driverProg based implementation?
> Until these things are in place (at least the tuning of the PID gains),
> I've opted to keep the servoj local loop, also to ensure comparable
> performance and backwards compatibility with the old driver.
Ok, that makes sense.
thanks for your reply.
Gijs
Hello Tim,
thank
you for contributing the new modern ur driver. I played around a
bit
and I like that it is possible to move the robot in freeride mode
while the driver is running. Great Job!
As I can see there three ways to control the robot:
1) via
MoveIt! on follow_joint topic...
2) via
ros_control
3) vis
movej and movel from the ur_script
Which
way would you recommend to use your driver, if I like to read the
joint angles, do some computation and set new joint angles after
computation? In this case I would like to reduce, or let us say
exclude, ROS dependencies as much as possible.
Another question that I'd like to ask is about ROS control. What are you using on the server side (ur control box)? Is it the ur-c-api stack from Kelsey Hawkins?
King regards,
Michael
--
You received this message because you are subscribed to the Google Groups "swri-ros-pkg-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to swri-ros-pkg-d...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
-- M.Sc. Michael Wojtynek Phone +49-521-106-2931 Research Institute for Cognition and Robotics (CoR-Lab) Bielefeld University
1) > roslaunch ur_modern_driver ur10_bringup.launch limited:=true robot_ip:=IP_OF_THE_ROBOT
2) >
roslaunch ur10_moveit_config ur5_moveit_planning_execution.launch limited:=true
3) >
roslaunch ur10_moveit_config moveit_rviz.launch config:=true
Window 3:Thanks
Brett
the text_move.py file in rosrun ur_driver test_move.py
Hello
1: Yes, you can use the ur_modern_driver to control your real UR arm. It works with both UR3, UR5 and UR10 robots.
2. The initial idea was to use the test_move.py file from the old driver. As the new driver is more strict towards requiring properly defined trajectories, the old test_move.py script doesn’t work.
Therefore I have just added a test_move.py file to my repository.
So start by updating your clone by typing roscd ur_modern_driver;git pull;roscd;cd ..;catkin_make;source devel/setup.bash in a terminal.
Then, to start using the arm, make sure you have two terminals open.
In the first terminal, you execute roslaunch ur_modern_driver ur3_bringup.launch robot_ip:= IP_OF_THE_ROBOT
In the second terminal, you execute rosrun ur_modern_driver test_move.py
Once you have verified that the robot can move to the specified poses, press y, then enter, and the robot should start to move.
If you want to follow along in the tutorial that you have linked to (or any other tutorials written for the old driver), you should just use ur_modern_driver instead of ur_driver or ur_bringup whenever these names are specified. Everything else is the same as they don’t depend on the driver (i.e. you should still use the ur5_moveit_config package).
Best regards
Thomas
From: swri-ros...@googlegroups.com [mailto:swri-ros...@googlegroups.com]
On Behalf Of ryan....@gmail.com
Sent: 19. februar 2016 04:22
To: swri-ros-pkg-dev
Subject: [ROS-Industrial] Re: New Universal Robot driver
Dear Thomas,
--
Ryan,
There are a few different options.
The link you’ve found gives some useful information, but is quite out-dated.
Generally, I would recommend you look at how actionlib works ( http://wiki.ros.org/actionlib_tutorials/Tutorials ) The driver has an action server, so you need to write an action client.
ROS-I have many great tutorials, you should have a look at http://aeswiki.datasys.swri.edu/rositraining Note that it is written for the old driver, but (just like with the other examples) just remember to substitute ur_driver with ur_modern driver, and you should be good. I haven’t gone through them myself, but they seem to be focused around MoveIt, so not the simplest way to do things.
Finally, you could take the python file and try to understand how it works and then converting it to cpp. This approach will probably give you the best foundation to work from.
I don’t have any cpp code at hand, so you’ll have to do the grunt work yourself. Just remember, joint positions are available on the /joint_states topic as sensor_msg/JointState message type, and the action interface is available as control_msgs/FollowJointTrajectoryAction action type on the /follow_joint_trajectory topic.
Best regards
Thomas
From: swri-ros...@googlegroups.com [mailto:swri-ros...@googlegroups.com]
On Behalf Of ryan....@gmail.com
Sent: 23. februar 2016 11:25
To: swri-ros-pkg-dev
Subject: [ROS-Industrial] Re: New Universal Robot driver
Dear Thomas,
--
Yu Hoi Fan,
Please have a look at the getting started tutorials for ROS (http://wiki.ros.org/ROS/Tutorials ).
As stated in these, you don’t have to add anything to the CMakeList-file when using python files.
The tutorials also teaches you all you need to know about writing ROS nodes in cpp and adding them to the CMakeList-file.
Note that you shouldn’t link your code to ur_modern_driver. Make your own package that run_depends on ur_modern_driver, have your node subscribe to joint_states and send actions to the follow_joint_trajectory interface.
Best
Hi Teresa.
The driver does indeed support it, and I am fairly sure that the error you see is not from the driver, but rather from whatever node is bulldog and sending the trajectory to the driver, i.e Moveit!
The reason being that I dont recall having that error in the driver (like I said, you can send a new trajectory while another is executed, so such a message wouldn't make sense to have), but I am out of office the rest of the month, so I cant verify it at the moment.
I'm afraid I can't help you any further, not wothout knowing what you use to build and publish your trajectory.
Best regards
Thomas
--
You received this message because you are subscribed to a topic in the Google Groups "swri-ros-pkg-dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/swri-ros-pkg-dev/qo9pu4PbEJY/unsubscribe.
To unsubscribe from this group and all its topics, send an email to swri-ros-pkg-d...@googlegroups.com.
The driver also makes it possible to send URScript commands from ROS to the robot
Nick,
You are right in that it is not possible in MoveIt!.
There are two methods for doing force control
1.
Use the internal force sensor and URScript, as you suggested
I don’t have much experience with this, try have a look at http://www.universal-robots.com/how-tos-and-faqs/how-to/ur-how-tos/seek-using-force-16117/ and http://www.universal-robots.com/how-tos-and-faqs/how-to/ur-how-tos/urscript-dynamic-force-control-20571/
Then use the URScript interface on the ur_modern_driver to publish your URScript commands to the robot.
This is probably the easiest way, especially if you don’t have a good understanding of control theory.
2.
Write your own controller and control the robot with velocity commands.
This approach has the advantage of not depending on the internal force torque sensor, although it is possible.
With this approach, you subscribe to a topic with WrenchStamped data (either from the robot or from other FT sensor manufactures like Robotiq or ATI), compare the actual force with the desired in the directions you want force control and then calculate the
inverse jacobian to get the target velocities.
These are then either sent directly to the joint_speed interface or sent to a ros_control joint_velocity velocity_controller interface.
We’ve had different students succeed in this approach (not using ros_control though).
Best regards,
Thomas
From: swri-ros...@googlegroups.com [mailto:swri-ros...@googlegroups.com]
On Behalf Of np0...@bristol.ac.uk
Sent: 9. maj 2016 11:44
To: swri-ros-pkg-dev
Subject: [ROS-Industrial] Re: New Universal Robot driver
Hello Thomas,
--
You received this message because you are subscribed to the Google Groups "swri-ros-pkg-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to swri-ros-pkg-d...@googlegroups.com.
/joint_speed : Takes messages of type trajectory_msgs/JointTrajectory. Parses the first JointTracetoryPoint and sends the specified joint speeds and accelerations to the robot. This interface is intended for doing visual servoing and other kind of control that requires speed control rather than position control of the robot. Remember to set values for all 6 joints. Ignores the field joint_names, so set the values in the correct order.
Hello,
First of all, congratulation for this new ur driver implementation. I am using it with an UR10 and it works really well. I send different trajectories using the action server with no problems.
I have a problem when I try to stop the robot movement by sending an empty trajectory, the driver crashes. This is a piece of my code:
trajectory_msgs::JointTrajectory empty;
empty.joint_names.push_back("shoulder_pan_joint");
empty.joint_names.push_back("shoulder_lift_joint");
empty.joint_names.push_back("elbow_joint");
empty.joint_names.push_back("wrist_1_joint");
empty.joint_names.push_back("wrist_2_joint");
empty.joint_names.push_back("wrist_3_joint");
empty.header.stamp = ros::Time::now();
//Create goal and send it to the controller
control_msgs::FollowJointTrajectoryGoal goal;
goal.trajectory = traj;
ac_->sendGoal(goal);
ac_ is previously created as:
ac_=new actionlib::SimpleActionClient<control_msgs::FollowJointTrajectoryAction> ("follow_joint_trajectory", true);
I suppose that there is something wrong in the empty trajectory creation.
Any suggestions?
Thanks in advance,
El viernes, 25 de septiembre de 2015, 13:36:58 (UTC+2), Thomas Timm Andersen escribió: