Skip to content

Commit

Permalink
Merge pull request #7 from FurkanEdizkan/main
Browse files Browse the repository at this point in the history
Code updates
  • Loading branch information
FurkanEdizkan authored May 23, 2023
2 parents a098305 + 6d3e1e5 commit d9932e6
Show file tree
Hide file tree
Showing 13 changed files with 424 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<arg name="gui" default="false" doc="Start Gazebo GUI"/>
<arg name="paused" default="false" doc="Start Gazebo paused"/>
<!-- <arg name="world_name" default="worlds/empty.world" doc="Gazebo world file"/>-->
<arg name="world_name" default="$(find mobile_manipulator_moveit_config)/world/ifarlab_value3s_v4.world"/>
<arg name="world_name" default="$(find mobile_manipulator_moveit_config)/world/ifarlab_value3s_v5.world"/>
<arg name="world_pose" default="-x 0 -y 0 -z 0.17 -R 0 -P 0 -Y 0" doc="Pose to spawn the robot at"/>
<arg name="initial_joint_positions" default=" -J joint1 0 -J joint2 -0.4 -J joint3 -1.65 -J joint4 0 -J joint5 -1.9 -J joint6 0" doc="Initial joint configuration of the robot"/>

Expand Down
6 changes: 5 additions & 1 deletion mobile_manipulator/srvt_moveit/launch/start_system.launch
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@
<node name="manipulator_move" pkg="sir_robot_ros_interface" type="KawasakiRobotTestForLinux_Valu3s_ino_2_safetyStop"/>
<node name="joint_publisher" pkg="sir_robot_ros_interface" type="KawasakiRobotJointPublisher"/>
<node name="kawasaki_kinematics_tf" pkg="sir_robot_ros_interface" type="kawasaki_kinematics_tf"/>
<!-- <include file="$(find mobile_manipulator_description)/launch/gazebo_w_description.launch"/> -->
<node name="digital_twin_odt" pkg="valu3s_tools" type="digital_twin_odt.py"/>
<node name="digital_twin_odt_dist" pkg="valu3s_tools" type="odtChangeSize"/>
<node name="digital_twin_move_robot" pkg="valu3s_tools" type="move_robot.py"/>
<node name="ip_cam_to_ros" pkg="valu3s_tools" type="ip_cam_to_ros.py"/>
<include file="$(find mobile_manipulator_description)/launch/gazebo_w_description.launch"/>


</launch>
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ def __init__(self, service_name):
rospy.Subscriber("emg", Int8, self.emg_callback)
rospy.Subscriber("ui_emg", Int8, self.ui_emg_callback)
self.toggle_option = None
self.action_killer = False
GeneralSelectionState.rokos_type = self.rokos_type


Expand Down Expand Up @@ -135,15 +136,20 @@ def execute(self, ud):
GeneralSelectionState.time_start = datetime.now()
self.ui_start_button = 0
response = 'succeeded'
self.action_killer = False
#return 'succeeded'

else:
print("Wait_Task")
time.sleep(1)
response = 'aborted'
if not self.action_killer:
rosnode.kill_nodes(['mp_action_server'])
self.action_killer = True
#return 'aborted'
else:
response = 'succeeded'

#return 'succeeded'
return response
except Exception as err:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ int buttonEmergency = 0;
using namespace std;
SIRLogger *logger = new SIRLogger("log.txt", SIRLOGLEVEL::LOGLEVEL_DEBUG);
SIRConnection *con = new SIRLinConnection(logger,"192.168.3.7",11111);
KawasakiRS005LRobot robot(con, logger,nullptr, MPT_JOINT, MT_P2P);
KawasakiRS005LRobot robot(con, logger,nullptr, MPT_JOINT, MT_SCAN);
//KawasakiRS005LRobot robot(con, logger,nullptr, MPT_TASK, MT_LINEAR);

