Skip to content
Open
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
6abe941
working on external control driver
ravirathnam Jul 25, 2023
34883c6
renamed class to external_control
ravirathnam Jul 26, 2023
cc335de
external control can be extended through configuration.
ravirathnam Jul 27, 2023
052891c
added config for the controller
Nov 2, 2023
6436dfe
working on parsing messages
Nov 20, 2023
a51c83b
working on header
Nov 21, 2023
7fe1a11
omnimove messasges correctly being parsed
Nov 22, 2023
e408d4e
added caterpillar support
Dec 4, 2023
8ddf49b
changing startup to allow quantec support
Dec 5, 2023
6f66c51
agv type as parameter and setting interfaces using that
Dec 7, 2023
34c6e66
using agv_type to send drive commands
Dec 8, 2023
a31df54
merge with upstream
Dec 11, 2023
1cca280
Merge branch 'kroshu:master' into ungarn_merge
ravirathnam Dec 12, 2023
84ba687
added caterpillar drive commands
Dec 14, 2023
3d4fba1
added test node for platform
Dec 15, 2023
2faa719
modified platform_move_test to move iontec as well
Dec 15, 2023
9251782
removed velocity controller for pillar and shield,
Dec 19, 2023
abbab90
changed test to send 0 velocities for caterpillar move.
Dec 19, 2023
271ee15
checking velocities for caterpillar so that it can also stop agv.
Dec 19, 2023
ede631f
undid check for caterpillar becasue velocity is 0 for lift movement
Dec 19, 2023
d68d7b5
added test package for robot movement
Dec 21, 2023
3d66521
added missing resource file
Dec 21, 2023
bd3ed0b
added all movements for tests
Dec 21, 2023
75a5817
added service for platform move test to allow endurance testing
Jan 10, 2024
3f751f9
rewriting node to do everything using callbacks instead of spinninng_…
Jan 12, 2024
9c15227
waiting for service to end using python threading. working for both s…
Jan 15, 2024
0d8697f
added qt and idea created files
Jan 15, 2024
d6e3082
Merge branch 'master' into ungarn_merge
Jan 15, 2024
ec66222
undo changes to rsi_driver.
Jan 29, 2024
ed5d9cb
removed unused file
Jan 29, 2024
4bdbfa2
separate script for iontec, changed quantec test to use new position
Jan 29, 2024
85e4fa6
modified test to always change velocity.
Jan 29, 2024
d07271c
increasing rotation speed for caterpillar
Jan 29, 2024
c139674
changes from pre-commit hook
Jan 30, 2024
77fe876
formatting using pre-commit
Jan 30, 2024
bd7c5f7
formatting changes from pre-commit
Jan 30, 2024
88bd47b
formatting splitting line
Jan 30, 2024
c90072b
update formatting
Apr 8, 2024
52334e2
changing formatting in platformMoveTest
Apr 8, 2024
583850d
formatting
Apr 8, 2024
17f9f00
Merge pull request #2 from kroshu/master
ravirathnam Apr 8, 2024
f733ef1
commenting out ament_cpp_lint in testing.
Apr 9, 2024
38be84b
Merge branch 'ungarn_merge' of https://github.com/ravirathnam/ros2_ku…
Apr 9, 2024
49a1d98
removing auto_lint_test from cmake
Apr 9, 2024
51513d2
Merge branch 'master' into ungarn_merge
ravirathnam Jun 4, 2024
526df32
use static_cast
ravirathnam Jun 4, 2024
8d7866a
changes from review.
Jun 6, 2024
55dd7ac
changes from review, added all pillars to one array
Jun 7, 2024
b3e0c8f
allowed pillar speeds to be negative
Jun 7, 2024
22cd585
returning error if socket can't connect
Jun 7, 2024
7b5f4cb
removed iontec and quantec tests and replaced with robot_movement_tes…
Jun 25, 2024
19d4667
removed unneeded configuration file.
Jun 25, 2024
142b66b
movements for test completely parametrisable, added configuration for…
Jun 25, 2024
637c0e1
renamed files
Jun 26, 2024
c760ea9
renamed directory to match package name
Jun 26, 2024
b4f558b
renamed driver to fit convention
Jun 27, 2024
0b3640e
formatting
Jun 27, 2024
d127f70
formatting
Jun 27, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
build*
CMake*.user
.idea
__pycache__/
Empty file.
310 changes: 310 additions & 0 deletions examples/kuka_rsi_robot_tests/kuka_rsi_robot_tests/iontec_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,310 @@
import copy

import rclpy
import std_srvs.srv
from builtin_interfaces.msg import Duration
from rclpy.node import Node
from lifecycle_msgs.srv import ChangeState, GetState
from lifecycle_msgs.msg import Transition, State
from control_msgs.action import FollowJointTrajectory
from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint
from rclpy.action import ActionClient
from rclpy.callback_groups import MutuallyExclusiveCallbackGroup
from threading import Event


