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.

158 lines
4.2 KiB

#!/usr/bin/env python
import rospy
from std_msgs.msg import String
from geometry_msgs.msg import Twist
from mors.srv import QuadrupedCmd, QuadrupedCmdResponse, JointsCmd
import numpy as np
import sys
# SCENARIO = 1
STANDUP = 1
LAY_DOWN = 2
SITDOWN = 4
GIVE_HAND = 3
def set_mode_client(mode):
rospy.wait_for_service('robot_mode')
try:
set_mode = rospy.ServiceProxy('robot_mode', QuadrupedCmd)
resp = set_mode(mode)
return resp.result
except rospy.ServiceException as e:
print("Service call failed: %s"%e)
# call robot_action service
def set_action_client(action):
rospy.wait_for_service('robot_action')
try:
set_action = rospy.ServiceProxy('robot_action', QuadrupedCmd)
resp = set_action(action)
return resp.result
except rospy.ServiceException as e:
print("Service call failed: %s"%e)
def set_stride_height_client(height):
rospy.wait_for_service('stride_height')
try:
set_height = rospy.ServiceProxy('stride_height', QuadrupedCmd)
resp = set_height(height)
return resp.result
except rospy.ServiceException as e:
print("Service call failed: %s"%e)
def set_joints_kp(kp):
rospy.wait_for_service("joints_kp")
try:
set_kp_srv = rospy.ServiceProxy('joints_kp', JointsCmd)
resp = set_kp_srv(kp)
return resp.result
except rospy.ServiceException as e:
print("Service call failed: %s"%e)
def set_joints_kd(kd):
rospy.wait_for_service("joints_kd")
try:
set_kd_srv = rospy.ServiceProxy('joints_kd', JointsCmd)
resp = set_kd_srv(kd)
return resp.result
except rospy.ServiceException as e:
print("Service call failed: %s"%e)
def talker(SCENARIO):
# ROS stuff
cmd_vel_topic = "cmd_vel"
cmd_vel_pub = rospy.Publisher(cmd_vel_topic, Twist, queue_size=1)
rospy.init_node('exp_scenarios', anonymous=True)
cmd_vel_msg = Twist()
rate = rospy.Rate(240)
# experimental stuff
t_max = 0.0
t = 0.0
inc = 1.0/240.0
if SCENARIO == 1:
t_max = 5.0
elif SCENARIO == 2:
t_max = 15.0
elif SCENARIO == 3:
t_max = 15.0
elif SCENARIO == 4:
t_max = np.inf
set_joints_kp([30.0]*12)
set_joints_kd([0.1]*12)
set_stride_height_client(0.07)
set_mode_client(0)
if set_action_client(STANDUP) == 1:
rospy.loginfo("standup")
for i in range(800):
cmd_vel_msg.linear.x = 0.0
cmd_vel_msg.linear.y = 0.0
cmd_vel_msg.angular.z = 0.0
cmd_vel_pub.publish(cmd_vel_msg)
rate.sleep()
# print(SCENARIO)
# print(t)
# print(t_max)
while t < t_max:
if SCENARIO == 1:
cmd_vel_msg.linear.x = 0.4
cmd_vel_msg.linear.y = 0.0
cmd_vel_msg.angular.z = 0.0
elif SCENARIO == 2:
if (t % 1.0) < inc:
cmd_vel_msg.linear.x += 0.1
cmd_vel_msg.linear.y = 0.0
cmd_vel_msg.angular.z = 0.0
elif SCENARIO == 3:
if t < 5.0:
cmd_vel_msg.linear.x = 0.5
cmd_vel_msg.linear.y = 0.0
elif 5.0 <= t < 10.0:
cmd_vel_msg.linear.x = 0.0
cmd_vel_msg.linear.y = 0.3
elif 10.0 <= t < 15.0:
cmd_vel_msg.linear.x = -0.5
cmd_vel_msg.linear.y = -0.3
cmd_vel_msg.angular.z = 0.0
elif SCENARIO == 4:
cmd_vel_msg.linear.x = 0.55
cmd_vel_msg.linear.y = 0.0
cmd_vel_msg.angular.z = -0.25
t += inc
cmd_vel_pub.publish(cmd_vel_msg)
rate.sleep()
for i in range(480):
cmd_vel_msg.linear.x = 0.0
cmd_vel_msg.linear.y = 0.0
cmd_vel_msg.angular.z = 0.0
cmd_vel_pub.publish(cmd_vel_msg)
rate.sleep()
set_stride_height_client(0.0)
if set_action_client(LAY_DOWN) == 1:
rospy.loginfo("laydown")
rospy.loginfo("Congratulations! The test scenario is finished.")
if __name__ == '__main__':
try:
if len(sys.argv) < 2:
print("Usage: rosrun exp_scenario exp_scenario.py scenarioNumber")
else:
talker(int(sys.argv[1]))
except rospy.ROSInterruptException:
pass