diff --git a/jsk_fetch_robot/jsk_fetch_startup/scripts/update_workspace.sh b/jsk_fetch_robot/jsk_fetch_startup/scripts/update_workspace.sh index f27e401366..6fd0ba00d2 100755 --- a/jsk_fetch_robot/jsk_fetch_startup/scripts/update_workspace.sh +++ b/jsk_fetch_robot/jsk_fetch_startup/scripts/update_workspace.sh @@ -1,43 +1,9 @@ #!/usr/bin/env bash -. $HOME/ros/melodic/devel/setup.bash -# Filename should end with .txt to preview the contents in a web browser -LOGFILE=$HOME/ros/melodic/update_workspace.txt - -{ -set -x -# Update workspace -cd $HOME/ros/melodic/src -ln -sf $(rospack find jsk_fetch_startup)/../jsk_fetch.rosinstall.$ROS_DISTRO $HOME/ros/melodic/src/.rosinstall -wstool foreach --git 'git stash' -wstool update --delete-changed-uris -WSTOOL_UPDATE_RESULT=$? -cd $HOME/ros/melodic -catkin clean aques_talk collada_urdf_jsk_patch -y -catkin init -catkin config -DCMAKE_BUILD_TYPE=Release -catkin build -CATKIN_BUILD_RESULT=$? -# Send mail -MAIL_BODY="" -if [ $WSTOOL_UPDATE_RESULT -ne 0 ]; then - MAIL_BODY=$MAIL_BODY"Please wstool update workspace manually. " -fi -if [ $CATKIN_BUILD_RESULT -ne 0 ]; then - MAIL_BODY=$MAIL_BODY"Please catkin build workspace manually." -fi -set +x -} > $LOGFILE 2>&1 -if [ -n "$MAIL_BODY" ]; then - rostopic pub -1 /email jsk_robot_startup/Email "header: - seq: 0 - stamp: {secs: 0, nsecs: 0} - frame_id: '' -subject: 'Daily workspace update fails' -body: '$MAIL_BODY' -sender_address: '$(hostname)@jsk.imi.i.u-tokyo.ac.jp' -receiver_address: 'fetch@jsk.imi.i.u-tokyo.ac.jp' -smtp_server: '' -smtp_port: '' -attached_files: ['$LOGFILE']" -fi +cp $(rospack find jsk_robot_startup)/scripts/update_workspace_main.sh /tmp/update_workspace.sh +# jsk_footstep_planner is not released for melodic +# jsk_footstep_controller is not released for melodic +# librealsense2 should not be installed from ROS repository +# realsense-ros should not be installed from ROS repository +/tmp/update_workspace.sh -r $(rospack find jsk_fetch_startup)/../jsk_fetch.rosinstall.$ROS_DISTRO -t fetch -s "jsk_footstep_controller jsk_footstep_planner librealsense2 realsense2_camera realsense2_description" +rm /tmp/update_workspace.sh diff --git a/jsk_pr2_robot/jsk_pr2_startup/apps/tweet/tweet.app b/jsk_pr2_robot/jsk_pr2_startup/apps/tweet/tweet.app index ac930d0528..ec8ff6dae9 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/apps/tweet/tweet.app +++ b/jsk_pr2_robot/jsk_pr2_startup/apps/tweet/tweet.app @@ -1,6 +1,7 @@ display: PR2 Tweet description: PR2 likes tweeting platform: pr2 -launch: jsk_pr2_startup/tweet.xml +# launch: jsk_pr2_startup/tweet.xml +run: jsk_pr2_startup/tweet.l interface: jsk_pr2_startup/tweet.interface icon: jsk_pr2_startup/tweet.png diff --git a/jsk_pr2_robot/jsk_pr2_startup/apps/tweet/tweet.l b/jsk_pr2_robot/jsk_pr2_startup/apps/tweet/tweet.l old mode 100644 new mode 100755 diff --git a/jsk_pr2_robot/jsk_pr2_startup/config/jsk_startup.rviz b/jsk_pr2_robot/jsk_pr2_startup/config/jsk_startup.rviz index ec5d660fe5..0c08b99a42 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/config/jsk_startup.rviz +++ b/jsk_pr2_robot/jsk_pr2_startup/config/jsk_startup.rviz @@ -5,6 +5,8 @@ Panels: Property Tree Widget: Expanded: - /Diagnostics1/Power1 + - /Vision1/NarrowStereoLeft1 + - /Planning1/SmachImage1 Splitter Ratio: 0.557554007 Tree Height: 1855 - Class: rviz/Selection @@ -899,9 +901,9 @@ Visualization Manager: Enabled: false Invert Rainbow: false Max Color: 255; 255; 255 - Max Intensity: 1.08762002 + Max Intensity: 4096 Min Color: 0; 0; 0 - Min Intensity: 0.190980002 + Min Intensity: 0 Name: TiltScan Position Transformer: XYZ Queue Size: 10 @@ -976,6 +978,23 @@ Visualization Manager: Value: true Enabled: true Name: Vision + - Class: rviz/Group + Displays: + - Class: jsk_rviz_plugin/OverlayImage + Enabled: true + Name: SmachImage + Topic: /smach_image_publisher/image + Value: true + alpha: 0.850000024 + height: 200 + keep aspect ratio: true + left: 2700 + overwrite alpha value: false + top: 50 + transport hint: compressed + width: 600 + Enabled: true + Name: Planning Enabled: true Global Options: Background Color: 48; 48; 48 @@ -1003,25 +1022,25 @@ Visualization Manager: Views: Current: Class: rviz/Orbit - Distance: 10.3789015 + Distance: 8.56335258 Enable Stereo Rendering: Stereo Eye Separation: 0.0599999987 Stereo Focal Distance: 1 Swap Stereo Eyes: false Value: false Focal Point: - X: 1.27238953 - Y: -0.646221399 - Z: 1.45365202 + X: 1.20282674 + Y: 0.220421076 + Z: 1.34202754 Focal Shape Fixed Size: true Focal Shape Size: 0.0500000007 Invert Z Axis: false Name: Current View Near Clip Distance: 0.00999999978 - Pitch: 0.449796855 + Pitch: 0.429796875 Target Frame: base_link Value: Orbit (rviz) - Yaw: 0.113857321 + Yaw: 0.71885699 Saved: ~ Window Geometry: Displays: diff --git a/jsk_pr2_robot/jsk_pr2_startup/config/pr2_app_schedule.yaml b/jsk_pr2_robot/jsk_pr2_startup/config/pr2_app_schedule.yaml new file mode 100644 index 0000000000..70b87582ec --- /dev/null +++ b/jsk_pr2_robot/jsk_pr2_startup/config/pr2_app_schedule.yaml @@ -0,0 +1,23 @@ +# check use_sim_time +- name: check_use_sim_time + app_name: jsk_robot_startup/check_use_sim_time + app_schedule: + start: every().hour.at(":00") +# volume for monday +- name: volume_zero_monday + app_name: jsk_robot_startup/volume_zero + app_schedule: + start: every().monday.at("12:00") +- name: volume_reset_monday + app_name: jsk_robot_startup/volume_reset + app_schedule: + start: every().monday.at("16:00") +# volume for tuesday +- name: volume_zero_tuesday + app_name: jsk_robot_startup/volume_zero + app_schedule: + start: every().tuesday.at("12:00") +- name: volume_reset_tuesday + app_name: jsk_robot_startup/volume_reset + app_schedule: + start: every().tuesday.at("16:00") diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2.rosinstall b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2.rosinstall index 3d7fe87744..0675f96ed3 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2.rosinstall +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2.rosinstall @@ -15,7 +15,7 @@ - git: local-name: PR2/pr2_controllers uri: https://github.com/PR2/pr2_controllers.git - version: melodic-devel + version: 1.10.18 # we need to install from source because pr2 is indigo - git: local-name: PR2/pr2_self_test @@ -85,8 +85,8 @@ # we need this for eus10 and roseus_resume - git: local-name: jsk-ros-pkg/jsk_pr2eus - uri: https://github.com/knorth55/jsk_pr2eus.git - version: pr1040 + uri: https://github.com/jsk-ros-pkg/jsk_pr2eus.git + version: master # we need to install from source because pr2 is indigo - git: local-name: jsk-ros-pkg/jsk_recognition @@ -143,6 +143,11 @@ uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/visualization_msgs/1.12.7-0.tar.gz version: common_msgs-release-release-kinetic-visualization_msgs-1.12.7-0 # we need to install from source because pr2 is indigo +- git: + local-name: ros-visualization/executive_smach_visualization + uri: https://github.com/ros-visualization/executive_smach_visualization.git + version: melodic-devel +# we need to install from source because pr2 is indigo - git: local-name: ros-visualization/interactive_markers uri: https://github.com/ros-visualization/interactive_markers.git diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_lifelog/pr2_tweet.launch b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_lifelog/pr2_tweet.launch index 3e194c06b9..9adbd22bf3 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_lifelog/pr2_tweet.launch +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_lifelog/pr2_tweet.launch @@ -3,6 +3,7 @@ + diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/check_openni_node.py b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/check_openni_node.py index 547df4c7ad..f1b1d939b2 100755 --- a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/check_openni_node.py +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/check_openni_node.py @@ -91,7 +91,7 @@ def restart_openni_node(self): def run(self): while not rospy.is_shutdown(): - if self.image_sub == None or self.image_sub.impl == None: + if self.image_sub is None or self.image_sub.impl is None: self.image_sub = rospy.Subscriber("image", Image, self.image_callback, None, 1) rospy.sleep(self.sleep_cycle) diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/kinect_head.launch b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/kinect_head.launch index d312d3d69f..c6864d75a0 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/kinect_head.launch +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_sensors/kinect_head.launch @@ -234,9 +234,9 @@ + - diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/battery_logger.py b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/battery_logger.py index ede2eb2e28..a8b118c019 100755 --- a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/battery_logger.py +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/battery_logger.py @@ -87,7 +87,13 @@ def write(self, date, info): rospy.logerr("{}".format(e)) rospy.logerr("Could not write to dweet.io") return - assert res.ok and json.loads(res.content)["this"] == "succeeded" + try: + contents = json.loads(res.content) + except ValueError as e: + rospy.logerr("{}".format(e)) + rospy.logerr("Request successed, but return value is invalid.") + return + assert res.ok and contents["this"] == "succeeded" class BatteryInfoAggregator(object): diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/diagnostics_ethercat_summarizer.py b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/diagnostics_ethercat_summarizer.py new file mode 100755 index 0000000000..3e8a6bf958 --- /dev/null +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/diagnostics_ethercat_summarizer.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +import rospy + +from diagnostic_msgs.msg import DiagnosticArray + + +def callback(data): + flag = False + for e in data.status: + #EtherCAT Device + for v in e.values: + if v.key =='Drops': + flag = True + print(e.name + "Drops: {}".format(v.value)) + #EtherCAT Master + if e.name == 'EtherCAT Master': + for v in e.values: + if v.key =='Dropped Packets': + print(e.name + " Dropped Packets: {}".format(v.value)) + if v.key =='RX Late Packet': + print(e.name + " RX Late Packet: {}".format(v.value)) + + if flag: + print("--------------------------------------------") + + +def listener(): + rospy.init_node('diagnostics_ethercat_summarizer', anonymous=True) + rospy.Subscriber('/diagnostics', DiagnosticArray, callback) + rospy.spin() + +if __name__ == '__main__': + listener() diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/diagnostics_rx_error_summarizer.py b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/diagnostics_rx_error_summarizer.py new file mode 100755 index 0000000000..bf3da104ba --- /dev/null +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/diagnostics_rx_error_summarizer.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python + +import csv +import rospy +import argparse +from diagnostic_msgs.msg import DiagnosticArray + + +class DiagnosticsRxErrorSummarizer(): + def __init__(self, is_csv=False): + self.subscribe() + self.keys = ['timestamp'] + self.count = 0 + self.output_file = 'diagnostic_agg_rx_error.csv' + self.is_csv = is_csv + + def subscribe(self): + self.sub = rospy.Subscriber("/diagnostics_agg", + DiagnosticArray, + self.callback, + queue_size=1) + + def write_keys(self): + with open(self.output_file, 'w') as f: + writer = csv.writer(f) + writer.writerow(self.keys) + + def write_values(self): + with open(self.output_file, 'a') as f: + writer = csv.writer(f) + writer.writerow(self.values) + + def callback(self, msg): + status = msg.status + self.values = [msg.header.stamp.secs] + if self.is_csv: + print(self.count) + for s in status: + if 'values' not in dir(s): + continue + for v in s.values: + if 'RX Error' in v.key: + if self.count == 0: + self.keys.append(s.name + ' - ' + v.key) + self.values.append(v.value) + + if self.count == 0: + self.write_keys() + self.write_values() + + self.count += 1 + else: + flag = False + thre_val = 0 + s_name_list = [] + key_list = [] + value_list = [] + for s in status: + if 'values' not in dir(s): + continue + for v in s.values: + if 'RX Error' in v.key and not ('Forwarded' in v.key): + print(s.name + " " + v.key + ": {}".format(v.value)) + if not ('Master' in s.name): + flag = True + if int(v.value) > thre_val: + s_name_list.append(s.name) + value_list.append(v.value) + key_list.append(v.key) + + if flag: + if len(s_name_list) > 0: + print("[Eroor Exist Dvice]") + for s_name, key, value in zip(s_name_list, key_list, value_list): + print(s_name + " " + key + ": {}".format(value)) + print("--------------------------------------------") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--csv', action='store_true', help='save data in csv or not') + args = parser.parse_args() + is_csv= args.csv + + rospy.init_node('diagnostics_rx_errror_summarizer', anonymous=True) + diagnostics_rx_errror_summarizer = DiagnosticsRxErrorSummarizer(is_csv=is_csv) + rospy.spin() diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/jsk_pr2_analyzers.yaml b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/jsk_pr2_analyzers.yaml index b85284faef..2ee0419a4a 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/jsk_pr2_analyzers.yaml +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/jsk_pr2_analyzers.yaml @@ -6,9 +6,9 @@ analyzers: joystick: type: diagnostic_aggregator/GenericAnalyzer path: Joystick - expected: 'joy: Joystick Driver Status' + expected: 'joy_node: Joystick Driver Status' num_items: 1 - remove_prefix: 'joy' + remove_prefix: 'joy_node' sound: type: diagnostic_aggregator/GenericAnalyzer path: Sound diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/sanity_targets.yaml b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/sanity_targets.yaml new file mode 100644 index 0000000000..2b298ea54b --- /dev/null +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/sanity_targets.yaml @@ -0,0 +1,6 @@ +topics: + - /kinect_head/rgb/image_raw/compressed + - /kinect_head/depth_registered/image_raw/compressedDepth + - /edgetpu_human_pose_estimator/output/image/compressed + - /edgetpu_object_detector/output/image/compressed + - /audio diff --git a/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/warning_blacklist.yaml b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/warning_blacklist.yaml new file mode 100644 index 0000000000..4959e68d21 --- /dev/null +++ b/jsk_pr2_robot/jsk_pr2_startup/jsk_pr2_warning/warning_blacklist.yaml @@ -0,0 +1,24 @@ +blacklist: + - name: "/Cameras/Forearm.*" + - name: "/Cameras/Narrow.*" + - name: "/Cameras/Prosilica" + - name: "/Cameras/Wide.*" + - name: "/Computers/CPU/c1 CPU Usage" + - name: "/Computers/CPU/c2 CPU Usage" + - name: "/Devices/Joystick/Joystick Driver Status" + - name: "/Devices/Sound" + - name: "/Joints/Joint.*" + message: "Uncalibrated" + - name: "/Other/Accelerometer.*" + - name: "/Other/NTP offset from" + - name: "/Other/Pressure sensors.*" + - name: "/Other/lifelog joint_states_logger: LightweightLogger:: lifelog joint_states_throttle output" + - name: "/Other/prosilica prosilica_nodelet_manager: prosilica prosilica_driver" + - name: "/Power System/.*" + - name: "/Motors/EtherCAT.*" + message: "Safety Lockout.*" + - name: "/Realtime Controllers/Controller.*" + - name: "/Realtime Controllers/Calibration stuck" + - name: "/Computers/CPU/c\\d CPU Temperature" +run_stop_blacklist: + - name: "/Motors.*" diff --git a/jsk_pr2_robot/jsk_pr2_startup/pr2.launch b/jsk_pr2_robot/jsk_pr2_startup/pr2.launch index 0d39447df2..47e5eede1d 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/pr2.launch +++ b/jsk_pr2_robot/jsk_pr2_startup/pr2.launch @@ -32,6 +32,8 @@ doc="whether launch gdrive_server on c1 or not."/> + + file="$(find jsk_pr2_startup)/jsk_pr2_sensors/kinect_head.launch" > + + + + + + run_stop_topic: /power_board/state + run_stop_condition: "m.run_stop is False" + seconds_to_start_speaking: 60 + speak_interval: 600 + ignore_time_after_runstop_is_enabled: 5.0 + ignore_time_after_runstop_is_disabled: 5.0 + + + + + + + + + + + + + duration: 60 + + + + + + + email_info: /var/lib/robot/email_topic.yaml + + + + + + + + + + + + + duration: 0.5 + + + + + + + + diff --git a/jsk_pr2_robot/jsk_pr2_startup/pr2_bringup.launch b/jsk_pr2_robot/jsk_pr2_startup/pr2_bringup.launch index a174da7b42..8ff9825400 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/pr2_bringup.launch +++ b/jsk_pr2_robot/jsk_pr2_startup/pr2_bringup.launch @@ -240,7 +240,7 @@ - + diff --git a/jsk_pr2_robot/jsk_pr2_startup/pr2_gazebo.launch b/jsk_pr2_robot/jsk_pr2_startup/pr2_gazebo.launch index 5d576705c4..25230efe12 100644 --- a/jsk_pr2_robot/jsk_pr2_startup/pr2_gazebo.launch +++ b/jsk_pr2_robot/jsk_pr2_startup/pr2_gazebo.launch @@ -142,7 +142,7 @@ - + @@ -154,6 +154,7 @@ + diff --git a/jsk_pr2_robot/jsk_pr2_startup/sample/pr2_gazebo_empty_world.launch b/jsk_pr2_robot/jsk_pr2_startup/sample/pr2_gazebo_empty_world.launch new file mode 100644 index 0000000000..c44fc2f3f7 --- /dev/null +++ b/jsk_pr2_robot/jsk_pr2_startup/sample/pr2_gazebo_empty_world.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + transform_frame: /map + initial_pose_x: $(arg INITIAL_POSE_X) + initial_pose_y: $(arg INITIAL_POSE_Y) + initial_pose_yaw: $(arg INITIAL_POSE_YAW) + + + diff --git a/jsk_pr2_robot/jsk_pr2_startup/scripts/update_workspace.sh b/jsk_pr2_robot/jsk_pr2_startup/scripts/update_workspace.sh new file mode 100755 index 0000000000..3dbf85dd09 --- /dev/null +++ b/jsk_pr2_robot/jsk_pr2_startup/scripts/update_workspace.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +cp $(rospack find jsk_robot_startup)/scripts/update_workspace_main.sh /tmp/update_workspace.sh +/tmp/update_workspace.sh -w $HOME/ros/indigo -r $(rospack find jsk_pr2_startup)/jsk_pr2.rosinstall -t pr2 -u +rm /tmp/update_workspace.sh diff --git a/jsk_robot_common/jsk_robot_startup/apps/check_use_sim_time/check_use_sim_time.app b/jsk_robot_common/jsk_robot_startup/apps/check_use_sim_time/check_use_sim_time.app index aab3f89f5a..5870ad309a 100644 --- a/jsk_robot_common/jsk_robot_startup/apps/check_use_sim_time/check_use_sim_time.app +++ b/jsk_robot_common/jsk_robot_startup/apps/check_use_sim_time/check_use_sim_time.app @@ -1,5 +1,6 @@ display: Check /use_sim_time param platform: all -launch: jsk_robot_startup/check_use_sim_time.xml +run: jsk_robot_startup/check_use_sim_time.py +# launch: jsk_robot_startup/check_use_sim_time.xml interface: jsk_robot_startup/check_use_sim_time.interface icon: jsk_robot_startup/check_use_sim_time.png diff --git a/jsk_robot_common/jsk_robot_startup/apps/personal_use/personal_use.app b/jsk_robot_common/jsk_robot_startup/apps/personal_use/personal_use.app index e5eea4894f..1a64fabc2d 100644 --- a/jsk_robot_common/jsk_robot_startup/apps/personal_use/personal_use.app +++ b/jsk_robot_common/jsk_robot_startup/apps/personal_use/personal_use.app @@ -1,5 +1,7 @@ display: Personal Use platform: all -launch: jsk_robot_startup/personal_use.xml +run: jsk_robot_startup/personal_use.py +# launch: jsk_robot_startup/personal_use.xml interface: jsk_robot_startup/personal_use.interface icon: jsk_robot_startup/personal_use.png +allow_parallel: false diff --git a/jsk_robot_common/jsk_robot_startup/apps/robot_apps.installed b/jsk_robot_common/jsk_robot_startup/apps/robot_apps.installed index e142d9282c..1350da5b19 100644 --- a/jsk_robot_common/jsk_robot_startup/apps/robot_apps.installed +++ b/jsk_robot_common/jsk_robot_startup/apps/robot_apps.installed @@ -1,5 +1,15 @@ apps: - app: jsk_robot_startup/personal_use - display: Personal use + display: Personal use - app: jsk_robot_startup/check_use_sim_time display: Check /use_sim_time param + - app: jsk_robot_startup/roseus_resume_interrupt + display: Interrupt + - app: jsk_robot_startup/roseus_resume_resume + display: Resume + - app: jsk_robot_startup/volume_lower + display: Volume lower + - app: jsk_robot_startup/volume_reset + display: Volume reset + - app: jsk_robot_startup/volume_zero + display: Volume zero diff --git a/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.app b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.app new file mode 100644 index 0000000000..d6ea2dad0f --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.app @@ -0,0 +1,6 @@ +display: Interrupt +platform: all +run: rostopic/rostopic +run_args: "pub -1 /roseus_resume/interrupt std_msgs/Empty" +interface: jsk_robot_startup/roseus_resume_interrupt.interface +icon: jsk_robot_startup/roseus_resume_interrupt.png diff --git a/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.interface b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.interface new file mode 100644 index 0000000000..044105d644 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.interface @@ -0,0 +1,2 @@ +published_topics: {} +subscribed_topics: {} diff --git a/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.png b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.png new file mode 100644 index 0000000000..352d08ee47 Binary files /dev/null and b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_interrupt/roseus_resume_interrupt.png differ diff --git a/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.app b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.app new file mode 100644 index 0000000000..c21b0d3a49 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.app @@ -0,0 +1,6 @@ +display: Resume +platform: all +run: rostopic/rostopic +run_args: "pub -1 /roseus_resume/resume std_msgs/Empty" +interface: jsk_robot_startup/roseus_resume_resume.interface +icon: jsk_robot_startup/roseus_resume_resume.png diff --git a/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.interface b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.interface new file mode 100644 index 0000000000..044105d644 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.interface @@ -0,0 +1,2 @@ +published_topics: {} +subscribed_topics: {} diff --git a/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.png b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.png new file mode 100644 index 0000000000..235869778e Binary files /dev/null and b/jsk_robot_common/jsk_robot_startup/apps/roseus_resume_resume/roseus_resume_resume.png differ diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.app b/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.app new file mode 100644 index 0000000000..e9648c034f --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.app @@ -0,0 +1,6 @@ +display: Volume Lower +description: robot speaks lower volume +platform: all +run: jsk_robot_startup/auto_speak_volume_lower.l +interface: jsk_robot_startup/volume_lower.interface +icon: jsk_robot_startup/volume_lower.png \ No newline at end of file diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.interface b/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.interface new file mode 100644 index 0000000000..5cb4ae9816 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.interface @@ -0,0 +1,2 @@ +published_topics: {} +subscribed_topics: {} \ No newline at end of file diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.png b/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.png new file mode 100644 index 0000000000..d79825e859 Binary files /dev/null and b/jsk_robot_common/jsk_robot_startup/apps/volume_lower/volume_lower.png differ diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.app b/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.app new file mode 100644 index 0000000000..9b71b6cfb6 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.app @@ -0,0 +1,6 @@ +display: Volume Reset +description: robot speaks reset volume +platform: all +run: jsk_robot_startup/auto_speak_volume_reset.l +interface: jsk_robot_startup/volume_reset.interface +icon: jsk_robot_startup/volume_reset.png \ No newline at end of file diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.interface b/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.interface new file mode 100644 index 0000000000..5cb4ae9816 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.interface @@ -0,0 +1,2 @@ +published_topics: {} +subscribed_topics: {} \ No newline at end of file diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.png b/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.png new file mode 100644 index 0000000000..d9dbfbc14f Binary files /dev/null and b/jsk_robot_common/jsk_robot_startup/apps/volume_reset/volume_reset.png differ diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.app b/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.app new file mode 100644 index 0000000000..99cc7aecb2 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.app @@ -0,0 +1,6 @@ +display: Volume Zero +description: robot speaks zero volume +platform: all +run: jsk_robot_startup/auto_speak_volume_zero.l +interface: jsk_robot_startup/volume_zero.interface +icon: jsk_robot_startup/volume_zero.png \ No newline at end of file diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.interface b/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.interface new file mode 100644 index 0000000000..5cb4ae9816 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.interface @@ -0,0 +1,2 @@ +published_topics: {} +subscribed_topics: {} \ No newline at end of file diff --git a/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.png b/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.png new file mode 100644 index 0000000000..cb736a528e Binary files /dev/null and b/jsk_robot_common/jsk_robot_startup/apps/volume_zero/volume_zero.png differ diff --git a/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_lower.l b/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_lower.l new file mode 100755 index 0000000000..48c236a58c --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_lower.l @@ -0,0 +1,14 @@ +#!/usr/bin/env roseus + +(ros::roseus "speak_volume_lower") +(ros::set-dynamic-reconfigure-param "/audible_warning" "enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_tablet" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_uptime" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_warning" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_worktime" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/audible_warning" "volume" :double 0.2) +(ros::set-dynamic-reconfigure-param "/tweet_client_tablet" "volume" :double 0.2) +(ros::set-dynamic-reconfigure-param "/tweet_client_uptime" "volume" :double 0.2) +(ros::set-dynamic-reconfigure-param "/tweet_client_warning" "volume" :double 0.2) +(ros::set-dynamic-reconfigure-param "/tweet_client_worktime" "volume" :double 0.2) +(exit) diff --git a/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_reset.l b/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_reset.l new file mode 100755 index 0000000000..a57c51c262 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_reset.l @@ -0,0 +1,14 @@ +#!/usr/bin/env roseus + +(ros::roseus "speak_volume_reset") +(ros::set-dynamic-reconfigure-param "/audible_warning" "enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_tablet" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_uptime" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_warning" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/tweet_client_worktime" "speak_enable" :bool t) +(ros::set-dynamic-reconfigure-param "/audible_warning" "volume" :double 1.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_tablet" "volume" :double 1.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_uptime" "volume" :double 1.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_warning" "volume" :double 1.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_worktime" "volume" :double 1.0) +(exit) diff --git a/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_zero.l b/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_zero.l new file mode 100755 index 0000000000..e0bb7d2c43 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/lifelog/auto_speak_volume_zero.l @@ -0,0 +1,14 @@ +#!/usr/bin/env roseus + +(ros::roseus "speak_volume_zero") +(ros::set-dynamic-reconfigure-param "/audible_warning" "enable" :bool nil) +(ros::set-dynamic-reconfigure-param "/tweet_client_tablet" "speak_enable" :bool nil) +(ros::set-dynamic-reconfigure-param "/tweet_client_uptime" "speak_enable" :bool nil) +(ros::set-dynamic-reconfigure-param "/tweet_client_warning" "speak_enable" :bool nil) +(ros::set-dynamic-reconfigure-param "/tweet_client_worktime" "speak_enable" :bool nil) +(ros::set-dynamic-reconfigure-param "/audible_warning" "volume" :double 0.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_tablet" "volume" :double 0.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_uptime" "volume" :double 0.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_warning" "volume" :double 0.0) +(ros::set-dynamic-reconfigure-param "/tweet_client_worktime" "volume" :double 0.0) +(exit) diff --git a/jsk_robot_common/jsk_robot_startup/lifelog/tweet.launch b/jsk_robot_common/jsk_robot_startup/lifelog/tweet.launch index b22b0d066c..827bef6832 100644 --- a/jsk_robot_common/jsk_robot_startup/lifelog/tweet.launch +++ b/jsk_robot_common/jsk_robot_startup/lifelog/tweet.launch @@ -27,12 +27,21 @@ output="$(arg output)" respawn="true" > + + + account_info: $(arg account_info) + + + + + waking-time *waking-target-second*) - (incf *waking-target-second* *waking-tweet-second*) - ;; tweet source of robot-interface - (unless *src-lines* - (let* ((dirname (ros::rospack-find "pr2eus")) - (fname (format nil "~A/robot-interface.l" dirname)) - str) - (with-open-file (f fname) - (while (setq str (read-line f nil nil)) - (push str *src-lines*))) - (setq *src-lines* (nreverse *src-lines*)) - )) + (if *enable* + (progn + (setq *user-name* (ros::get-param "/active_user/launch_user_name") + *elapsed-time* (ros::get-param "/active_user/elapsed_time")) + ;; tweet depend on up time + (let ((st (ros::get-param "/active_user/start_time"))) + (when st + (let ((waking-time (- (send (ros::time-now) :to-sec) st))) + (ros::ros-debug "~A waking ~A sec (~A)" *robot-name* waking-time *waking-target-second*) + (when (> waking-time *waking-target-second*) + (incf *waking-target-second* (+ *waking-tweet-second* (random *tweet-random-range*))) + ;; tweet source of robot-interface + (unless *src-lines* + (let* ((dirname (ros::rospack-find "pr2eus")) + (fname (format nil "~A/robot-interface.l" dirname)) + str) + (with-open-file (f fname) + (while (setq str (read-line f nil nil)) + (push str *src-lines*))) + (setq *src-lines* (nreverse *src-lines*)) + )) - (let* ((len (length *src-lines*)) - (start-n (floor (random (float len) *random-state*))) - (spos 0) (str-len 0) lines) - (push (format nil "I am running ~A min." (round (/ waking-time 60.0))) - lines) - (incf str-len (length (car lines))) - (while (< (+ start-n spos) len) - (let ((str (elt *src-lines* (+ start-n spos)))) - (incf str-len (length str)) - (if (> str-len 140) (return)) - (push str lines)) - (incf spos)) - (let* ((ln (apply #'+ (length lines) - (mapcar #'(lambda (x) (length x)) lines))) - (dt (make-string (1- ln))) - (pos 0)) - (dolist (s (nreverse lines)) - (replace dt s :start1 pos) - (incf pos (length s)) - (if (< pos (- ln 2)) (setf (elt dt pos) 10)) - (incf pos)) - (tweet-string dt :warning-time 1 :with-image t) - )) - )))) + (let* ((len (length *src-lines*)) + (start-n (floor (random (float len) *random-state*))) + (spos 0) (str-len 0) lines) + (push (format nil "I am running ~A min." (round (/ waking-time 60.0))) + lines) + (incf str-len (length (car lines))) + (while (< (+ start-n spos) len) + (let ((str (elt *src-lines* (+ start-n spos)))) + (incf str-len (length str)) + (if (> str-len 140) (return)) + (push str lines)) + (incf spos)) + (let* ((ln (apply #'+ (length lines) + (mapcar #'(lambda (x) (length x)) lines))) + (dt (make-string (1- ln))) + (pos 0)) + (dolist (s (nreverse lines)) + (replace dt s :start1 pos) + (incf pos (length s)) + (if (< pos (- ln 2)) (setf (elt dt pos) 10)) + (incf pos)) + (tweet-string dt :warning-time 1 :with-image t + :speak *speak-enable* + :volume *volume*) + )))))))) + (ros::spin-once) (ros::sleep) ) diff --git a/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_warning.l b/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_warning.l index 7ec7e3dceb..0f0c1d1b03 100755 --- a/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_warning.l +++ b/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_warning.l @@ -2,41 +2,67 @@ (ros::roseus "twitter_client_warning") +(load "package://roseus/euslisp/dynamic-reconfigure-server.l") (load "package://jsk_robot_startup/lifelog/tweet_client.l") (ros::load-ros-manifest "diagnostic_msgs") +(setq *volume* (ros::get-param "~volume" 1.0)) +(setq *speak-enable* (ros::get-param "~speak_enable" t)) +(setq *enable* (ros::get-param "~enable" t)) +(setq *reconfigure-server* + (def-dynamic-reconfigure-server + ;;; ((name type level description (default) (min) (max) (edit_method)) ... ) + (("volume" double_t 0 "tweet speak volume" 1.0 0.0 1.0) + ("speak_enable" bool_t 0 "tweet speak enable" t) + ("enable" bool_t 0 "tweet enable" t)) + ;; use lamda-closure to avoid memory error + '(lambda-closure nil 0 0 (cfg level) + (let ((prev-volume *volume*) + (prev-speak-enable *speak-enable*) + (prev-enable *enable*)) + (setq *volume* (cdr (assoc "volume" cfg :test #'equal))) + (setq *speak-enable* (cdr (assoc "speak_enable" cfg :test #'equal))) + (setq *enable* (cdr (assoc "enable" cfg :test #'equal))) + (if (null (equal *volume* prev-volume)) + (ros::ros-warn "Volume changed to: ~A" *volume*)) + (if (null (equal *enable* prev-enable)) + (ros::ros-warn "Enable changed to: ~A" *enable*)) + (if (null (equal *speak-enable* prev-speak-enable)) + (ros::ros-warn "Speak enable changed to: ~A" *speak-enable*))) + cfg))) + (defun diagnostics-cb (msg) - (let ((diagnostics (make-hash-table :test #'equal)) - (tm (ros::time-now)) - status id) - (ros::ros-debug (format nil "~0,3f diagnostics_msgs~%" (send tm :to-sec))) - (dolist (status (send msg :status)) - ;; diagnostic_msgs::DiagnosticStatus::*WARN* - (when (>= (send status :level) diagnostic_msgs::DiagnosticStatus::*WARN*) ;; diagnostic_msgs::DiagnosticStatus::*ERROR*) - (cond ((substringp "/Motors" (send status :name)) - t) ;; skip motors - ((substringp "/Other/Accelerometer" (send status :name)) t) - ((substringp "/Other/Pressure" (send status :name)) t) - ((and (string= "/Computers/Network/Wifi Status (ddwrt)" (send status :name)) - (string= "Updates Stale" (send status :message))) t) - ((and (string= "/Computers/Network" (send status :name)) - (string= "Error" (send status :message))) t) - ((substringp "/Peripherals/PS3 Controller" (send status :name)) t) ;; fetch joystick warning - ((position #\/ (send status :name) :count 2) ;; check depth of name - (setq key (subseq (send status :name) 0 (position #\/ (send status :name) :count 2))) - (when (> (length (send status :name)) (length (gethash key diagnostics))) - (setf (gethash key diagnostics) (cons (send status :name) (send status :message))) - ) ;; when - )) - )) ;; when / dolist - (maphash #'(lambda (k v) (ros::ros-debug (format nil "Warnings ~A ~A~%" (length status) v)) (push v status)) diagnostics) - (when status - (setq id (random (length status))) - (when (= (mod (round (send tm :sec)) 1000) 0) - (tweet-string (format nil "Warning!! ~A is ~A at ~0,3f" (car (elt status id)) (cdr (elt status id)) (send tm :to-sec)) - :warning-time 1 :with-image t) - )) ;; when - )) ;; let + (if *enable* + (let ((diagnostics (make-hash-table :test #'equal)) + (tm (ros::time-now)) + status id) + (ros::ros-debug (format nil "~0,3f diagnostics_msgs~%" (send tm :to-sec))) + (dolist (status (send msg :status)) + ;; diagnostic_msgs::DiagnosticStatus::*WARN* + (when (>= (send status :level) diagnostic_msgs::DiagnosticStatus::*WARN*) ;; diagnostic_msgs::DiagnosticStatus::*ERROR*) + (cond ((substringp "/Motors" (send status :name)) + t) ;; skip motors + ((substringp "/Other/Accelerometer" (send status :name)) t) + ((substringp "/Other/Pressure" (send status :name)) t) + ((and (string= "/Computers/Network/Wifi Status (ddwrt)" (send status :name)) + (string= "Updates Stale" (send status :message))) t) + ((and (string= "/Computers/Network" (send status :name)) + (string= "Error" (send status :message))) t) + ((substringp "/Peripherals/PS3 Controller" (send status :name)) t) ;; fetch joystick warning + ((position #\/ (send status :name) :count 2) ;; check depth of name + (setq key (subseq (send status :name) 0 (position #\/ (send status :name) :count 2))) + (when (> (length (send status :name)) (length (gethash key diagnostics))) + (setf (gethash key diagnostics) (cons (send status :name) (send status :message))) + ) ;; when + )) + )) ;; when / dolist + (maphash #'(lambda (k v) (ros::ros-debug (format nil "Warnings ~A ~A~%" (length status) v)) (push v status)) diagnostics) + (when status + (setq id (random (length status))) + (when (= (mod (round (send tm :sec)) 1000) 0) + (tweet-string (format nil "Warning!! ~A is ~A at ~0,3f" (car (elt status id)) (cdr (elt status id)) (send tm :to-sec)) + :warning-time 1 :with-image t :volume *volume* :speak *speak-enable*))) + ))) (ros::advertise "/tweet" std_msgs::String 1) (ros::subscribe "/diagnostics_agg" diagnostic_msgs::DiagnosticArray #'diagnostics-cb) diff --git a/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_worktime.l b/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_worktime.l index dac8769842..52baa59aaf 100755 --- a/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_worktime.l +++ b/jsk_robot_common/jsk_robot_startup/lifelog/tweet_client_worktime.l @@ -2,6 +2,7 @@ (ros::roseus "twitter_client_worktime") +(load "package://roseus/euslisp/dynamic-reconfigure-server.l") (load "package://jsk_robot_startup/lifelog/tweet_client.l") (defvar *robot-name* "robot") @@ -34,49 +35,78 @@ (t (setq *waking-target-second* *waking-tweet-second*))) +(setq *volume* (ros::get-param "~volume" 1.0)) +(setq *speak-enable* (ros::get-param "~speak_enable" t)) +(setq *enable* (ros::get-param "~enable" t)) +(setq *reconfigure-server* + (def-dynamic-reconfigure-server + ;;; ((name type level description (default) (min) (max) (edit_method)) ... ) + (("volume" double_t 0 "tweet speak volume" 1.0 0.0 1.0) + ("speak_enable" bool_t 0 "tweet speak enable" t) + ("enable" bool_t 0 "tweet enable" t)) + ;; use lamda-closure to avoid memory error + '(lambda-closure nil 0 0 (cfg level) + (let ((prev-volume *volume*) + (prev-speak-enable *speak-enable*) + (prev-enable *enable*)) + (setq *volume* (cdr (assoc "volume" cfg :test #'equal))) + (setq *speak-enable* (cdr (assoc "speak_enable" cfg :test #'equal))) + (setq *enable* (cdr (assoc "enable" cfg :test #'equal))) + (if (null (equal *volume* prev-volume)) + (ros::ros-warn "Volume changed to: ~A" *volume*)) + (if (null (equal *enable* prev-enable)) + (ros::ros-warn "Enable changed to: ~A" *enable*)) + (if (null (equal *speak-enable* prev-speak-enable)) + (ros::ros-warn "Speak enable changed to: ~A" *speak-enable*))) + cfg))) + (ros::advertise "/tweet" std_msgs::String 1) (ros::rate 0.1) (do-until-key - (setq *user-name* (ros::get-param "/active_user/launch_user_name") - *elapsed-time* (ros::get-param "/active_user/elapsed_time")) - (ros::ros-debug "user -> ~A, time -> ~A (~A) " - *user-name* *elapsed-time* *target-second*) - ;; tweet depend on working time - (when (> *elapsed-time* *target-second*) - (incf *target-second* *tweet-second* ) - (ros::ros-info "tweet ~A ~A" *user-name* *elapsed-time*) - (let ((mainstr (format nil "~A has used ~A for ~d minutes" - ;; why delete *user-name* after space ? - ;;(subseq *user-name* 0 - ;;(or (position #\space *user-name*) - ;;(length *user-name*))) - *user-name* - *robot-name* - (round (/ *elapsed-time* 60)))) - presubstr postsubstr) - (cond - ((< *elapsed-time* 600) ;; 5 min - (setq presubstr "Congratulations! " - postsubstr ", Let's get started!")) - ((< *elapsed-time* 910) ;; 15 min - (setq presubstr "Gooood! " - postsubstr ", Go ahead!")) - ((< *elapsed-time* 1820) ;; 30 min - (setq presubstr "So Nice! " - postsubstr ", Go ahead!")) - ((< *elapsed-time* 2730) ;; 45 min - (setq presubstr "Fantastic! " - postsubstr ", Keep going!")) - ((< *elapsed-time* 3640) ;; 60 min - (setq presubstr "Amazing! " - postsubstr ", I'm not tired!")) - (t - (setq presubstr "Awesome! " - postsubstr ", Got some rest?"))) - - (tweet-string (format nil "~A~A~A" presubstr mainstr postsubstr) - :warning-time 1 :with-image t) + (if *enable* + (progn + (setq *user-name* (ros::get-param "/active_user/launch_user_name") + *elapsed-time* (ros::get-param "/active_user/elapsed_time")) + (ros::ros-debug "user -> ~A, time -> ~A (~A) " + *user-name* *elapsed-time* *target-second*) + ;; tweet depend on working time + (when (> *elapsed-time* *target-second*) + (incf *target-second* *tweet-second* ) + (ros::ros-info "tweet ~A ~A" *user-name* *elapsed-time*) + (let ((mainstr (format nil "~A has used ~A for ~d minutes" + ;; why delete *user-name* after space ? + ;;(subseq *user-name* 0 + ;;(or (position #\space *user-name*) + ;;(length *user-name*))) + *user-name* + *robot-name* + (round (/ *elapsed-time* 60)))) + presubstr postsubstr) + (cond + ((< *elapsed-time* 600) ;; 5 min + (setq presubstr "Congratulations! " + postsubstr ", Let's get started!")) + ((< *elapsed-time* 910) ;; 15 min + (setq presubstr "Gooood! " + postsubstr ", Go ahead!")) + ((< *elapsed-time* 1820) ;; 30 min + (setq presubstr "So Nice! " + postsubstr ", Go ahead!")) + ((< *elapsed-time* 2730) ;; 45 min + (setq presubstr "Fantastic! " + postsubstr ", Keep going!")) + ((< *elapsed-time* 3640) ;; 60 min + (setq presubstr "Amazing! " + postsubstr ", I'm not tired!")) + (t + (setq presubstr "Awesome! " + postsubstr ", Got some rest?"))) - )) + (tweet-string (format nil "~A~A~A" presubstr mainstr postsubstr) + :warning-time 1 :with-image t + :speak *speak-enable* + :volume *volume*) + )))) + (ros::spin-once) (ros::sleep) ) diff --git a/jsk_robot_common/jsk_robot_startup/scripts/smach_to_mail.py b/jsk_robot_common/jsk_robot_startup/scripts/smach_to_mail.py index dee5af4b08..f74cbe095c 100755 --- a/jsk_robot_common/jsk_robot_startup/scripts/smach_to_mail.py +++ b/jsk_robot_common/jsk_robot_startup/scripts/smach_to_mail.py @@ -45,9 +45,13 @@ def __init__(self): self.pub_twitter = rospy.Publisher("tweet", String, queue_size=10) rospy.Subscriber( "~smach/container_status", SmachContainerStatus, self._status_cb) + rospy.Timer(rospy.Duration( + rospy.get_param("~stop_duration", 3600)), self._stop_timer_cb) self.bridge = CvBridge() self.smach_state_list = {} # for status list self.smach_state_subject = {} # for status subject + self.smach_start_time = {} + self.timeout = rospy.get_param("~timeout", 1200) if rospy.has_param("~sender_address"): self.sender_address = rospy.get_param("~sender_address") else: @@ -69,6 +73,27 @@ def __init__(self): self.gchat_image_dir = rospy.get_param("~google_chat_tmp_image_dir", "/tmp") self._gchat_thread = None + def _stop_timer_cb(self, event): + ''' + If smach does not go to finish/end state, + this is forced to send notification. + ''' + now = rospy.Time.now() + rospy.logdebug("SmachToMail stop timer called") + if (self.smach_state_list and + self.smach_state_subject and + self.timeout is not None and + self.smach_start_time is not None): + for key in self.smach_state_list.keys(): + if (now - self.smach_start_time[key]).to_sec() > self.timeout: + self._send_mail( + self.smach_state_subject[key], self.smach_state_list[key]) + self._send_twitter( + self.smach_state_subject[key], self.smach_state_list[key]) + self.smach_state_subject[key] = None + rospy.logwarn( + "SmachToMail timer publishes stop signal. Send Notification.") + def _status_cb(self, msg): ''' Recording starts when smach_state becomes start. @@ -109,6 +134,7 @@ def _status_cb(self, msg): # If we received START/INIT status, restart storing smach_state_list if status_str in ["START", "INIT"]: + self.smach_start_time[caller_id] = rospy.Time.now() self.smach_state_list[caller_id] = [] # DESCRIPTION of START is MAIL SUBJECT if 'DESCRIPTION' in local_data_str: diff --git a/jsk_robot_common/jsk_robot_startup/scripts/update_workspace_main.sh b/jsk_robot_common/jsk_robot_startup/scripts/update_workspace_main.sh new file mode 100755 index 0000000000..053f0fcfd3 --- /dev/null +++ b/jsk_robot_common/jsk_robot_startup/scripts/update_workspace_main.sh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash + +function usage() +{ + echo "Usage: $0 [-w workspace_directory] [-r rosinstall_path] [-t robot_type] [-s skip keys] [-h] [-u] [-l] + +optional arguments: + -h show this help + -w WORKSPACE_PATH specify target workspace + -r ROSINTALL_PATH rosinstall path + -t ROBOT robot type + -s SKIP_KEYS rosdep install skip keys + -u do not run apt-get upgrade and rosdep install + -l do not send a mail +" +} + +function get_full_path() +{ + echo "$(cd $(dirname $1) && pwd)/$(basename $1)" +} + +ROSDEP_INSTALL=true +SEND_MAIL=true +WORKSPACE=$(get_full_path $HOME/ros/$ROS_DISTRO) + +while getopts w:r:t:s:ulh OPT +do + case $OPT in + w) + WORKSPACE=$(get_full_path $OPTARG) + ;; + r) + ROSINSTALL=$(get_full_path $OPTARG) + ;; + t) + ROBOT_TYPE=$OPTARG + ;; + s) + SKIP_KEYS=$OPTARG + ;; + u) + ROSDEP_INSTALL=false + ;; + l) + SEND_MAIL=false + ;; + h) + usage + exit 1 + ;; + *) + usage + exit 1 + ;; + esac +done + +if [ "$WORKSPACE" = "" ]; then + echo "Please set valid workspace -w $WORKSPACE" + exit 1 +fi +if [ "$ROSINSTALL" = "" ]; then + echo "Please set valid rosinstall -r $ROSINSTALL" + exit 1 +fi +if [ "$ROBOT_TYPE" = "" ]; then + echo "Please set valid robot type -t $ROBOT_TYPE" + exit 1 +fi + + +. $WORKSPACE/devel/setup.bash +# Filename should end with .txt to preview the contents in a web browser +LOGFILE=$WORKSPACE/update_workspace.txt + +TMP_MAIL_BODY_FILE=/tmp/update_workspace_mailbody.txt + +{ +set -x +# Update workspace + +wstool foreach -t $WORKSPACE/src --git 'git stash' +wstool foreach -t $WORKSPACE/src --git 'git fetch origin --prune' +wstool update -t $WORKSPACE/src jsk-ros-pkg/jsk_robot --delete-changed-uris +ln -sf $ROSINSTALL $WORKSPACE/src/.rosinstall +wstool update -t $WORKSPACE/src --delete-changed-uris +# Forcefully checkout specified branch +wstool foreach -t $WORKSPACE/src --git --shell 'branchname=$(git rev-parse --abbrev-ref HEAD); if [ $branchname != "HEAD" ]; then git reset --hard HEAD; git checkout origin/$branchname; git branch -D $branchname; git checkout -b $branchname --track origin/$branchname; fi' +wstool update -t $WORKSPACE/src +WSTOOL_UPDATE_RESULT=$? +# Rosdep Install +if [ "${ROSDEP_INSTALL}" == "true" ]; then + sudo apt-get update -y; + rosdep update; + rosdep install --from-paths $WORKSPACE/src --ignore-src -y -r --skip-keys "$SKIP_KEYS"; + ROSDEP_INSTALL_RESULT=$?; +else + ROSDEP_INSTALL_RESULT=0; +fi +# Build workspace +cd $WORKSPACE +catkin clean aques_talk collada_urdf_jsk_patch libcmt -y +catkin init +catkin config -DCMAKE_BUILD_TYPE=Release +catkin build --continue-on-failure +CATKIN_BUILD_RESULT=$? +# Send mail +echo "" > $TMP_MAIL_BODY_FILE +if [ $WSTOOL_UPDATE_RESULT -ne 0 ]; then + echo "Please wstool update workspace manually.\n" >> $TMP_MAIL_BODY_FILE +fi +if [ $ROSDEP_INSTALL_RESULT -ne 0 ]; then + echo "Please install dependencies manually.\n" >> $TMP_MAIL_BODY_FILE +fi +if [ $CATKIN_BUILD_RESULT -ne 0 ]; then + echo "Please catkin build workspace manually.\n" >> $TMP_MAIL_BODY_FILE +fi +set +x +} 2>&1 | tee $LOGFILE + +# MAIL_BODY variable cannot be set directly in a subshell. So it is set from temporary mail body text file. +# The mail body text is put as $TMP_MAIL_BODY_FILE. +# See https://github.com/jsk-ros-pkg/jsk_robot/issues/1569 +MAIL_BODY=$(cat $TMP_MAIL_BODY_FILE) +echo "MAIL_BODY: $MAIL_BODY" + +if [ -n "$MAIL_BODY" ] && [ "${SEND_MAIL}" == "true" ]; then + echo "Sent a mail" + rostopic pub -1 /email jsk_robot_startup/Email "header: + seq: 0 + stamp: {secs: 0, nsecs: 0} + frame_id: '' +subject: 'Daily workspace update fails' +body: +- {type: 'text', message: '${MAIL_BODY}', file_path: '', img_data: '', img_size: 0} +sender_address: '$(hostname)@jsk.imi.i.u-tokyo.ac.jp' +receiver_address: '$ROBOT_TYPE@jsk.imi.i.u-tokyo.ac.jp' +smtp_server: '' +smtp_port: '' +attached_files: ['$LOGFILE']" +fi