class RobotManagerClient(Node):
def __init__(self, service_group):
super().__init__("robot_manager_client")
self.times = None
self.moves = None
self.current_index = None
self.actionFinished = None
self.declare_parameter("start_service", False)
self.start_service = self.get_parameter("start_service").get_parameter_value().bool_value
self.action_client = None
self.start_movement_service = None
self.movement_done = Event()
if self.start_service is True:
self.service_group = service_group
self.start_movement_service = self.create_service(
std_srvs.srv.Empty,
"start_robot_movements",
self.start_robot_movements_callback,
callback_group=service_group,
)
self.stop_movement_service = self.create_service(
std_srvs.srv.Empty,
"stop_robot_movements",
self.stop_robot_movements_callback,
callback_group=service_group,
)
state_client_group = MutuallyExclusiveCallbackGroup()
self.cli = self.create_client(
ChangeState, "/robot_manager/change_state", callback_group=state_client_group
)
self.state_client = self.create_client(
GetState, "/robot_manager/get_state", callback_group=state_client_group
)
while not self.cli.wait_for_service(timeout_sec=1.0):
self.get_logger().info("service not available, waiting again...")
self.req = ChangeState.Request()
action_client_group = MutuallyExclusiveCallbackGroup()
self.action_client = ActionClient(
self,
FollowJointTrajectory,
"/joint_trajectory_controller/follow_joint_trajectory",
callback_group=action_client_group,
)
self.create_movements()

def create_movements(self):
home_pos_1 = 0.005
home_pos_2 = -2.1900
home_pos_3 = 2.1823
home_pos_4 = -0.0298
home_pos_5 = 0.002
home_pos_6 = -0.034
home_pos = [home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6]
# moving around joint_!
self.moves = []
self.times = []
self.moves.append(
[home_pos_1 + 0.4, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6]
)
self.times.append(6)
self.moves.append(
[home_pos_1 - 0.4, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6]
)
self.times.append(12)
self.moves.append(home_pos)
self.times.append(6)
# joint2 only moving in one direction since we are at the limit
self.moves.append(
[home_pos_1, home_pos_2 + 0.4, home_pos_3, home_pos_4, home_pos_5, home_pos_6]
)
self.times.append(10)
self.moves.append(home_pos)
self.times.append(10)
# joint3 only moving in one direction since we are at the limit
self.moves.append(
[home_pos_1, home_pos_2, home_pos_3 - 0.4, home_pos_4, home_pos_5, home_pos_6]
)
self.times.append(10)
self.moves.append(home_pos)
self.times.append(10)
# joint4
self.moves.append(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4 + 0.4, home_pos_5, home_pos_6]
)
self.times.append(5)
self.moves.append(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4 - 0.4, home_pos_5, home_pos_6]
)
self.times.append(5)
self.moves.append(home_pos)
self.times.append(5)
# joint5
self.moves.append(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5 + 0.4, home_pos_6]
)
self.times.append(5)
self.moves.append(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5 - 0.4, home_pos_6]
)
self.times.append(10)
self.moves.append(home_pos)
self.times.append(5)
# joint6
self.moves.append(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6 + 0.4]
)
self.times.append(5)
self.moves.append(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6 - 0.4]
)
self.times.append(10)
self.moves.append(home_pos)
self.times.append(5)

def send_configure(self):
self.req.transition.id = Transition.TRANSITION_CONFIGURE
while not self.cli.wait_for_service(timeout_sec=1.0):
self.get_logger().info("service not available, waiting again...")
self.get_logger().info("calling configure")
future = self.cli.call_async(self.req)
future.add_done_callback(self.configure_done_callback)

def configure_done_callback(self, future):
self.get_logger().info("configure done. Calling activate")
self.send_activate()

def send_activate(self):
self.req.transition.id = Transition.TRANSITION_ACTIVATE
future = self.cli.call_async(self.req)
future.add_done_callback(self.activate_done_callback)

def send_deactivate(self):
self.req.transition.id = Transition.TRANSITION_DEACTIVATE
future = self.cli.call_async(self.req)
future.add_done_callback(self.deactivate_done_callback)

def activate_done_callback(self, future):
self.get_logger().info("activate done")
self.get_state()

def deactivate_done_callback(self, future):
self.get_logger().info(
"deactivate call done. If it failed, probably manual intervention is required"
)
self.movement_done.set()

def activate_robot(self):
self.send_configure() # this will in callback send the activate

def get_state(self):
state_future = self.state_client.call_async(GetState.Request())
state_future.add_done_callback(self.get_state_callback)
self.get_logger().info("waiting for getting state")

