Skip to content

Commit 38d88e0

Browse files
authored
Add MoveIt 2 demo (#181)
* Add MoveIt2 configuration files * Add launch file command * Include moveit files * Snapshot * Fix urdf * Interactive marker visible and action receives command * Rewrite trajectory follower * Add velocity trajectory * Fix armed demo * Run faster than real-time * Add controller_name param
1 parent 7aa8487 commit 38d88e0

File tree

13 files changed

+907
-294
lines changed

13 files changed

+907
-294
lines changed

webots_ros2_core/webots_ros2_core/trajectory_follower.py

Lines changed: 163 additions & 233 deletions
Large diffs are not rendered by default.

webots_ros2_core/webots_ros2_core/webots_node.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,20 @@
1919
import os
2020
import sys
2121
import argparse
22-
2322
import rclpy
2423
from rclpy.time import Time
2524
from rclpy.node import Node
2625
from rosgraph_msgs.msg import Clock
27-
2826
from webots_ros2_msgs.srv import SetInt
2927
from webots_ros2_core.joint_state_publisher import JointStatePublisher
3028
from webots_ros2_core.devices.device_manager import DeviceManager
3129
from webots_ros2_core.utils import get_node_name_from_args
32-
3330
from webots_ros2_core.webots_controller import Supervisor
3431

3532

33+
MAX_REALTIME_FACTOR = 20
34+
35+
3636
class WebotsNode(Node):
3737
"""
3838
Extends ROS2 base node to provide integration with Webots.
@@ -63,7 +63,7 @@ def __init__(self, name, args=None):
6363
self.timestep = int(self.robot.getBasicTimeStep())
6464
self.__clock_publisher = self.create_publisher(Clock, 'clock', 10)
6565
self.__step_service = self.create_service(SetInt, 'step', self.__step_callback)
66-
self.__timer = self.create_timer(0.001 * self.timestep, self.__timer_callback)
66+
self.__timer = self.create_timer((1 / MAX_REALTIME_FACTOR) * 1e-3 * self.timestep, self.__timer_callback)
6767
self.__device_manager = None
6868

6969
# Joint state publisher
@@ -77,7 +77,7 @@ def start_joint_state_publisher(self):
7777

7878
def step(self, ms):
7979
"""Call this method on each step."""
80-
if self.get_parameter('use_joint_state_publisher').value:
80+
if self.__joint_state_publisher:
8181
self.__joint_state_publisher.publish()
8282
if self.__device_manager:
8383
self.__device_manager.step()

webots_ros2_core/webots_ros2_core/webots_robotic_arm_node.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,17 @@ class WebotsRoboticArmNode(WebotsNode):
2929
prefix (str): Prefix passed to JointStatePublisher.
3030
"""
3131

32-
def __init__(self, name, args, prefix=''):
32+
def __init__(self, name, args, prefix='', controller_name=''):
3333
super().__init__(name, args)
3434
self.start_joint_state_publisher()
3535
self.__prefix_param = self.declare_parameter('prefix', prefix)
36-
self.__trajectory_follower = TrajectoryFollower(self.robot, self, joint_prefix=self.__prefix_param.value)
36+
self.__controller_name_param = self.declare_parameter('controller_name', controller_name)
37+
self.__trajectory_follower = TrajectoryFollower(
38+
self.robot,
39+
self,
40+
joint_prefix=self.__prefix_param.value,
41+
controller_name=self.__controller_name_param.value
42+
)
3743

3844
self.get_logger().info('Initializing robotic arm node with prefix = "%s"' % self.__prefix_param.value)
3945

webots_ros2_demos/launch/armed_robots.launch.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
import os
2020
import launch
21+
from ament_index_python.packages import get_package_share_directory
2122
from webots_ros2_core.utils import ControllerLauncher
2223
from webots_ros2_core.webots_launcher import WebotsLauncher
23-
from ament_index_python.packages import get_package_share_directory
2424

2525

2626
def generate_launch_description():
@@ -33,16 +33,14 @@ def generate_launch_description():
3333
package='webots_ros2_core',
3434
executable='webots_robotic_arm_node',
3535
arguments=['--webots-robot-name=abbirb4600'],
36-
namespace='abb',
37-
parameters=[{'synchronization': synchronization}],
36+
parameters=[{'synchronization': synchronization, 'controller_name': 'abb'}],
3837
output='screen'
3938
)
4039
ure5_controller = ControllerLauncher(
4140
package='webots_ros2_core',
4241
executable='webots_robotic_arm_node',
4342
arguments=['--webots-robot-name=UR5e'],
44-
namespace='ur',
45-
parameters=[{'synchronization': synchronization}],
43+
parameters=[{'synchronization': synchronization, 'controller_name': 'ur'}],
4644
output='screen'
4745
)
4846