int cancel_data = 0;
Expand Down Expand Up @@ -225,7 +225,7 @@ bool add(sir_robot_ros_interface::ManipulatorPose_ino_2::Request &req,
if (((dist_listener.danger_level == 1)||((uiEmergency==1)))&&(HOLD==false)){
robot.hold();
HOLD = true;
// std::cout <<"------UI HOLD------"<<endl;
// std::cout <<"____UI HOLD____"<<std::endl;
}

// Button Emergency Stop
Expand All @@ -234,12 +234,12 @@ bool add(sir_robot_ros_interface::ManipulatorPose_ino_2::Request &req,
// std::cout <<"------Emergency STOP------"<<endl;
}

// UI Continue
if(((dist_listener.danger_level == 0)&&((uiEmergency==0) && (buttonEmergency==0)))&&(HOLD==true)&&(emg_stop==false)){
// Continue System
if(((dist_listener.danger_level == 0)&&((uiEmergency!=1) && (buttonEmergency==0)))&&(HOLD==true)&&(emg_stop==false)){
robot.cont();
uiEmergency = 2;
HOLD = false;
// std::cout <<"------UI CONTINUE------"<<endl;
// std::cout <<"____UI CONTINUE____"<<std::endl;
}

// Reconnect
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@ find_package(catkin REQUIRED COMPONENTS

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)


find_package(gazebo REQUIRED)
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})
pkg_check_modules(JSONCPP jsoncpp)
link_libraries(${JSONCPP_LIBRARIES})
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
Expand Down Expand Up @@ -120,6 +123,7 @@ catkin_package(
include_directories(
# include
${catkin_INCLUDE_DIRS}
${JSONCPP_INCLUDE_DIR}
)

## Declare a C++ library
Expand All @@ -146,7 +150,8 @@ include_directories(
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

add_executable(odtChangeSize src/odtChangeSize.cpp)
target_link_libraries(odtChangeSize ${catkin_LIBRARIES} ${GAZEBO_LIBRARIES} ${JSONCPP_LIBRARIES})
## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,16 +54,19 @@
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>gazebo</build_depend>
<build_export_depend>geometry_msgs</build_export_depend>
<build_export_depend>nav_msgs</build_export_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<build_export_depend>gazebo</build_export_depend>
<exec_depend>geometry_msgs</exec_depend>
<exec_depend>nav_msgs</exec_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>gazebo</exec_depend>


<!-- The export tag contains other, unspecified, tags -->
Expand Down
174 changes: 174 additions & 0 deletions valu3s_tools/scripts/digital_twin_odt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
#!/usr/bin/env python3

import rospy
import tf
import numpy as np
from tf.transformations import quaternion_from_euler
from trajectory_msgs.msg import JointTrajectory
from gazebo_msgs.srv import SpawnModel, DeleteModel
from geometry_msgs.msg import *
from visualization_msgs.msg import Marker
from std_msgs.msg import String
from nav_msgs.msg import Odometry
from gazebo_msgs.srv import GetLinkState
from gazebo_msgs.msg import ModelState
from gazebo_msgs.srv import SetModelState
import xml.etree.ElementTree as ET
import json
import math

class DigitalTwinOdt():
def __init__(self):
rospy.init_node("digital_twin_odt")
self.state_msg = ModelState()
self.cylinder_chkbx = False
self.joint_chkbx = False
self.model_move = rospy.Publisher("/gazebo/set_model_state", ModelState, queue_size = 50)
rospy.Subscriber("odt_json", String, self.odt_callback)
rospy.Subscriber("oht_human_info", String, self.oht_callback)
rospy.Subscriber("mam_chkbx", String, self.mam_chkbx_callback)
self.pose = Pose()
self.pose.position.x = 100
self.pose.position.y = 100
self.pose.position.z = 100

rospy.spin()

def oht_callback(self, msg):
json_data = json.loads(msg.data)
self.state_msg.pose.position.x = json_data["x"]
self.state_msg.pose.position.y = json_data["y"]
self.state_msg.pose.position.z = 0
self.state_msg.model_name = "person_walking"
self.model_move.publish(self.state_msg)

def odt_callback(self, msg):
pose = Pose()
data = json.loads(msg.data)
if self.cylinder_chkbx:
self.move_cylinder("cylinder1", data["cylinder0"])
self.move_cylinder("cylinder2", data["cylinder1"])
self.move_cylinder("cylinder4", data["cylinder2"])
self.move_cylinder("cylinder5", data["cylinder3"])

else:
self.state_msg.pose = self.pose
self.state_msg.model_name = "cylinder1"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "cylinder2"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "cylinder4"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "cylinder5"
self.model_move.publish(self.state_msg)

if self.joint_chkbx:
a = np.array([float(data["dist0"]["fin_pose"]["x"]), float(data["dist0"]["fin_pose"]["y"]) -0.26, float(data["dist0"]["fin_pose"]["z"])])
b = np.array([float(data["dist0"]["strt_pose"]["x"]), float(data["dist0"]["strt_pose"]["y"]) -0.26, float(data["dist0"]["strt_pose"]["z"])])
orientation = self.calculate_rpy(a, b)
item_pose = Pose(Point(x=(a[0]+b[0])/2, y=(a[1]+b[1])/2, z=(a[2]+b[2])/2), orientation)
self.state_msg.model_name = "dist0"
self.state_msg.pose = item_pose
self.model_move.publish(self.state_msg)

a = np.array([float(data["dist1"]["fin_pose"]["x"]), float(data["dist1"]["fin_pose"]["y"]) -0.26, float(data["dist1"]["fin_pose"]["z"])])
b = np.array([float(data["dist1"]["strt_pose"]["x"]), float(data["dist1"]["strt_pose"]["y"]) -0.26, float(data["dist1"]["strt_pose"]["z"])])
orientation = self.calculate_rpy(a, b)
item_pose = Pose(Point(x=(a[0]+b[0])/2, y=(a[1]+b[1])/2, z=(a[2]+b[2])/2), orientation)
self.state_msg.model_name = "dist1"
self.state_msg.pose = item_pose
self.model_move.publish(self.state_msg)

a = np.array([float(data["dist2"]["fin_pose"]["x"]), float(data["dist2"]["fin_pose"]["y"]) -0.26, float(data["dist2"]["fin_pose"]["z"])])
b = np.array([float(data["dist2"]["strt_pose"]["x"]), float(data["dist2"]["strt_pose"]["y"]) -0.26, float(data["dist2"]["strt_pose"]["z"])])
orientation = self.calculate_rpy(a, b)
item_pose = Pose(Point(x=(a[0]+b[0])/2, y=(a[1]+b[1])/2, z=(a[2]+b[2])/2), orientation)
self.state_msg.model_name = "dist2"
self.state_msg.pose = item_pose
self.model_move.publish(self.state_msg)

a = np.array([float(data["dist3"]["fin_pose"]["x"]), float(data["dist3"]["fin_pose"]["y"]) -0.26, float(data["dist3"]["fin_pose"]["z"])])
b = np.array([float(data["dist3"]["strt_pose"]["x"]), float(data["dist3"]["strt_pose"]["y"]) -0.26, float(data["dist3"]["strt_pose"]["z"])])
orientation = self.calculate_rpy(a, b)
item_pose = Pose(Point(x=(a[0]+b[0])/2, y=(a[1]+b[1])/2, z=(a[2]+b[2])/2), orientation)
self.state_msg.model_name = "dist3"
self.state_msg.pose = item_pose
self.model_move.publish(self.state_msg)
else:
self.state_msg.pose = self.pose
self.state_msg.model_name = "dist0"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "dist1"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "dist2"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "dist3"
self.model_move.publish(self.state_msg)

def mam_chkbx_callback(self, msg):
self.cylinder_chkbx = json.loads(msg.data)["gui"]["cylinder"]
self.joint_chkbx = json.loads(msg.data)["gui"]["joint_dist"]
if not self.cylinder_chkbx:
self.state_msg.pose = self.pose
self.state_msg.model_name = "cylinder1"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "cylinder2"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "cylinder4"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "cylinder5"
self.model_move.publish(self.state_msg)

if not self.joint_chkbx:
self.state_msg.pose = self.pose
self.state_msg.model_name = "dist0"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "dist1"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "dist2"
self.model_move.publish(self.state_msg)
self.state_msg.model_name = "dist3"
self.model_move.publish(self.state_msg)


def calculate_rpy(self, vector1, vector2):
# print(vector1[2], vector2[2])
yaw = np.arctan((vector2[1]-vector1[1])/(vector2[0]-vector1[0])) + 1.570796
roll = np.arctan((vector2[2]-vector1[2])/(vector2[1]-vector1[1])) + 1.570796
pitch = np.arctan((vector2[2]-vector1[2])/(vector2[0]-vector1[0])) + 1.570796
if vector1[2] > vector2[2]:
pitch = np.arctan((vector2[2]-vector1[2])/(vector2[0]-vector1[0])) - 1.570796
else:
pitch = np.arctan((vector2[2]-vector1[2])/(vector2[0]-vector1[0])) + 1.570796

quat = tf.transformations.quaternion_from_euler(roll, pitch, yaw) # Quaternion(0,0,0,1)
orientation = Quaternion(quat[0], quat[1], quat[2], quat[3])
return orientation

def move_cylinder(self, name, data):
pose = Pose()
pose.position.x = float(data["pose"]["x"])
pose.position.y = float(data["pose"]["y"]) - 0.26
pose.position.z = float(data["pose"]["z"])
if name == "cylinder2":
pose.position.z += 0.171

pose.orientation.x = float(data["pose"]["or_x"])
pose.orientation.y = float(data["pose"]["or_y"])
pose.orientation.z = float(data["pose"]["or_z"])
pose.orientation.w = float(data["pose"]["or_w"])
self.state_msg.model_name = name
self.state_msg.pose = pose
self.model_move.publish(self.state_msg)

def move_dist(self, name, data):
a = np.array([float(data["dist3"]["fin_pose"]["x"]), float(data["dist3"]["fin_pose"]["y"]) -0.26, float(data["dist3"]["fin_pose"]["z"])])
b = np.array([float(data["dist3"]["strt_pose"]["x"]), float(data["dist3"]["strt_pose"]["y"]) -0.26, float(data["dist3"]["strt_pose"]["z"])])
orientation = self.calculate_rpy(a, b)
item_pose = Pose(Point(x=(a[0]+b[0])/2, y=(a[1]+b[1])/2, z=(a[2]+b[2])/2), orientation)
self.state_msg.model_name = "dist3"
self.state_msg.pose = item_pose
self.model_move.publish(self.state_msg)

if __name__ == '__main__':
DigitalTwinOdt()
File renamed without changes.
42 changes: 42 additions & 0 deletions valu3s_tools/scripts/ip_cam_to_ros.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env python3

import numpy as np
import cv2

import rospy
from sensor_msgs.msg import Image

class IpCamera2Ros():
def __init__(self):
rospy.init_node("ip_camera_to_ros")
self.url = "rtsp://admin:[email protected]:554"
self.fps = 0
self.pub = rospy.Publisher("env_cam", Image, queue_size=30)
self.rate = rospy.Rate(30)
self.image = Image()
self.main()

def main(self):
cap = cv2.VideoCapture(self.url, cv2.CAP_FFMPEG)
self.fps = cap.get(cv2.CAP_PROP_FPS)
if cap.isOpened():
while not rospy.is_shutdown():
ret, frame = cap.read()
if ret:
height, width, channels = frame.shape
self.image.height = height
self.image.width = width
self.image.encoding = "rgb8"
self.image.header.stamp = rospy.Time.now()
self.image.header.frame_id = "env_cam"
cv_rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.image.data = bytes(cv_rgb_image)
self.image.step = width * 1 * channels
self.pub.publish(self.image)
# self.image.data = []
else:
break
self.rate.sleep()

if __name__ == "__main__":
IpCamera2Ros()
41 changes: 41 additions & 0 deletions valu3s_tools/scripts/move_robot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/usr/bin/env python3

import rospy
from geometry_msgs.msg import *
from nav_msgs.msg import Odometry
from gazebo_msgs.msg import ModelState
from gazebo_msgs.srv import SetModelState

class DigitalTwinOdom():
def __init__(self):
rospy.init_node("digital_twin")
rospy.Subscriber('/odom', Odometry, self.callback)
rospy.wait_for_service('/gazebo/set_model_state')
self.set_state = rospy.ServiceProxy(
'/gazebo/set_model_state', SetModelState)
self.pre_pose = None
rospy.spin()

def callback(self, msg):
pose_x = msg.pose.pose.position.x
pose_y = msg.pose.pose.position.y
pose_orientation = msg.pose.pose.orientation
# print(pose_x)
state_msg = ModelState()
state_msg.model_name = "robot"
state_msg.pose.position.x = pose_x
state_msg.pose.position.y = 0
state_msg.pose.position.z = 0.162
state_msg.pose.orientation.w = 1
try:
if self.pre_pose != None:
if abs(abs(self.pre_pose) - abs(pose_x)) > 0.01:
# print(abs(abs(self.pre_pose) - abs(pose_x)))
self.set_state(state_msg)
except Exception as e:
print("fail set product", e)
self.pre_pose = pose_x

if __name__ == '__main__':
DigitalTwinOdom()

Loading

0 comments on commit d9932e6

Please sign in to comment.