You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
9.6 KiB

#!/usr/bin/env python
import rospy
import rosnode
from std_msgs.msg import Bool, UInt8
from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint
from geometry_msgs.msg import Twist
from geometry_msgs.msg import PoseArray, Pose
class CmdCommutator(object):
def __init__(self) -> None:
self.cur_device = 0
rospy.init_node("cmd_commutator")
freq = rospy.get_param('~frequency', 500)
# read config file
output_cmd_vel_topic = rospy.get_param('~output_cmd_vel_topic', "cmd_vel")
output_cmd_pose_topic = rospy.get_param('~output_cmd_pose_topic', "cmd_pose")
output_cmd_ef_pose_topic = rospy.get_param('~output_cmd_ef_pose_topic', "ef_position/command")
output_cmd_joint_pos_topic = rospy.get_param('~output_cmd_joint_pos_topic', "joint_group_position_controller/command")
output_status_topic = rospy.get_param('~output_status_topic', "cur_device")
input1_cmd_vel_topic = rospy.get_param('~input1_cmd_vel_topic', "ds4/cmd_vel")
input1_cmd_pose_topic = rospy.get_param('~input1_cmd_pose_topic', "ds4/cmd_pose")
input1_cmd_ef_pose_topic = rospy.get_param('~input1_cmd_ef_pose_topic', "ds4/ef_position/command")
input1_cmd_joint_pos_topic = rospy.get_param('~input1_cmd_joint_pos_topic', "ds4/joint_group_position_controller/command")
input1_status_topic = rospy.get_param('~input1_status_topic', "ds4/status")
input2_cmd_vel_topic = rospy.get_param('~input2_cmd_vel_topic', "radiolink/cmd_vel")
input2_cmd_pose_topic = rospy.get_param('~input2_cmd_pose_topic', "radiolink/cmd_pose")
input2_cmd_ef_pose_topic = rospy.get_param('~input2_cmd_ef_pose_topic', "radiolink/ef_position/command")
input2_cmd_joint_pos_topic = rospy.get_param('~input2_cmd_joint_pos_topic', "radiolink/joint_group_position_controller/command")
input2_status_topic = rospy.get_param('~input2_status_topic', "radiolink/status")
input3_cmd_vel_topic = rospy.get_param('~input3_cmd_vel_topic', "nav/cmd_vel")
input3_cmd_pose_topic = rospy.get_param('~input3_cmd_pose_topic', "nav/cmd_pose")
input3_cmd_ef_pose_topic = rospy.get_param('~input3_cmd_ef_pose_topic', "nav/ef_position/command")
input3_cmd_joint_pos_topic = rospy.get_param('~input3_cmd_joint_pos_topic', "nav/joint_group_position_controller/command")
input3_status_topic = rospy.get_param('~input3_status_topic', "nav/status")
input4_cmd_vel_topic = rospy.get_param('~input4_cmd_vel_topic', "gui/cmd_vel")
input4_cmd_pose_topic = rospy.get_param('~input4_cmd_pose_topic', "gui/cmd_pose")
input4_cmd_ef_pose_topic = rospy.get_param('~input4_cmd_ef_pose_topic', "gui/ef_position/command")
input4_cmd_joint_pos_topic = rospy.get_param('~input4_cmd_joint_pos_topic', "gui/joint_group_position_controller/command")
input4_status_topic = rospy.get_param('~input4_status_topic', "gui/status")
self.rate = rospy.Rate(freq)
# subscribers
rospy.Subscriber(input1_cmd_vel_topic, Twist, self.input1_cmd_vel_callback, queue_size=1)
rospy.Subscriber(input1_cmd_pose_topic, Twist, self.input1_cmd_pose_callback, queue_size=1)
rospy.Subscriber(input1_cmd_ef_pose_topic, PoseArray, self.input1_cmd_ef_pose_callback, queue_size=1)
rospy.Subscriber(input1_cmd_joint_pos_topic, JointTrajectoryPoint, self.input1_cmd_joint_pos_callback, queue_size=1)
rospy.Subscriber(input1_status_topic, Bool, self.input1_status_callback, queue_size=1)
rospy.Subscriber(input2_cmd_vel_topic, Twist, self.input2_cmd_vel_callback, queue_size=1)
rospy.Subscriber(input2_cmd_pose_topic, Twist, self.input2_cmd_pose_callback, queue_size=1)
rospy.Subscriber(input2_cmd_ef_pose_topic, PoseArray, self.input2_cmd_ef_pose_callback, queue_size=1)
rospy.Subscriber(input2_cmd_joint_pos_topic, JointTrajectoryPoint, self.input2_cmd_joint_pos_callback, queue_size=1)
rospy.Subscriber(input2_status_topic, Bool, self.input2_status_callback, queue_size=1)
rospy.Subscriber(input3_cmd_vel_topic, Twist, self.input3_cmd_vel_callback, queue_size=1)
rospy.Subscriber(input3_cmd_pose_topic, Twist, self.input3_cmd_pose_callback, queue_size=1)
rospy.Subscriber(input3_cmd_ef_pose_topic, PoseArray, self.input3_cmd_ef_pose_callback, queue_size=1)
rospy.Subscriber(input3_cmd_joint_pos_topic, JointTrajectoryPoint, self.input3_cmd_joint_pos_callback, queue_size=1)
rospy.Subscriber(input3_status_topic, Bool, self.input3_status_callback, queue_size=1)
rospy.Subscriber(input4_cmd_vel_topic, Twist, self.input4_cmd_vel_callback, queue_size=1)
rospy.Subscriber(input4_cmd_pose_topic, Twist, self.input4_cmd_pose_callback, queue_size=1)
rospy.Subscriber(input4_cmd_ef_pose_topic, PoseArray, self.input4_cmd_ef_pose_callback, queue_size=1)
rospy.Subscriber(input4_cmd_joint_pos_topic, JointTrajectoryPoint, self.input4_cmd_joint_pos_callback, queue_size=1)
rospy.Subscriber(input4_status_topic, Bool, self.input4_status_callback, queue_size=1)
# publishers
self.cmd_vel_pub = rospy.Publisher(output_cmd_vel_topic, Twist, queue_size=10)
self.cmd_pose_pub = rospy.Publisher(output_cmd_pose_topic, Twist, queue_size=10)
self.cmd_ef_pos_pub = rospy.Publisher(output_cmd_ef_pose_topic, PoseArray, queue_size=10)
self.cmd_joint_pos_pub = rospy.Publisher(output_cmd_joint_pos_topic, JointTrajectoryPoint, queue_size=10)
self.status_pub = rospy.Publisher(output_status_topic, UInt8, queue_size=10)
# messages
self.cmd_vel_msg = Twist()
self.cmd_pose_msg = Twist()
self.cmd_ef_msg = PoseArray()
self.cmd_joint_msg = JointTrajectoryPoint()
self.input1_status = False
self.input2_status = False
self.input3_status = False
self.input4_status = False
rospy.loginfo("cmd_commutator configured")
def run(self):
while not rospy.is_shutdown():
if rosnode.rosnode_ping("/move_base", max_count=2, verbose=False):
if self.input1_status == False and self.input2_status == False:
self.cur_device = 3
else:
if self.input1_status == False and self.input2_status == False and self.input4_status == True:
self.cur_device = 4
self.input3_status = False
if self.input1_status == True:
self.cur_device = 1
elif self.input2_status == True:
self.cur_device = 2
elif self.input3_status == True:
self.cur_device = 3
elif self.input4_status == True:
self.cur_device = 4
else:
self.cur_device = 0
self.cmd_vel_pub.publish(self.cmd_vel_msg)
self.cmd_pose_pub.publish(self.cmd_pose_msg)
self.cmd_ef_pos_pub.publish(self.cmd_ef_msg)
self.cmd_joint_pos_pub.publish(self.cmd_joint_msg)
self.status_pub.publish(self.cur_device)
self.rate.sleep()
def input1_cmd_vel_callback(self, msg : Twist):
if self.cur_device == 1:
self.cmd_vel_pub.publish(msg)
def input1_cmd_pose_callback(self, msg : Twist):
if self.cur_device == 1:
self.cmd_pose_pub.publish(msg)
def input1_cmd_ef_pose_callback(self, msg : PoseArray):
if self.cur_device == 1:
self.cmd_ef_pos_pub.publish(msg)
def input1_cmd_joint_pos_callback(self, msg : JointTrajectoryPoint):
if self.cur_device == 1:
self.cmd_joint_pos_pub.publish(msg)
def input1_status_callback(self, msg : Bool):
self.input1_status = msg.data
def input2_cmd_vel_callback(self, msg : Twist):
if self.cur_device == 2:
self.cmd_vel_pub.publish(msg)
def input2_cmd_pose_callback(self, msg : Twist):
if self.cur_device == 2:
self.cmd_pose_pub.publish(msg)
def input2_cmd_ef_pose_callback(self, msg : PoseArray):
if self.cur_device == 2:
self.cmd_ef_pos_pub.publish(msg)
def input2_cmd_joint_pos_callback(self, msg : JointTrajectoryPoint):
if self.cur_device == 2:
self.cmd_joint_pos_pub.publish(msg)
def input2_status_callback(self, msg : Bool):
self.input2_status = msg.data
def input3_cmd_vel_callback(self, msg : Twist):
if self.cur_device == 3:
self.cmd_vel_pub.publish(msg)
def input3_cmd_pose_callback(self, msg : Twist):
if self.cur_device == 3:
self.cmd_pose_pub.publish(msg)
def input3_cmd_ef_pose_callback(self, msg : PoseArray):
if self.cur_device == 3:
self.cmd_ef_pos_pub.publish(msg)
def input3_cmd_joint_pos_callback(self, msg : JointTrajectoryPoint):
if self.cur_device == 3:
self.cmd_joint_pos_pub.publish(msg)
def input3_status_callback(self, msg : Bool):
self.input3_status = msg.data
def input4_cmd_vel_callback(self, msg : Twist):
if self.cur_device == 4:
self.cmd_vel_pub.publish(msg)
def input4_cmd_pose_callback(self, msg : Twist):
if self.cur_device == 4:
self.cmd_pose_pub.publish(msg)
def input4_cmd_ef_pose_callback(self, msg : PoseArray):
if self.cur_device == 4:
self.cmd_ef_pos_pub.publish(msg)
def input4_cmd_joint_pos_callback(self, msg : JointTrajectoryPoint):
if self.cur_device == 4:
self.cmd_joint_pos_pub.publish(msg)
def input4_status_callback(self, msg : Bool):
self.input4_status = msg.data
if __name__ == '__main__':
cmd_com = CmdCommutator()
cmd_com.run()