webots_ros2_demos/webots_ros2_demos/armed_robots_abb.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,23 @@
1414

1515
"""Trajectory follower client for the ABB irb4600 robot."""
1616

17-
from webots_ros2_demos.follow_joint_trajectory_client import followJointTrajectoryClient
18-
1917
import rclpy
18+
from webots_ros2_demos.follow_joint_trajectory_client import FollowJointTrajectoryClient
2019

2120

2221
def main(args=None):
2322
rclpy.init(args=args)
24-
armedRobotUR = followJointTrajectoryClient('armed_robots_abb', '/abb/follow_joint_trajectory')
25-
armedRobotUR.send_goal({
26-
'joint_names': ['A motor', 'B motor', 'C motor', 'E motor', 'finger_1_joint_1',
27-
'finger_2_joint_1', 'finger_middle_joint_1'],
23+
armed_robot_abb = FollowJointTrajectoryClient('armed_robots_abb', '/abb/follow_joint_trajectory')
24+
armed_robot_abb.send_goal({
25+
'joint_names': [
26+
'A motor',
27+
'B motor',
28+
'C motor',
29+
'E motor',
30+
'finger_1_joint_1',
31+
'finger_2_joint_1',
32+
'finger_middle_joint_1'
33+
],
2834
'points': [
2935
{
3036
'positions': [0.0, 0.0, 0.0, 0., 0.0, 0.0, 0.0],
@@ -82,7 +88,7 @@ def main(args=None):
8288
}
8389
]
8490
}, 10)
85-
rclpy.spin(armedRobotUR)
91+
rclpy.spin(armed_robot_abb)
8692

8793

8894
if __name__ == '__main__':

webots_ros2_demos/webots_ros2_demos/armed_robots_ur.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,23 @@
1414

1515
"""Trajectory follower client for the UR5 robot."""
1616

17-
from webots_ros2_demos.follow_joint_trajectory_client import followJointTrajectoryClient
18-
1917
import rclpy
18+
from webots_ros2_demos.follow_joint_trajectory_client import FollowJointTrajectoryClient
2019

2120

2221
def main(args=None):
2322
rclpy.init(args=args)
24-
armedRobotUR = followJointTrajectoryClient('armed_robots_ur', '/ur/follow_joint_trajectory')
25-
armedRobotUR.send_goal({
26-
'joint_names': ['shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint',
27-
'wrist_1_joint', 'finger_1_joint_1', 'finger_2_joint_1',
28-
'finger_middle_joint_1'],
23+
armed_robot_ur = FollowJointTrajectoryClient('armed_robots_ur', '/ur/follow_joint_trajectory')
24+
armed_robot_ur.send_goal({
25+
'joint_names': [
26+
'shoulder_pan_joint',
27+
'shoulder_lift_joint',
28+
'elbow_joint',
29+
'wrist_1_joint',
30+
'finger_1_joint_1',
31+
'finger_2_joint_1',
32+
'finger_middle_joint_1'
33+
],
2934
'points': [
3035
{
3136
'positions': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
@@ -71,7 +76,7 @@ def main(args=None):
7176
}
7277
]
7378
}, 10)
74-
rclpy.spin(armedRobotUR)
79+
rclpy.spin(armed_robot_ur)
7580

7681

7782
if __name__ == '__main__':

webots_ros2_demos/webots_ros2_demos/follow_joint_trajectory_client.py

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,64 +24,67 @@
2424
from rclpy.node import Node
2525

2626

27-
class followJointTrajectoryClient(Node):
27+
class FollowJointTrajectoryClient(Node):
2828

2929
def __init__(self, name, actionName):
3030
super().__init__(name)
31-
self.client = ActionClient(self, FollowJointTrajectory, actionName)
32-
self.remainingIteration = 0
33-
self.currentTrajectory = None
31+
self.__client = ActionClient(self, FollowJointTrajectory, actionName)
32+
self.__remaining_iteration = 0
33+
self.__current_trajectory = None
34+
self.__get_result_future = None
35+
self.__send_goal_future = None
3436

35-
def goal_response_callback(self, future):
37+
def __on_goal_response_callback(self, future):
3638
goal_handle = future.result()
3739
if not goal_handle.accepted:
3840
self.get_logger().info('Goal rejected by action server.')
3941
return
4042

4143
self.get_logger().info('Goal accepted by action server.')
44+
self.__get_result_future = goal_handle.get_result_async()
45+
self.__get_result_future.add_done_callback(self.__on_get_result_callback)
4246

43-
self._get_result_future = goal_handle.get_result_async()
44-
self._get_result_future.add_done_callback(self.get_result_callback)
45-
46-
def feedback_callback(self, feedback):
47+
def __on_feedback_callback(self, _):
4748
self.get_logger().info('Received feedback from action server.')
4849

49-
def get_result_callback(self, future):
50+
def __on_get_result_callback(self, future):
5051
status = future.result().status
5152
if status == GoalStatus.STATUS_SUCCEEDED:
5253
self.get_logger().info('Goal succeeded.')
5354
else:
5455
self.get_logger().info('Goal failed with status: {0}'.format(status))
5556

56-
if self.remainingIteration > 0:
57-
self.send_goal(self.currentTrajectory, self.remainingIteration - 1)
57+
if self.__remaining_iteration > 0:
58+
self.send_goal(self.__current_trajectory, self.__remaining_iteration - 1)
5859
else:
5960
# Shutdown after receiving a result
6061
rclpy.shutdown()
6162

6263
def send_goal(self, trajectory, iteration=1):
6364
self.get_logger().info('Waiting for action server...')
64-
self.client.wait_for_server()
65+
self.__client.wait_for_server()
6566

66-
self.currentTrajectory = trajectory
67-
self.remainingIteration = iteration - 1
67+
self.__current_trajectory = trajectory
68+
self.__remaining_iteration = iteration - 1
6869

6970
goal_msg = FollowJointTrajectory.Goal()
7071
goal_msg.trajectory.joint_names = trajectory['joint_names']
7172
for point in trajectory['points']:
72-
trajectoryPoint = JointTrajectoryPoint(positions=point['positions'],
73-
velocities=point['velocities'],
74-
accelerations=point['accelerations'],
75-
time_from_start=Duration(
76-
sec=point['time_from_start']['sec'],
77-
nanosec=point['time_from_start']['nanosec']
78-
))
79-
goal_msg.trajectory.points.append(trajectoryPoint)
73+
trajectory_point = JointTrajectoryPoint(
74+
positions=point['positions'],
75+
velocities=point['velocities'],
76+
accelerations=point['accelerations'],
77+
time_from_start=Duration(
78+
sec=point['time_from_start']['sec'],
79+
nanosec=point['time_from_start']['nanosec']
80+
)
81+
)
82+
goal_msg.trajectory.points.append(trajectory_point)
8083

8184
self.get_logger().info('Sending goal request...')
8285

83-
self._send_goal_future = self.client.send_goal_async(
86+
self.__send_goal_future = self.__client.send_goal_async(
8487
goal_msg,
85-
feedback_callback=self.feedback_callback)
86-
87-
self._send_goal_future.add_done_callback(self.goal_response_callback)
88+
feedback_callback=self.__on_feedback_callback
89+
)
90+
self.__send_goal_future.add_done_callback(self.__on_goal_response_callback)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
controller_names:
2+
- webots_controller
3+
4+
webots_controller:
5+
action_ns: follow_joint_trajectory
6+
type: FollowJointTrajectory
7+
default: true
8+
joints:
9+
- shoulder_pan_joint
10+
- shoulder_lift_joint
11+
- elbow_joint
12+
- wrist_1_joint
13+
- wrist_2_joint
14+
- wrist_3_joint
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
manipulator:
2+
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
3+
kinematics_solver_search_resolution: 0.005
4+
kinematics_solver_timeout: 0.005

0 commit comments

Comments
 (0)