def get_state_callback(self, future):
self.get_logger().info("got current state")
state_resp = future.result()
if state_resp.current_state.id == State.PRIMARY_STATE_ACTIVE:
self.get_logger().info("Robot is active")
self.current_index = 0
self.start_next_movement()
else:
self.get_logger().error("could not activate robot")
if self.start_service:
self.movement_done.set()
else:
self.executor.shutdown()

def start_next_movement(self):
if self.current_index < len(self.times):
self.get_logger().info("going to submit movement")
position = self.moves[self.current_index]
duration = self.times[self.current_index]
self.current_index = self.current_index + 1
self.start_robot_movement(position, duration)
else:
self.get_logger().info("All movements done")
if self.start_service:
self.movement_done.set()
else:
self.executor.shutdown()

def start_robot_movement(self, position, duration):
goal = FollowJointTrajectory.Goal()
trajectory = JointTrajectory()
trajectory.joint_names = ["joint_1", "joint_2", "joint_3", "joint_4", "joint_5", "joint_6"]
goal_point = JointTrajectoryPoint()
goal_point.time_from_start = Duration(sec=duration)
goal_point.positions = position
trajectory.points.append(copy.deepcopy(goal_point))
goal.trajectory = trajectory
self.action_client.wait_for_server()
cur_action_submit = self.action_client.send_goal_async(goal)
self.get_logger().info("waiting for action to be submitted")
# self.executor.spin_until_future_complete(cur_action_submit)
cur_action_submit.add_done_callback(self.action_submit_callback)

def action_submit_callback(self, future):
self.get_logger().info("action submitted, waiting for action to be done")
result_action = future.result().get_result_async()
result_action.add_done_callback(self.action_done_callback)

def action_done_callback(self, future):
self.get_logger().info("action finished in callback")
self.start_next_movement()

def start_robot_movements(self):
self.get_logger().info("Robot movement starting")
home_pos_1 = 0.0
home_pos_2 = -2.3911
home_pos_3 = 2.6529
home_pos_4 = 0.0
home_pos_5 = 1.308
home_pos_6 = 0.0
home_pos = [home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6]
# moving around joint_!
self.start_robot_movement(
[home_pos_1 + 0.4, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6], 6
)
self.start_robot_movement(
[home_pos_1 - 0.4, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6], 12
)
self.start_robot_movement(home_pos, 6)
# joint2 only moving in one direction since we are at the limit
self.start_robot_movement(
[home_pos_1, home_pos_2 + 0.4, home_pos_3, home_pos_4, home_pos_5, home_pos_6], 10
)
self.start_robot_movement(home_pos, 10)
# joint3 only moving in one direction since we are at the limit
self.start_robot_movement(
[home_pos_1, home_pos_2, home_pos_3 - 0.4, home_pos_4, home_pos_5, home_pos_6], 10
)
self.start_robot_movement(home_pos, 10)
# joint4
self.start_robot_movement(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4 + 0.4, home_pos_5, home_pos_6], 5
)
self.start_robot_movement(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4 - 0.4, home_pos_5, home_pos_6], 5
)
self.start_robot_movement(home_pos, 5)
# joint5
self.start_robot_movement(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5 + 0.4, home_pos_6], 5
)
self.start_robot_movement(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5 - 0.4, home_pos_6], 10
)
self.start_robot_movement(home_pos, 5)
# joint6
self.start_robot_movement(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6 + 0.4], 5
)
self.start_robot_movement(
[home_pos_1, home_pos_2, home_pos_3, home_pos_4, home_pos_5, home_pos_6 - 0.4], 10
)
self.start_robot_movement(home_pos, 5)

def do_robot_movements(self):
self.activate_robot()

def start_robot_movements_callback(self, request, response):
self.get_logger().info("Processing start movement service call")
self.movement_done.clear()
self.do_robot_movements()
self.get_logger().info("waiting for all actions to be done")
self.movement_done.wait()
self.get_logger().info("service returning")
return response

def stop_robot_movements_callback(self, request, response):
self.get_logger().info("Processing start movement service call")
self.movement_done.clear()
self.send_deactivate()
self.movement_done.wait()
return response


def main(args=None):
rclpy.init(args=args)
service_group = rclpy.callback_groups.MutuallyExclusiveCallbackGroup()
robot_manager_client = RobotManagerClient(service_group)
executor = rclpy.executors.MultiThreadedExecutor()
executor.add_node(robot_manager_client)
if robot_manager_client.start_service is False:
robot_manager_client.do_robot_movements()
executor.spin()
robot_manager_client.destroy_node()
else:
executor.spin()
rclpy.shutdown()


if __name__ == "__main__":
main()
Loading