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