From 19de9cbe591731f7b49f5ced6dfbbc793786cdf8 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Thu, 23 Sep 2021 12:43:02 +0530 Subject: [PATCH 01/27] Add files via upload --- robot_software_transformers/path_node.py | 128 +++++++++++++++-------- 1 file changed, 82 insertions(+), 46 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index b911ff9..aefbd66 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -1,67 +1,91 @@ import rclpy from rclpy.node import Node from geometry_msgs.msg import Pose2D -import json - def pose_equal(p1,p2): isEqual = (abs(p1.theta-p2.theta)<5) distance = ((p1.x-p2.x)**2 + (p1.y-p2.y)**2)**0.5 isEqual = isEqual and (distance<15) - return distance<15 + return isEqual class PathNode(Node): - def __init__(self): + def __init__(self,num): super().__init__('path_node') + self.group = MutuallyExclusiveCallbackGroup() time_period = 1/30 - self.time = self.create_timer(time_period, self.timer_callback) + self.time = self.create_timer(time_period, self.timer_callback(num)) self.pose_sub = [] - self.pose_sub.append(self.create_subscription(Pose2D, 'r_1/pose', self.r_1_pose_callback, 1)) - self.pose_sub.append(self.create_subscription(Pose2D, 'r_2/pose', self.r_2_pose_callback, 1)) - self.pose_sub.append(self.create_subscription(Pose2D, 'r_3/pose', self.r_3_pose_callback, 1)) - self.pose_sub.append(self.create_subscription(Pose2D, 'r_4/pose', self.r_4_pose_callback, 1)) - self.pub_r_1 = self.create_publisher(Pose2D, 'r_1/target', 1) - self.pub_r_2 = self.create_publisher(Pose2D, 'r_2/target', 1) - self.pub_r_3 = self.create_publisher(Pose2D, 'r_3/target', 1) - self.pub_r_4 = self.create_publisher(Pose2D, 'r_4/target', 1) - self.step = 0 - self.path = [] + if(num == 1): + self.pose_sub.append(self.create_subscription(Pose2D, 'r_1/pose', self.r_1_pose_callback, 1)) + self.pub_r_1 = self.create_publisher(Pose2D, 'r_1/target', 1) + self.pub_bool_r_1 = self.create_publisher(bool, 'r_1/bool', 1) + elif(num == 2): + self.pose_sub.append(self.create_subscription(Pose2D, 'r_2/pose', self.r_2_pose_callback, 1)) + self.pub_r_2 = self.create_publisher(Pose2D, 'r_2/target', 1) + self.pub_bool_r_2 = self.create_publisher(bool, 'r_2/bool', 1) + elif(num == 3): + self.pose_sub.append(self.create_subscription(Pose2D, 'r_3/pose', self.r_3_pose_callback, 1)) + self.pub_r_3 = self.create_publisher(Pose2D, 'r_3/target', 1) + self.pub_bool_r_3 = self.create_publisher(bool, 'r_3/bool', 1) + elif(num == 4): + self.pose_sub.append(self.create_subscription(Pose2D, 'r_4/pose', self.r_4_pose_callback, 1)) + self.pub_r_4 = self.create_publisher(Pose2D, 'r_4/target', 1) + self.pub_bool_r_4 = self.create_publisher(bool, 'r_4/bool', 1) + self.step = [0,0,0,0] + self.path = [][] with open('path.json','r') as f: data = json.load(f) - for four_point in data: - path_point = dict() - for robot_id in four_point: - t = Pose2D() - t.x = four_point[robot_id]['x'] - t.y = four_point[robot_id]['y'] - if four_point[robot_id]['flip']: - t.theta = 90 - else: - t.theta = 0 - path_point[robot_id] = t - self.path.append(path_point) - t = Pose2D() - t.x = 12.0 - t.y = 30.0 - t.theta = 150.0 - self.pose = {'r_1':t,'r_2':t,'r_3':t,'r_4':t} + for four_point in data: + path_point = dict() + t = Pose2D() + t.x = four_point['r_'+str(num)]['x'] + t.y = four_point['r_'+str(num)]['y'] + if four_point['r_'+str(num)]['flip']: + t.theta = 90 + else: + t.theta = 0 + path_point[num] = t + self.path[num-1].append(path_point) + self.pose = {'r_'+str(num):t} #Example path: [{'r_1':Pose2D(0,0,0),'r_2':Pose2D(0,0,0)},{'r_1':Pose2D(0,0,90),'r_2':Pose2D(0,0,0)}] - def timer_callback(self): - self.pub_r_1.publish(self.path[self.step]['r_1']) - self.pub_r_2.publish(self.path[self.step]['r_2']) - self.pub_r_3.publish(self.path[self.step]['r_3']) - self.pub_r_4.publish(self.path[self.step]['r_4']) - if self.step Date: Fri, 24 Sep 2021 13:25:23 +0530 Subject: [PATCH 02/27] Add files via upload --- .../central_path_node.py | 47 +++++++++++++++++++ robot_software_transformers/socket_node.py | 6 +-- 2 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 robot_software_transformers/central_path_node.py diff --git a/robot_software_transformers/central_path_node.py b/robot_software_transformers/central_path_node.py new file mode 100644 index 0000000..b925780 --- /dev/null +++ b/robot_software_transformers/central_path_node.py @@ -0,0 +1,47 @@ +import rclpy +from rclpy.node import Node +from geometry_msgs.msg import Pose2D + + +class CentralPathNode(Node): + def __init__(self,robots): + super().__init__('central_path_node') + self.time_period = 1/30 + #self.time = self.create_timer(time_period, self.timer_callback(num)) + self.r_1_bool_sub = self.create_subscription(bool, 'r_1/bool', self.r_1_callback, 1) + self.r_2_bool_sub = self.create_subscription(bool, 'r_2/bool', self.r_2_callback, 1) + self.r_3_bool_sub = self.create_subscription(bool, 'r_3/bool', self.r_3_callback, 1) + self.r_4_bool_sub = self.create_subscription(bool, 'r_4/bool', self.r_4_callback, 1) + + def r_1_callback(self,msg): + if(msg==True): + self.r_1_pose_sub = self.create_subscription(Pose2D, 'r_1/target', self.r_1_pose_callback, 1) + self.time = self.create_timer(self.time_period, self.timer_callback('r_1',self.r_1_pose_sub)) + + def r_2_callback(self,msg): + if(msg==True): + self.r_2_pose_sub = self.create_subscription(Pose2D, 'r_2/target', self.r_2_pose_callback, 1) + self.time = self.create_timer(self.time_period, self.timer_callback('r_2',self.r_2_pose_sub)) + + def r_3_callback(self,msg): + if(msg==True): + self.r_3_pose_sub = self.create_subscription(Pose2D, 'r_3/target', self.r_3_pose_callback, 1) + self.time = self.create_timer(self.time_period, self.timer_callback('r_3',self.r_3_pose_sub)) + + def r_4_callback(self,msg): + if(msg==True): + self.r_4_pose_sub = self.create_subscription(Pose2D, 'r_4/target', self.r_4_pose_callback, 1) + self.time = self.create_timer(self.time_period, self.timer_callback('r_4',self.r_4_pose_sub)) + + def timer_callback(self, rID, content): + self.r_1_pose_final = self.create_publisher(Pose2D, rID+'/final_target', 1) + self.r_1_pose_final.publish(content) + +def main(): + rclpy.init() + central_path_node = CentralPathNode() + rclpy.spin(central_path_node) + rclpy.shutdown() + +if __name__ == '__main__': + main() diff --git a/robot_software_transformers/socket_node.py b/robot_software_transformers/socket_node.py index e23b82a..bb18ad1 100644 --- a/robot_software_transformers/socket_node.py +++ b/robot_software_transformers/socket_node.py @@ -16,7 +16,7 @@ def __init__(self,robot_id, robot_socket): self.robot_socket = robot_socket self.timer = self.create_timer(1/30,self.timer_callback,self.group) self.pose_sub = self.create_subscription(Pose2D,'r_'+str(robot_id)+'/pose',self.pose_callback,1,callback_group=self.group) - self.target_sub = self.create_subscription(Pose2D,'r_'+str(robot_id)+'/target',self.target_callback,1,callback_group=self.group) + self.target_sub = self.create_subscription(Pose2D,'r_'+str(robot_id)+'/final_target',self.target_callback,1,callback_group=self.group) self.pose = Pose2D() self.target = Pose2D() self.flip = Bool() @@ -46,10 +46,6 @@ def pose_callback(self,msg): def target_callback(self,msg): self.target = msg - if msg.theta == 90.0: - self.flip.data = True - else: - self.flip.data = False def main(): port = 5000 From bc41af46e4856f99b8ba8f2e93e96f6718f03602 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 12:57:12 +0530 Subject: [PATCH 03/27] Update path_node.py --- robot_software_transformers/path_node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index aefbd66..a2b4cde 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -12,7 +12,7 @@ def pose_equal(p1,p2): class PathNode(Node): def __init__(self,num): - super().__init__('path_node') + super().__init__('path_node_'+str(num)) self.group = MutuallyExclusiveCallbackGroup() time_period = 1/30 self.time = self.create_timer(time_period, self.timer_callback(num)) From 5e14e904283a37931e9c70508da34b0d38dac853 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 13:00:20 +0530 Subject: [PATCH 04/27] Update path_node.py --- robot_software_transformers/path_node.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index a2b4cde..2b60b24 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -1,6 +1,7 @@ import rclpy from rclpy.node import Node from geometry_msgs.msg import Pose2D +import functools def pose_equal(p1,p2): @@ -15,7 +16,7 @@ def __init__(self,num): super().__init__('path_node_'+str(num)) self.group = MutuallyExclusiveCallbackGroup() time_period = 1/30 - self.time = self.create_timer(time_period, self.timer_callback(num)) + self.time = self.create_timer(time_period, functools.partial(self.timer_callback,num=num)) self.pose_sub = [] if(num == 1): self.pose_sub.append(self.create_subscription(Pose2D, 'r_1/pose', self.r_1_pose_callback, 1)) From caf01e6ff939f240c191e12c236bcbd5095c5082 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 13:16:19 +0530 Subject: [PATCH 05/27] Update central_path_node.py --- robot_software_transformers/central_path_node.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/robot_software_transformers/central_path_node.py b/robot_software_transformers/central_path_node.py index b925780..16d2ef7 100644 --- a/robot_software_transformers/central_path_node.py +++ b/robot_software_transformers/central_path_node.py @@ -1,6 +1,7 @@ import rclpy from rclpy.node import Node from geometry_msgs.msg import Pose2D +from std_msgs.msg import Bool as bool class CentralPathNode(Node): @@ -12,29 +13,34 @@ def __init__(self,robots): self.r_2_bool_sub = self.create_subscription(bool, 'r_2/bool', self.r_2_callback, 1) self.r_3_bool_sub = self.create_subscription(bool, 'r_3/bool', self.r_3_callback, 1) self.r_4_bool_sub = self.create_subscription(bool, 'r_4/bool', self.r_4_callback, 1) + self.r_1_pose_sub = self.create_subscription(Pose2D, 'r_1/target', self.r_1_pose_callback, 1) + self.r_2_pose_sub = self.create_subscription(Pose2D, 'r_2/target', self.r_2_pose_callback, 1) + self.r_3_pose_sub = self.create_subscription(Pose2D, 'r_3/target', self.r_3_pose_callback, 1) + self.r_4_pose_sub = self.create_subscription(Pose2D, 'r_4/target', self.r_4_pose_callback, 1) + self.r_1_pose_final = self.create_publisher(Pose2D, 'r_1/final_target', 1) + self.r_2_pose_final = self.create_publisher(Pose2D, 'r_2/final_target', 1) + self.r_3_pose_final = self.create_publisher(Pose2D, 'r_3/final_target', 1) + self.r_4_pose_final = self.create_publisher(Pose2D, 'r_4/final_target', 1) def r_1_callback(self,msg): if(msg==True): - self.r_1_pose_sub = self.create_subscription(Pose2D, 'r_1/target', self.r_1_pose_callback, 1) self.time = self.create_timer(self.time_period, self.timer_callback('r_1',self.r_1_pose_sub)) def r_2_callback(self,msg): if(msg==True): - self.r_2_pose_sub = self.create_subscription(Pose2D, 'r_2/target', self.r_2_pose_callback, 1) self.time = self.create_timer(self.time_period, self.timer_callback('r_2',self.r_2_pose_sub)) def r_3_callback(self,msg): if(msg==True): - self.r_3_pose_sub = self.create_subscription(Pose2D, 'r_3/target', self.r_3_pose_callback, 1) + self.time = self.create_timer(self.time_period, self.timer_callback('r_3',self.r_3_pose_sub)) def r_4_callback(self,msg): if(msg==True): - self.r_4_pose_sub = self.create_subscription(Pose2D, 'r_4/target', self.r_4_pose_callback, 1) + self.time = self.create_timer(self.time_period, self.timer_callback('r_4',self.r_4_pose_sub)) def timer_callback(self, rID, content): - self.r_1_pose_final = self.create_publisher(Pose2D, rID+'/final_target', 1) self.r_1_pose_final.publish(content) def main(): From d6bf367e28d658d9c994ee8a779a7e7dba5484d7 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 13:21:57 +0530 Subject: [PATCH 06/27] Update path_node.py --- robot_software_transformers/path_node.py | 41 +++++++++++++++++------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index 2b60b24..3368404 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -2,6 +2,7 @@ from rclpy.node import Node from geometry_msgs.msg import Pose2D import functools +from std_msgs.msg import Bool def pose_equal(p1,p2): @@ -21,19 +22,19 @@ def __init__(self,num): if(num == 1): self.pose_sub.append(self.create_subscription(Pose2D, 'r_1/pose', self.r_1_pose_callback, 1)) self.pub_r_1 = self.create_publisher(Pose2D, 'r_1/target', 1) - self.pub_bool_r_1 = self.create_publisher(bool, 'r_1/bool', 1) + self.pub_bool_r_1 = self.create_publisher(Bool, 'r_1/Bool', 1) elif(num == 2): self.pose_sub.append(self.create_subscription(Pose2D, 'r_2/pose', self.r_2_pose_callback, 1)) self.pub_r_2 = self.create_publisher(Pose2D, 'r_2/target', 1) - self.pub_bool_r_2 = self.create_publisher(bool, 'r_2/bool', 1) + self.pub_bool_r_2 = self.create_publisher(Bool, 'r_2/Bool', 1) elif(num == 3): self.pose_sub.append(self.create_subscription(Pose2D, 'r_3/pose', self.r_3_pose_callback, 1)) self.pub_r_3 = self.create_publisher(Pose2D, 'r_3/target', 1) - self.pub_bool_r_3 = self.create_publisher(bool, 'r_3/bool', 1) + self.pub_bool_r_3 = self.create_publisher(Bool, 'r_3/Bool', 1) elif(num == 4): self.pose_sub.append(self.create_subscription(Pose2D, 'r_4/pose', self.r_4_pose_callback, 1)) self.pub_r_4 = self.create_publisher(Pose2D, 'r_4/target', 1) - self.pub_bool_r_4 = self.create_publisher(bool, 'r_4/bool', 1) + self.pub_bool_r_4 = self.create_publisher(Bool, 'r_4/Bool', 1) self.step = [0,0,0,0] self.path = [][] with open('path.json','r') as f: @@ -60,33 +61,49 @@ def timer_callback(self,num): self.pub_r_1.publish(self.path[self.step]['r_1']) if pose_equal(self.pose['r_1'],self.path[self.step]['r_1']): self.step[0] += 1 - self.pub_bool_r_1.publish(True) + temp = Bool() + temp.data = True + self.pub_bool_r_1.publish(temp) else: - self.pub_bool_r_1.publish(False) + temp = Bool() + temp.data = False + self.pub_bool_r_1.publish(temp) elif(num == 2): if self.step[1] Date: Sat, 25 Sep 2021 13:24:43 +0530 Subject: [PATCH 07/27] Update central_path_node.py --- .../central_path_node.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/robot_software_transformers/central_path_node.py b/robot_software_transformers/central_path_node.py index 16d2ef7..a37d42f 100644 --- a/robot_software_transformers/central_path_node.py +++ b/robot_software_transformers/central_path_node.py @@ -1,18 +1,18 @@ import rclpy from rclpy.node import Node from geometry_msgs.msg import Pose2D -from std_msgs.msg import Bool as bool - +from std_msgs.msg import Bool +import functools class CentralPathNode(Node): def __init__(self,robots): super().__init__('central_path_node') self.time_period = 1/30 #self.time = self.create_timer(time_period, self.timer_callback(num)) - self.r_1_bool_sub = self.create_subscription(bool, 'r_1/bool', self.r_1_callback, 1) - self.r_2_bool_sub = self.create_subscription(bool, 'r_2/bool', self.r_2_callback, 1) - self.r_3_bool_sub = self.create_subscription(bool, 'r_3/bool', self.r_3_callback, 1) - self.r_4_bool_sub = self.create_subscription(bool, 'r_4/bool', self.r_4_callback, 1) + self.r_1_bool_sub = self.create_subscription(Bool, 'r_1/bool', self.r_1_callback, 1) + self.r_2_bool_sub = self.create_subscription(Bool, 'r_2/bool', self.r_2_callback, 1) + self.r_3_bool_sub = self.create_subscription(Bool, 'r_3/bool', self.r_3_callback, 1) + self.r_4_bool_sub = self.create_subscription(Bool, 'r_4/bool', self.r_4_callback, 1) self.r_1_pose_sub = self.create_subscription(Pose2D, 'r_1/target', self.r_1_pose_callback, 1) self.r_2_pose_sub = self.create_subscription(Pose2D, 'r_2/target', self.r_2_pose_callback, 1) self.r_3_pose_sub = self.create_subscription(Pose2D, 'r_3/target', self.r_3_pose_callback, 1) @@ -23,24 +23,24 @@ def __init__(self,robots): self.r_4_pose_final = self.create_publisher(Pose2D, 'r_4/final_target', 1) def r_1_callback(self,msg): - if(msg==True): - self.time = self.create_timer(self.time_period, self.timer_callback('r_1',self.r_1_pose_sub)) + if(msg.data==True): + self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_1_pose_sub)) def r_2_callback(self,msg): - if(msg==True): - self.time = self.create_timer(self.time_period, self.timer_callback('r_2',self.r_2_pose_sub)) + if(msg.data==True): + self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_2_pose_sub)) def r_3_callback(self,msg): - if(msg==True): + if(msg.data==True): - self.time = self.create_timer(self.time_period, self.timer_callback('r_3',self.r_3_pose_sub)) + self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_3_pose_sub)) def r_4_callback(self,msg): - if(msg==True): + if(msg.data==True): - self.time = self.create_timer(self.time_period, self.timer_callback('r_4',self.r_4_pose_sub)) + self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_4_pose_sub)) - def timer_callback(self, rID, content): + def timer_callback(self, content): self.r_1_pose_final.publish(content) def main(): From 9277affa8110d0d5c34591bac3ae3e73c9fc11d4 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 14:23:27 +0530 Subject: [PATCH 08/27] Update Dockerfile --- Dockerfile | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/Dockerfile b/Dockerfile index 64a966c..ca19b6c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,30 +1,2 @@ -FROM ubuntu:focal -RUN apt update -y && apt install curl gnupg2 lsb-release -y -RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null -RUN apt install wget -y -RUN wget https://github.com/ros2/ros2/releases/download/release-foxy-20210902/ros2-foxy-20210902-linux-focal-amd64.tar.bz2 -WORKDIR /robot_software_transformers-main -COPY . . -RUN mkdir -p /ros2_foxy -WORKDIR /ros2_foxy -RUN tar -xf /ros2-foxy-20210902-linux-focal-amd64.tar.bz2 -RUN apt update -y -RUN apt install -y python3-rosdep -RUN rosdep init -RUN rosdep update -RUN rosdep install --from-paths /ros2_foxy/ros2-linux/share --ignore-src --rosdistro foxy -y --skip-keys "console_bridge fastcdr fastrtps osrf_testing_tools_cpp poco_vendor rmw_connextdds rti-connext-dds-5.3.1 tinyxml_vendor tinyxml2_vendor urdfdom urdfdom_headers" -RUN apt install -y libpython3-dev python3-pip -RUN pip3 install -U argcomplete -RUN apt update -RUN apt install python3-colcon-common-extensions -y -WORKDIR /robot_software_transformers-main -RUN mkdir ../src -RUN mv package.xml ../src/package.xml -RUN mv resource ../src/resource -RUN mv robot_software_transformers ../src/robot_software_transformers -RUN mv setup.cfg ../src/setup.cfg -RUN mv setup.py ../src/setup.py -RUN mv test ../src/test -RUN mv /src /robot_software_transformers-main -ENTRYPOINT /bin/bash +FROM ros2:final +COPY ./robot_software_transformers /robot_software_transformers-main/src/robot_software_transformers/robot_software_transformers From 101ba56ebc2f29544aab49def568e209b5dcac9f Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 16:14:51 +0530 Subject: [PATCH 09/27] Update path_node.py --- robot_software_transformers/path_node.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index 3368404..832f75d 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -3,6 +3,9 @@ from geometry_msgs.msg import Pose2D import functools from std_msgs.msg import Bool +from rclpy.executors import MultiThreadedExecutor +from rclpy.callback_groups import MutuallyExclusiveCallbackGroup +import json def pose_equal(p1,p2): @@ -36,8 +39,8 @@ def __init__(self,num): self.pub_r_4 = self.create_publisher(Pose2D, 'r_4/target', 1) self.pub_bool_r_4 = self.create_publisher(Bool, 'r_4/Bool', 1) self.step = [0,0,0,0] - self.path = [][] - with open('path.json','r') as f: + self.path = [] + with open('/robot_software_transformers-main/src/robot_software_transformers/robot_software_transformers/path.json','r') as f: data = json.load(f) for four_point in data: path_point = dict() @@ -45,11 +48,11 @@ def __init__(self,num): t.x = four_point['r_'+str(num)]['x'] t.y = four_point['r_'+str(num)]['y'] if four_point['r_'+str(num)]['flip']: - t.theta = 90 + t.theta = 90.0 else: - t.theta = 0 + t.theta = 0.0 path_point[num] = t - self.path[num-1].append(path_point) + self.path.append(path_point) self.pose = {'r_'+str(num):t} @@ -81,7 +84,7 @@ def timer_callback(self,num): temp.data = False self.pub_bool_r_1.publish(temp) elif(num == 3): - if self.step[2] Date: Sat, 25 Sep 2021 16:21:52 +0530 Subject: [PATCH 10/27] Update path_node.py --- robot_software_transformers/path_node.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index 832f75d..6722c0f 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -38,7 +38,7 @@ def __init__(self,num): self.pose_sub.append(self.create_subscription(Pose2D, 'r_4/pose', self.r_4_pose_callback, 1)) self.pub_r_4 = self.create_publisher(Pose2D, 'r_4/target', 1) self.pub_bool_r_4 = self.create_publisher(Bool, 'r_4/Bool', 1) - self.step = [0,0,0,0] + self.step = 0 self.path = [] with open('/robot_software_transformers-main/src/robot_software_transformers/robot_software_transformers/path.json','r') as f: data = json.load(f) @@ -63,7 +63,7 @@ def timer_callback(self,num): if self.step[0] Date: Sat, 25 Sep 2021 16:49:14 +0530 Subject: [PATCH 11/27] Update path_node.py --- robot_software_transformers/path_node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index 6722c0f..9855a52 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -60,7 +60,7 @@ def __init__(self,num): def timer_callback(self,num): if(num == 1): - if self.step[0] Date: Sat, 25 Sep 2021 21:46:15 +0530 Subject: [PATCH 12/27] Update path_node.py --- robot_software_transformers/path_node.py | 56 +++++++++++++----------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index 9855a52..cbe4584 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -8,17 +8,17 @@ import json + def pose_equal(p1,p2): isEqual = (abs(p1.theta-p2.theta)<5) distance = ((p1.x-p2.x)**2 + (p1.y-p2.y)**2)**0.5 isEqual = isEqual and (distance<15) - return isEqual + return distance<15 class PathNode(Node): def __init__(self,num): - super().__init__('path_node_'+str(num)) - self.group = MutuallyExclusiveCallbackGroup() + super().__init__('path_node'+str(num)) time_period = 1/30 self.time = self.create_timer(time_period, functools.partial(self.timer_callback,num=num)) self.pose_sub = [] @@ -42,25 +42,30 @@ def __init__(self,num): self.path = [] with open('/robot_software_transformers-main/src/robot_software_transformers/robot_software_transformers/path.json','r') as f: data = json.load(f) - for four_point in data: - path_point = dict() - t = Pose2D() - t.x = four_point['r_'+str(num)]['x'] - t.y = four_point['r_'+str(num)]['y'] - if four_point['r_'+str(num)]['flip']: - t.theta = 90.0 - else: - t.theta = 0.0 - path_point[num] = t - self.path.append(path_point) - self.pose = {'r_'+str(num):t} + for four_point in data: + path_point = dict() + for robot_id in four_point: + t = Pose2D() + t.x = four_point[robot_id]['x'] + t.y = four_point[robot_id]['y'] + if four_point[robot_id]['flip']: + t.theta = 90.0 + else: + t.theta = 0.0 + path_point[robot_id] = t + self.path.append(path_point) + t = Pose2D() + t.x = 12.0 + t.y = 30.0 + t.theta = 150.0 + self.pose = {'r_'+str(num):t} #Example path: [{'r_1':Pose2D(0,0,0),'r_2':Pose2D(0,0,0)},{'r_1':Pose2D(0,0,90),'r_2':Pose2D(0,0,0)}] def timer_callback(self,num): if(num == 1): - if self.step Date: Sat, 25 Sep 2021 21:51:40 +0530 Subject: [PATCH 13/27] Update camera_node.py --- robot_software_transformers/camera_node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robot_software_transformers/camera_node.py b/robot_software_transformers/camera_node.py index 151efa2..5d99996 100644 --- a/robot_software_transformers/camera_node.py +++ b/robot_software_transformers/camera_node.py @@ -21,7 +21,7 @@ def __init__(self, camera_url, calib_file, map_file, cameraID): self.pubs.append(self.create_publisher(Pose2D,"c_"+str(self.cameraID) +"/r_"+ str(i+1), 1)) - timer_period = 0.03 + timer_period = 1/30 self.timer = self.create_timer(timer_period, self.timer_callback) From 69bc126ae1e3d812a945ba231007ae23a76621fa Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 22:58:58 +0530 Subject: [PATCH 14/27] Update camera_node.py --- robot_software_transformers/camera_node.py | 41 ++++++++++------------ 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/robot_software_transformers/camera_node.py b/robot_software_transformers/camera_node.py index 5d99996..ec7ba27 100644 --- a/robot_software_transformers/camera_node.py +++ b/robot_software_transformers/camera_node.py @@ -9,42 +9,37 @@ class CameraNode(Node): def __init__(self, camera_url, calib_file, map_file, cameraID): - super().__init__('c_'+str(cameraID)) + super().__init__('c_'+str(cameraID)) # making a node named c_1/c_2..... self.cameraID = cameraID self.camera = Camera(camera_url) - self.camera._load(calib_file) - self.camera.load_map(map_file) + self.camera._load(calib_file) # loading the caliberation file into the camera object of camera.py + self.camera.load_map(map_file) # loading the map file into the camera object of camera.py self.pubs = [] - self.camera.video.start() + self.camera.video.start() # starting the video caputure - for i in range(4): - self.pubs.append(self.create_publisher(Pose2D,"c_"+str(self.cameraID) +"/r_"+ str(i+1), 1)) + for i in range(4): # 4 because of 4 robots + self.pubs.append(self.create_publisher(Pose2D,"c_"+str(self.cameraID) +"/r_"+ str(i+1), 1)) # making topics of /r_1/c_1, /r_1/c_2... timer_period = 1/30 - self.timer = self.create_timer(timer_period, self.timer_callback) + self.timer = self.create_timer(timer_period, self.timer_callback) # creating a timer object which will call timer_callback in 30 Hz def timer_callback(self): - - - poses,ids = self.camera.cord_rel_to_marker(self.camera.get_frame(),11.8) - msg= Pose2D() - for pose,id in zip(poses,ids): - id=id-201 - msg.x=pose[1][0][0] - msg.y= pose[1][1][0] - msg.theta= pose[0][2][0] - if id[0]<4: + poses,ids = self.camera.cord_rel_to_marker(self.camera.get_frame(),11.8) # passing camera's frame [self.camera.get_frame()] and the size of aruco markers [11.8] msg= Pose2D() + for pose,id in zip(poses,ids): # pose is the pose of the robot and id is the ID of the robot + id=id-201 # because aruco markers start with 200 for our specifications + msg.x=pose[1][0][0] # getting x coordinate + msg.y= pose[1][1][0] # getting y coordinate + msg.theta= pose[0][2][0] # getting theta + if id[0]<4: # checking if aruco markers are 201/202/203/204 self.pubs[id[0]].publish(msg) def main(): - # will have to initialize the camera library ? - # Initialize the rclpy library - print(sys.argv) - rclpy.init() - camera_node = CameraNode(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4]) - rclpy.spin(camera_node) + print(sys.argv) # printing arguments + rclpy.init() # init the rclpy + camera_node = CameraNode(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4]) # making object of CameraNode + rclpy.spin(camera_node) # spinning the object rclpy.shutdown() # Shutdown the ROS client library for Python if __name__ == '__main__': From b5b43ba617444b9539ecbc7562f0320771158c6e Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 23:17:50 +0530 Subject: [PATCH 15/27] Update central_node.py --- robot_software_transformers/central_node.py | 54 ++++++++++----------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/robot_software_transformers/central_node.py b/robot_software_transformers/central_node.py index aa9002b..cbf8912 100644 --- a/robot_software_transformers/central_node.py +++ b/robot_software_transformers/central_node.py @@ -14,20 +14,20 @@ def pose_tolerance(p1,p2): return isEqual class CentralNode(Node): - def __init__(self, n_camera, robot_id): - super().__init__('r_'+str(robot_id)) - self.group = MutuallyExclusiveCallbackGroup() - self.publisher = self.create_publisher(Pose2D, 'r_'+str(robot_id)+'/pose', 1) + def __init__(self, n_camera, robot_id): # passing the number of cams and robots + super().__init__('r_'+str(robot_id)) # making robot nodes like r_1/r_2..... + self.group = MutuallyExclusiveCallbackGroup() # preventing race conditions + self.publisher = self.create_publisher(Pose2D, 'r_'+str(robot_id)+'/pose', 1) # create pub with topic r_1/pose, r_2/pose... time_period = 1/30 - self.timer = self.create_timer(time_period, self.pub_callback, callback_group=self.group) + self.timer = self.create_timer(time_period, self.pub_callback, callback_group=self.group) # create timer to call publisher_callback and callback group will define that the code belongs to the mutually exclusive callgroups self.n_camera = n_camera self.robot_id = robot_id self.subs = [] self.camera_pose = [] self.camera_available = dict() for i in range(n_camera): - self.subs.append(self.create_subscription(Pose2D, 'c_'+str(i+1)+'/r_'+str(robot_id), functools.partial(self.subs_callback,camera_id = i), 1, callback_group=self.group)) - self.camera_pose.append([]) + self.subs.append(self.create_subscription(Pose2D, 'c_'+str(i+1)+'/r_'+str(robot_id), functools.partial(self.subs_callback,camera_id = i), 1, callback_group=self.group)) # making robot nodes like r_1/r_2..... and functools.partial passes params + self.camera_pose.append([]) # appending empty list to cam_pose list self.camera_available[i] = False self.old_pose = None self.old_poses_x = [] @@ -35,20 +35,20 @@ def __init__(self, n_camera, robot_id): self.old_poses_theta = [] def subs_callback(self, msg, camera_id): - self.camera_pose[camera_id].append(msg) - self.camera_available[camera_id] = True + self.camera_pose[camera_id].append(msg) # appending msg recieved from the topic in the list + self.camera_available[camera_id] = True # and setting bool to true def pub_callback(self): pose_holder = Pose2D() - pose_holder.x = 0.0 - pose_holder.y = 0.0 - pose_holder.theta = 0.0 - cnt = 0 - camera_id = -1 - for i in range(self.n_camera): - if self.camera_available[i]: + pose_holder.x = 0.0 # init with 0 + pose_holder.y = 0.0 # init with 0 + pose_holder.theta = 0.0 # init with 0 + cnt = 0 # init with 0 + camera_id = -1 # init with -1 + for i in range(self.n_camera): # looping through number of cams + if self.camera_available[i]: # check if cam is available camera_id = i - break + break # temp break if camera_id==-1: return for i in range(self.n_camera): @@ -93,23 +93,23 @@ def pub_callback(self): self.camera_pose[i] = [] def main(): - n_camera = int(sys.argv[1]) - n_robots = int(sys.argv[2]) + n_camera = int(sys.argv[1]) # getting the number of cameras + n_robots = int(sys.argv[2]) # getting the number of robots print(n_camera, n_robots) - rclpy.init() + rclpy.init() # init the rclpy nodes = [] try: - executor = MultiThreadedExecutor(4) + executor = MultiThreadedExecutor(4) # init a 4 multithreadedexecutor for i in range(n_robots): - cnode = CentralNode(n_camera, i+1) - nodes.append(cnode) - executor.add_node(cnode) + cnode = CentralNode(n_camera, i+1) # making object of centralnode + nodes.append(cnode) # need to append check finally for the need + executor.add_node(cnode) # add the node in the executor object so that when executor does work, all the nodes in executor will spin try: - executor.spin() + executor.spin() # spinning the exec object finally: - executor.shutdown() + executor.shutdown() # shutting down the exec object for i in range(n_robots): - nodes[i].destroy_node() + nodes[i].destroy_node() # destorying the nodes before the final shutdown of rclpy finally: rclpy.shutdown() From 8b58d08976ff3ec0c17b3c65c5751618b81446b9 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 23:44:55 +0530 Subject: [PATCH 16/27] Update central_node.py --- robot_software_transformers/central_node.py | 34 ++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/robot_software_transformers/central_node.py b/robot_software_transformers/central_node.py index cbf8912..dd99c05 100644 --- a/robot_software_transformers/central_node.py +++ b/robot_software_transformers/central_node.py @@ -49,24 +49,24 @@ def pub_callback(self): if self.camera_available[i]: # check if cam is available camera_id = i break # temp break - if camera_id==-1: + if camera_id==-1: # if no camera then just return return for i in range(self.n_camera): - self.camera_available[i] = False - if len(self.camera_pose[camera_id]) > 0: - if self.old_pose is None: + self.camera_available[i] = False # reason to make this false? redundant? + if len(self.camera_pose[camera_id]) > 0: #if list not empty means cam exists + if self.old_pose is None: # if just init meaning no old pose for pose in self.camera_pose[camera_id]: - pose_holder.x += pose.x - pose_holder.y += pose.y - pose_holder.theta += pose.theta - cnt = cnt + 1 + pose_holder.x += pose.x # init x coordinate (adding x to 0 basically) + pose_holder.y += pose.y # init y coordinate (adding x to 0 basically) + pose_holder.theta += pose.theta # init theta (adding x to 0 basically) + cnt = cnt + 1 # number of block crossed + 1 else: for pose in self.camera_pose[camera_id]: - if pose_tolerance(pose,self.old_pose): - pose_holder.x += pose.x - pose_holder.y += pose.y - pose_holder.theta += pose.theta - cnt = cnt + 1 + if pose_tolerance(pose,self.old_pose): # check for tolerance (redundant hi hai btw) + pose_holder.x += pose.x # adding x to old x + pose_holder.y += pose.y # adding y to old y + pose_holder.theta += pose.theta # adding theta to old theta + cnt = cnt + 1 # number of block crossed + 1 if cnt>0: pose_holder.x = pose_holder.x/cnt pose_holder.y = pose_holder.y/cnt @@ -85,12 +85,12 @@ def pub_callback(self): self.old_poses_y = self.old_poses_y[max(-1*len(self.old_poses_y),-5):] self.old_poses_theta = self.old_poses_theta[max(-1*len(self.old_poses_theta),-5):] pose_holder = Pose2D() - pose_holder.x = mode(self.old_poses_x) - pose_holder.y = mode(self.old_poses_y) - pose_holder.theta = mode(self.old_poses_theta) + pose_holder.x = mode(self.old_poses_x) # taking mode of old x poses and putting in x + pose_holder.y = mode(self.old_poses_y) # taking mode of old y poses and putting in y + pose_holder.theta = mode(self.old_poses_theta) # taking mode of old thetas and putting in theta self.publisher.publish(pose_holder) for i in range(self.n_camera): - self.camera_pose[i] = [] + self.camera_pose[i] = [] # init a 2D list def main(): n_camera = int(sys.argv[1]) # getting the number of cameras From 79a8e4db3f1d6dc6fe9d4c09bcd1bfa35e1c08fc Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 23:49:43 +0530 Subject: [PATCH 17/27] Update central_path_node.py --- .../central_path_node.py | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/robot_software_transformers/central_path_node.py b/robot_software_transformers/central_path_node.py index a37d42f..27a36c2 100644 --- a/robot_software_transformers/central_path_node.py +++ b/robot_software_transformers/central_path_node.py @@ -6,9 +6,9 @@ class CentralPathNode(Node): def __init__(self,robots): - super().__init__('central_path_node') + super().__init__('central_path_node') # making node called cpn self.time_period = 1/30 - #self.time = self.create_timer(time_period, self.timer_callback(num)) + """subscribing to all bool topics and target topics""" self.r_1_bool_sub = self.create_subscription(Bool, 'r_1/bool', self.r_1_callback, 1) self.r_2_bool_sub = self.create_subscription(Bool, 'r_2/bool', self.r_2_callback, 1) self.r_3_bool_sub = self.create_subscription(Bool, 'r_3/bool', self.r_3_callback, 1) @@ -17,6 +17,7 @@ def __init__(self,robots): self.r_2_pose_sub = self.create_subscription(Pose2D, 'r_2/target', self.r_2_pose_callback, 1) self.r_3_pose_sub = self.create_subscription(Pose2D, 'r_3/target', self.r_3_pose_callback, 1) self.r_4_pose_sub = self.create_subscription(Pose2D, 'r_4/target', self.r_4_pose_callback, 1) + """making a publisher to publish in final_target topics""" self.r_1_pose_final = self.create_publisher(Pose2D, 'r_1/final_target', 1) self.r_2_pose_final = self.create_publisher(Pose2D, 'r_2/final_target', 1) self.r_3_pose_final = self.create_publisher(Pose2D, 'r_3/final_target', 1) @@ -24,30 +25,33 @@ def __init__(self,robots): def r_1_callback(self,msg): if(msg.data==True): + """if the bool data is true meaning bot1 is active hence will work or else wont""" self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_1_pose_sub)) def r_2_callback(self,msg): if(msg.data==True): + """if the bool data is true meaning bot2 is active hence will work or else wont""" self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_2_pose_sub)) def r_3_callback(self,msg): if(msg.data==True): - + """if the bool data is true meaning bot3 is active hence will work or else wont""" self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_3_pose_sub)) def r_4_callback(self,msg): if(msg.data==True): - + """if the bool data is true meaning bot4 is active hence will work or else wont""" self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_4_pose_sub)) def timer_callback(self, content): + """This function will simply recieve the Pose2D object as content and then publish it in new topic final_target""" self.r_1_pose_final.publish(content) def main(): - rclpy.init() - central_path_node = CentralPathNode() - rclpy.spin(central_path_node) - rclpy.shutdown() + rclpy.init() # init rclpy + central_path_node = CentralPathNode() # init object of CentralPathNode + rclpy.spin(central_path_node) # spin the object + rclpy.shutdown() # shutdown if __name__ == '__main__': main() From 5cd3a890c302aa85584b2aef9f3736690360fad0 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sat, 25 Sep 2021 23:52:10 +0530 Subject: [PATCH 18/27] Update central_node.py --- robot_software_transformers/central_node.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/robot_software_transformers/central_node.py b/robot_software_transformers/central_node.py index dd99c05..5d57364 100644 --- a/robot_software_transformers/central_node.py +++ b/robot_software_transformers/central_node.py @@ -68,6 +68,10 @@ def pub_callback(self): pose_holder.theta += pose.theta # adding theta to old theta cnt = cnt + 1 # number of block crossed + 1 if cnt>0: + """ + Some bullshitery bhaiya did to implement update rejection which basically rejects any value which might be very large or very small + For example all values are 10,9,11,12,10 anfd suddenly there comes a value 100 or -70 or something then this code will reject it + """ pose_holder.x = pose_holder.x/cnt pose_holder.y = pose_holder.y/cnt pose_holder.theta = pose_holder.theta/cnt From 53e046035ec5057b2b640dcfafa9f3ced052136d Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sun, 26 Sep 2021 00:36:04 +0530 Subject: [PATCH 19/27] Update path_node.py --- robot_software_transformers/path_node.py | 71 ++++++++++++------------ 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index cbe4584..fdbcbfe 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -10,50 +10,53 @@ def pose_equal(p1,p2): + """check if 2 poses are equal using sqrt(a^2+b^2) //formula ka naam kya ha bc""" isEqual = (abs(p1.theta-p2.theta)<5) distance = ((p1.x-p2.x)**2 + (p1.y-p2.y)**2)**0.5 isEqual = isEqual and (distance<15) - return distance<15 + return distance<15 # returns a true if dist < 15 or a false class PathNode(Node): def __init__(self,num): - super().__init__('path_node'+str(num)) + super().__init__('path_node'+str(num)) # making multiple nodes with different names since multiple nodes cant have same name time_period = 1/30 - self.time = self.create_timer(time_period, functools.partial(self.timer_callback,num=num)) - self.pose_sub = [] + self.time = self.create_timer(time_period, functools.partial(self.timer_callback,num=num)) # call the timer_callback in 30Hz + self.pose_sub = [] # list to store the subbed objects if(num == 1): - self.pose_sub.append(self.create_subscription(Pose2D, 'r_1/pose', self.r_1_pose_callback, 1)) - self.pub_r_1 = self.create_publisher(Pose2D, 'r_1/target', 1) - self.pub_bool_r_1 = self.create_publisher(Bool, 'r_1/Bool', 1) + self.pose_sub.append(self.create_subscription(Pose2D, 'r_1/pose', self.r_1_pose_callback, 1)) # subb to r_1/pose + self.pub_r_1 = self.create_publisher(Pose2D, 'r_1/target', 1) # create publisher of r_1/target + self.pub_bool_r_1 = self.create_publisher(Bool, 'r_1/Bool', 1) # create publisher of r_1/bool elif(num == 2): - self.pose_sub.append(self.create_subscription(Pose2D, 'r_2/pose', self.r_2_pose_callback, 1)) - self.pub_r_2 = self.create_publisher(Pose2D, 'r_2/target', 1) - self.pub_bool_r_2 = self.create_publisher(Bool, 'r_2/Bool', 1) + self.pose_sub.append(self.create_subscription(Pose2D, 'r_2/pose', self.r_2_pose_callback, 1)) # subb to r_2/pose + self.pub_r_2 = self.create_publisher(Pose2D, 'r_2/target', 1) # create publisher of r_2/target + self.pub_bool_r_2 = self.create_publisher(Bool, 'r_2/Bool', 1) # create publisher of r_2/bool elif(num == 3): - self.pose_sub.append(self.create_subscription(Pose2D, 'r_3/pose', self.r_3_pose_callback, 1)) - self.pub_r_3 = self.create_publisher(Pose2D, 'r_3/target', 1) - self.pub_bool_r_3 = self.create_publisher(Bool, 'r_3/Bool', 1) + self.pose_sub.append(self.create_subscription(Pose2D, 'r_3/pose', self.r_3_pose_callback, 1)) # subb to r_3/pose + self.pub_r_3 = self.create_publisher(Pose2D, 'r_3/target', 1) # create publisher of r_3/target + self.pub_bool_r_3 = self.create_publisher(Bool, 'r_3/Bool', 1) # create publisher of r_3/bool elif(num == 4): - self.pose_sub.append(self.create_subscription(Pose2D, 'r_4/pose', self.r_4_pose_callback, 1)) - self.pub_r_4 = self.create_publisher(Pose2D, 'r_4/target', 1) - self.pub_bool_r_4 = self.create_publisher(Bool, 'r_4/Bool', 1) - self.step = 0 - self.path = [] + self.pose_sub.append(self.create_subscription(Pose2D, 'r_4/pose', self.r_4_pose_callback, 1)) # subb to r_4/pose + self.pub_r_4 = self.create_publisher(Pose2D, 'r_4/target', 1) # create publisher of r_4/target + self.pub_bool_r_4 = self.create_publisher(Bool, 'r_4/Bool', 1) # create publisher of r_4/bool + self.step = 0 # init steps with 0 + self.path = [] # empty list to store path with open('/robot_software_transformers-main/src/robot_software_transformers/robot_software_transformers/path.json','r') as f: - data = json.load(f) + data = json.load(f) # load the predefined path in data for four_point in data: + """parsing of data in the json""" path_point = dict() for robot_id in four_point: t = Pose2D() - t.x = four_point[robot_id]['x'] - t.y = four_point[robot_id]['y'] - if four_point[robot_id]['flip']: + t.x = four_point[robot_id]['x'] # assign x coordinate + t.y = four_point[robot_id]['y'] # assign y coordinate + if four_point[robot_id]['flip']: # for some reason we using theta with the flip bit because the angle we are calculating using some forumala //naam iska bhi bhul gaya bc t.theta = 90.0 else: t.theta = 0.0 - path_point[robot_id] = t - self.path.append(path_point) + path_point[robot_id] = t # place the t object with the values in the dictionary + self.path.append(path_point) # append the dictionary in the list + """initialize some values to t""" t = Pose2D() t.x = 12.0 t.y = 30.0 @@ -128,22 +131,22 @@ def r_4_pose_callback(self, msg): def main(): - rclpy.init() - nodes = [] + rclpy.init() # init rclpy + nodes = [] # make a list to store nodes try: - executor = MultiThreadedExecutor(4) + executor = MultiThreadedExecutor(4) # 4 multithreaded executors for i in range(4): - path_node = PathNode(i+1) - nodes.append(path_node) - executor.add_node(path_node) + path_node = PathNode(i+1) # objects of pathnode + nodes.append(path_node) # append the objects in list + executor.add_node(path_node) # add object as node in executor try: - executor.spin() + executor.spin() # spin the executor finally: - executor.shutdown() + executor.shutdown() # shutdown the executor for i in range(4): - nodes[i].destroy_node() + nodes[i].destroy_node() # destory the nodes finally: - rclpy.shutdown() + rclpy.shutdown() # shutdown rclpy if __name__ == '__main__': main() From 1fded053b405bae3cd9d86a06db0802ca6035d80 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sun, 26 Sep 2021 12:16:36 +0530 Subject: [PATCH 20/27] Update setup.py --- setup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index a589ba8..794d3d9 100644 --- a/setup.py +++ b/setup.py @@ -13,8 +13,8 @@ ], install_requires=['setuptools'], zip_safe=True, - maintainer='dev', - maintainer_email='dev19034@iiitd.ac.in', + maintainer='Dev Rajput, Arpit Nandi', + maintainer_email='dev19034@iiitd.ac.in, arpit20179@iiitd.ac.in', description='TODO: Package description', license='TODO: License declaration', tests_require=['pytest'], @@ -24,6 +24,8 @@ 'camera_node = robot_software_transformers.camera_node:main', 'socket_node = robot_software_transformers.socket_node:main', 'path_node = robot_software_transformers.path_node:main', + 'central_path_node = robot_software_transformers.central_path_node:main', + ], }, ) From 37d421bcd2d045ec8ee70b60ffec41edd8032871 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sun, 26 Sep 2021 12:23:22 +0530 Subject: [PATCH 21/27] Update central_path_node.py --- robot_software_transformers/central_path_node.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/robot_software_transformers/central_path_node.py b/robot_software_transformers/central_path_node.py index 27a36c2..dad62b9 100644 --- a/robot_software_transformers/central_path_node.py +++ b/robot_software_transformers/central_path_node.py @@ -5,7 +5,7 @@ import functools class CentralPathNode(Node): - def __init__(self,robots): + def __init__(self): super().__init__('central_path_node') # making node called cpn self.time_period = 1/30 """subscribing to all bool topics and target topics""" @@ -42,7 +42,19 @@ def r_4_callback(self,msg): if(msg.data==True): """if the bool data is true meaning bot4 is active hence will work or else wont""" self.time = self.create_timer(self.time_period, functools.partial(self.timer_callback,content=self.r_4_pose_sub)) - + + def r_1_pose_callback(self,msg): + self.r_1_pose_sub = msg + + def r_2_pose_callback(self,msg): + self.r_2_pose_sub = msg + + def r_3_pose_callback(self,msg): + self.r_3_pose_sub = msg + + def r_4_pose_callback(self,msg): + self.r_4_pose_sub = msg + def timer_callback(self, content): """This function will simply recieve the Pose2D object as content and then publish it in new topic final_target""" self.r_1_pose_final.publish(content) From a7b4dce5aba4b01445c8add3eab5de0fe590e898 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sun, 26 Sep 2021 12:25:11 +0530 Subject: [PATCH 22/27] Update Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ca19b6c..b0fc646 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,2 +1,2 @@ FROM ros2:final -COPY ./robot_software_transformers /robot_software_transformers-main/src/robot_software_transformers/robot_software_transformers +COPY . /robot_software_transformers-main/src/robot_software_transformers From 673d9caf369c424b210814c31569719afcac53f5 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sun, 26 Sep 2021 12:34:45 +0530 Subject: [PATCH 23/27] Update central_path_node.py --- robot_software_transformers/central_path_node.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/robot_software_transformers/central_path_node.py b/robot_software_transformers/central_path_node.py index dad62b9..2c76cea 100644 --- a/robot_software_transformers/central_path_node.py +++ b/robot_software_transformers/central_path_node.py @@ -9,10 +9,10 @@ def __init__(self): super().__init__('central_path_node') # making node called cpn self.time_period = 1/30 """subscribing to all bool topics and target topics""" - self.r_1_bool_sub = self.create_subscription(Bool, 'r_1/bool', self.r_1_callback, 1) - self.r_2_bool_sub = self.create_subscription(Bool, 'r_2/bool', self.r_2_callback, 1) - self.r_3_bool_sub = self.create_subscription(Bool, 'r_3/bool', self.r_3_callback, 1) - self.r_4_bool_sub = self.create_subscription(Bool, 'r_4/bool', self.r_4_callback, 1) + self.r_1_bool_sub = self.create_subscription(Bool, 'r_1/Bool', self.r_1_callback, 1) + self.r_2_bool_sub = self.create_subscription(Bool, 'r_2/Bool', self.r_2_callback, 1) + self.r_3_bool_sub = self.create_subscription(Bool, 'r_3/Bool', self.r_3_callback, 1) + self.r_4_bool_sub = self.create_subscription(Bool, 'r_4/Bool', self.r_4_callback, 1) self.r_1_pose_sub = self.create_subscription(Pose2D, 'r_1/target', self.r_1_pose_callback, 1) self.r_2_pose_sub = self.create_subscription(Pose2D, 'r_2/target', self.r_2_pose_callback, 1) self.r_3_pose_sub = self.create_subscription(Pose2D, 'r_3/target', self.r_3_pose_callback, 1) From 26f29c50524ed29bd9cbe5fb175a775675dc6523 Mon Sep 17 00:00:00 2001 From: AlienX <64488123+AlienX2001@users.noreply.github.com> Date: Sun, 26 Sep 2021 12:44:59 +0530 Subject: [PATCH 24/27] Update path_node.py --- robot_software_transformers/path_node.py | 66 +++++++++++++++--------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/robot_software_transformers/path_node.py b/robot_software_transformers/path_node.py index fdbcbfe..51e6561 100644 --- a/robot_software_transformers/path_node.py +++ b/robot_software_transformers/path_node.py @@ -72,49 +72,65 @@ def timer_callback(self,num): self.pub_r_1.publish(self.path[self.step]['r_1']) if pose_equal(self.pose['r_1'],self.path[self.step]['r_1']): self.step += 1 - temp = Bool() - temp.data = True - self.pub_bool_r_1.publish(temp) + list_bool[0].data = True + self.pub_bool_r_1.publish(list_bool[0]) + list_bool[1].data = False + self.pub_bool_r_2.publish(list_bool[1]) + list_bool[2].data = False + self.pub_bool_r_3.publish(list_bool[2]) + list_bool[3].data = False + self.pub_bool_r_4.publish(list_bool[3]) else: - temp = Bool() - temp.data = False - self.pub_bool_r_1.publish(temp) + list_bool[0].data = False + self.pub_bool_r_1.publish(list_bool[0]) elif(num == 2): - if self.step Date: Mon, 27 Sep 2021 11:58:00 +0530 Subject: [PATCH 25/27] Add files via upload --- robot_software_transformers/path.json | 2247 ++++++++++++++++++++++++- 1 file changed, 2246 insertions(+), 1 deletion(-) diff --git a/robot_software_transformers/path.json b/robot_software_transformers/path.json index 58bc51a..20b8057 100644 --- a/robot_software_transformers/path.json +++ b/robot_software_transformers/path.json @@ -1 +1,2246 @@ -[{"r_1": {"x": 185.0, "y": 150.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 185.0, "y": 130.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 185.0, "y": 110.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 185.0, "y": 90.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 185.0, "y": 70.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 185.0, "y": 50.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 185.0, "y": 30.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 185.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 205.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 225.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 245.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 265.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 285.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 300.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 300.0, "y": 20.0, "flip": true}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}, {"r_1": {"x": 300.0, "y": 20.0, "flip": false}, "r_2": {"x": 2.0, "y": 2.0, "flip": false}, "r_3": {"x": 3.0, "y": 3.0, "flip": false}, "r_4": {"x": 4.0, "y": 4.0, "flip": false}}] \ No newline at end of file +[ + { + "r_1": { + "x": 135.0, + "y": 150.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 125.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 100.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 75.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 50.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 25.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 110.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 85.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 60.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 35.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 20.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 45.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 70.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 95.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 120.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 45.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 70.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 95.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 120.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 145.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 150.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 150.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 125.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 100.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 75.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 50.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 25.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 125.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 100.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 75.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 50.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 25.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 20.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 45.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 70.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 95.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 120.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 145.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 37.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 62.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 87.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 112.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 137.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 150.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 160.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 135.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 110.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 85.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 60.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 35.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 190.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 215.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 240.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 265.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 290.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 300.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 275.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 250.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 225.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 200.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 175.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 35.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 60.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 85.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 110.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 135.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 160.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 160.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 135.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 110.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 85.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 60.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 35.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 160.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 135.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 110.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 85.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 60.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 35.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 24.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 49.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 74.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 99.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 124.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 149.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 174.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 45.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 70.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 95.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 120.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 145.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 160.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + } +] \ No newline at end of file From 7dd167e3a8a0f69633c6ccf49d488eb50fadb71e Mon Sep 17 00:00:00 2001 From: Dev Rajput Date: Mon, 27 Sep 2021 11:58:24 +0530 Subject: [PATCH 26/27] Change path From 8a0ec96696848651ea7ca4f0653d31dd470a668f Mon Sep 17 00:00:00 2001 From: Dev Rajput Date: Mon, 27 Sep 2021 12:08:05 +0530 Subject: [PATCH 27/27] Add individual paths --- robot_software_transformers/r1path.json | 530 ++++++++++++++++++++ robot_software_transformers/r2path.json | 574 ++++++++++++++++++++++ robot_software_transformers/r3path.json | 618 ++++++++++++++++++++++++ robot_software_transformers/r4path.json | 618 ++++++++++++++++++++++++ 4 files changed, 2340 insertions(+) create mode 100644 robot_software_transformers/r1path.json create mode 100644 robot_software_transformers/r2path.json create mode 100644 robot_software_transformers/r3path.json create mode 100644 robot_software_transformers/r4path.json diff --git a/robot_software_transformers/r1path.json b/robot_software_transformers/r1path.json new file mode 100644 index 0000000..b3c007b --- /dev/null +++ b/robot_software_transformers/r1path.json @@ -0,0 +1,530 @@ +[ + { + "r_1": { + "x": 135.0, + "y": 150.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 125.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 100.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 75.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 50.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 25.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 110.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 85.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 60.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 35.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 20.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 45.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 70.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 95.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 120.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 20.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 45.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 70.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 95.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 120.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 145.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 135.0, + "y": 150.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + } +] diff --git a/robot_software_transformers/r2path.json b/robot_software_transformers/r2path.json new file mode 100644 index 0000000..5e760c7 --- /dev/null +++ b/robot_software_transformers/r2path.json @@ -0,0 +1,574 @@ +[ + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 150.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 125.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 100.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 75.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 50.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 25.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 125.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 100.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 75.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 50.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 25.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 20.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 45.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 70.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 95.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 120.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 145.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 12.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 37.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 62.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 87.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 112.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 137.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 150.0, + "y": 150.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + } +] diff --git a/robot_software_transformers/r3path.json b/robot_software_transformers/r3path.json new file mode 100644 index 0000000..ec643b3 --- /dev/null +++ b/robot_software_transformers/r3path.json @@ -0,0 +1,618 @@ +[ + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 160.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 135.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 110.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 85.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 60.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 35.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 190.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 215.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 240.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 265.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 290.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 300.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 275.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 250.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 225.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 200.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 175.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 10.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 35.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 60.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 85.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 110.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 135.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 160.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 165.0, + "y": 160.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + } +] diff --git a/robot_software_transformers/r4path.json b/robot_software_transformers/r4path.json new file mode 100644 index 0000000..e2facc1 --- /dev/null +++ b/robot_software_transformers/r4path.json @@ -0,0 +1,618 @@ +[ + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 160.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 135.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 110.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 85.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 60.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 35.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 160.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 135.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 110.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 85.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 60.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 35.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 24.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 49.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 74.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 99.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 124.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 149.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 174.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 20.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 45.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 70.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 95.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 120.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 145.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 185.0, + "y": 160.0, + "flip": false + } + }, + { + "r_1": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_2": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_3": { + "x": 0.0, + "y": 0.0, + "flip": false + }, + "r_4": { + "x": 0.0, + "y": 0.0, + "flip": false + } + } +] \ No newline at end of file