diff --git a/stretch_body/jupyter/example_head_scan.yaml b/stretch_body/jupyter/example_head_scan.yaml new file mode 100644 index 0000000..de27964 --- /dev/null +++ b/stretch_body/jupyter/example_head_scan.yaml @@ -0,0 +1,108 @@ +base_link_to_image_mat: +- - 166.66666666666666 + - 0.0 + - 0.0 + - 1331.3333333333333 +- - 0.0 + - -166.66666666666666 + - 0.0 + - 1331.3333333333333 +- - 0.0 + - 0.0 + - 215.2542372881356 + - 11.762711864406782 +- - 0.0 + - 0.0 + - 0.0 + - 1.0 +base_link_to_map_mat: +- - 1.0 + - 0.0 + - 0.0 + - 0.0 +- - 0.0 + - 1.0 + - 0.0 + - 0.0 +- - 0.0 + - 0.0 + - 1.0 + - 0.0 +- - 0.0 + - 0.0 + - 0.0 + - 1.0 +image_to_base_link_mat: +- - 0.006 + - 0.0 + - 0.0 + - -7.988 +- - 0.0 + - -0.006 + - 0.0 + - 7.9879999999999995 +- - 0.0 + - 0.0 + - 0.0046456692913385824 + - -0.054645669291338586 +- - 0.0 + - 0.0 + - 0.0 + - 1.0 +image_to_map_mat: +- - 0.006 + - 0.0 + - 0.0 + - -7.988 +- - 0.0 + - -0.006 + - 0.0 + - 7.9879999999999995 +- - 0.0 + - 0.0 + - 0.0046456692913385824 + - -0.054645669291338586 +- - 0.0 + - 0.0 + - 0.0 + - 1.0 +map_to_base_mat: +- - 1.0 + - 0.0 + - 0.0 + - 0.0 +- - 0.0 + - 1.0 + - 0.0 + - 0.0 +- - 0.0 + - 0.0 + - 1.0 + - 0.0 +- - 0.0 + - 0.0 + - 0.0 + - 1.0 +map_to_image_mat: +- - 166.66666666666666 + - 0.0 + - 0.0 + - 1331.3333333333333 +- - 0.0 + - -166.66666666666666 + - 0.0 + - 1331.3333333333333 +- - 0.0 + - 0.0 + - 215.2542372881356 + - 11.762711864406782 +- - 0.0 + - 0.0 + - 0.0 + - 1.0 +max_height_image_base_filename: /home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan_mhi +robot_ang_rad: -0.0 +robot_xy_pix: +- 1331.3333333333333 +- 1331.3333333333333 +timestamp: 1681960427.1463504 diff --git a/stretch_body/jupyter/example_head_scan_mhi.yaml b/stretch_body/jupyter/example_head_scan_mhi.yaml new file mode 100644 index 0000000..82d2de5 --- /dev/null +++ b/stretch_body/jupyter/example_head_scan_mhi.yaml @@ -0,0 +1,36 @@ +camera_depth_image_filename: /home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan_mhi_camera_depth.png +image.dtype: uint8 +image.shape: +- 2667 +- 2667 +image_filename: /home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan_mhi_image.npy.gz +image_origin: +- 0.012 +- 15.988 +- 0.0 +m_per_height_unit: 0.0046456692913385824 +m_per_pix: 0.006 +np.max(image): null +rgb_image_filename: /home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan_mhi_rgb.png +transform_corrected_to_original: null +transform_original_to_corrected: null +visualization_filename: /home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan_mhi_visualization.png +voi_data: + axes: + - - 1.0 + - 0.0 + - 0.0 + - - 0.0 + - 1.0 + - 0.0 + - - 0.0 + - 0.0 + - 1.0 + frame_id: map + origin: + - -8.0 + - -8.0 + - -0.05 + x_in_m: 16.0 + y_in_m: 16.0 + z_in_m: 1.18 diff --git a/stretch_body/jupyter/example_head_scan_mhi_camera_depth.png b/stretch_body/jupyter/example_head_scan_mhi_camera_depth.png new file mode 100644 index 0000000..183703d Binary files /dev/null and b/stretch_body/jupyter/example_head_scan_mhi_camera_depth.png differ diff --git a/stretch_body/jupyter/example_head_scan_mhi_image.npy.gz b/stretch_body/jupyter/example_head_scan_mhi_image.npy.gz new file mode 100644 index 0000000..6623034 Binary files /dev/null and b/stretch_body/jupyter/example_head_scan_mhi_image.npy.gz differ diff --git a/stretch_body/jupyter/example_head_scan_mhi_rgb.png b/stretch_body/jupyter/example_head_scan_mhi_rgb.png new file mode 100644 index 0000000..190a2f5 Binary files /dev/null and b/stretch_body/jupyter/example_head_scan_mhi_rgb.png differ diff --git a/stretch_body/jupyter/example_head_scan_mhi_visualization.png b/stretch_body/jupyter/example_head_scan_mhi_visualization.png new file mode 100644 index 0000000..5cc5c2e Binary files /dev/null and b/stretch_body/jupyter/example_head_scan_mhi_visualization.png differ diff --git a/stretch_body/jupyter/funmap_experiments.ipynb b/stretch_body/jupyter/funmap_experiments.ipynb index ed1e810..9979308 100644 --- a/stretch_body/jupyter/funmap_experiments.ipynb +++ b/stretch_body/jupyter/funmap_experiments.ipynb @@ -31,8 +31,8 @@ "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Collecting git+https://github.com/safijari/tiny_tf.git\n", - " Cloning https://github.com/safijari/tiny_tf.git to /tmp/pip-req-build-192cxjlh\n", - " Running command git clone --filter=blob:none --quiet https://github.com/safijari/tiny_tf.git /tmp/pip-req-build-192cxjlh\n", + " Cloning https://github.com/safijari/tiny_tf.git to /tmp/pip-req-build-qaor8p3r\n", + " Running command git clone --filter=blob:none --quiet https://github.com/safijari/tiny_tf.git /tmp/pip-req-build-qaor8p3r\n", " Resolved https://github.com/safijari/tiny_tf.git to commit 6d28b69dfde971f5ed63ff24de5c84b950690997\n", " Preparing metadata (setup.py) ... \u001b[?25ldone\n", "\u001b[?25hRequirement already satisfied: numpy in /home/hello-robot/.local/lib/python3.8/site-packages (from tiny-tf==1.2.0) (1.22.4)\n" @@ -54,6 +54,8 @@ "import cv2\n", "import time\n", "import math\n", + "import gzip\n", + "import yaml\n", "import pathlib\n", "import ros_numpy\n", "import numpy as np\n", @@ -89,99 +91,7 @@ "execution_count": 3, "id": "7460aa2c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------- Homing Head ----\n", - "--------- Homing Lift ----\n", - "Homing Lift...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[INFO] [robot_monitor]: Guarded contact lift\n", - "[INFO] [robot_monitor]: Wrist single tap: 4\n", - "[INFO] [robot_monitor]: Base bump event\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hardstop detected at motor position (rad) 88.93499755859375\n", - "Marking Lift position to 1.096228 (m)\n", - "Marking Lift position to 0.000000 (m)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[INFO] [robot_monitor]: Base bump event\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Lift homing successful\n", - "--------- Homing Arm ----\n", - "Homing Arm...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[INFO] [robot_monitor]: Guarded contact arm\n", - "[INFO] [robot_monitor]: Wrist single tap: 6\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hardstop detected at motor position (rad) 1.4693927764892578\n", - "Marking Arm position to 0.000000 (m)\n", - "Arm homing successful\n", - "--------- Homing stretch_gripper ----\n", - "Moving to first hardstop...\n", - "First hardstop contact at position (ticks): 4098\n", - "-----\n", - "Homing offset was 4401\n", - "Marking current position to zero ticks\n", - "Homing offset is now 303 (ticks)\n", - "-----\n", - "Current position (ticks): 13\n", - "Moving to calibrated zero: (rad)\n", - "--------- Homing wrist_yaw ----\n", - "Moving to first hardstop...\n", - "First hardstop contact at position (ticks): -4102\n", - "-----\n", - "Homing offset was -2156\n", - "Marking current position to zero ticks\n", - "Homing offset is now 1938 (ticks)\n", - "-----\n", - "Current position (ticks): 41\n", - "Moving to calibrated zero: (rad)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[INFO] [robot_monitor]: Wrist single tap: 8\n", - "[INFO] [robot_monitor]: Wrist single tap: 9\n", - "[INFO] [robot_monitor]: Wrist single tap: 12\n", - "[INFO] [robot_monitor]: Wrist single tap: 16\n", - "[INFO] [robot_monitor]: Wrist single tap: 17\n" - ] - } - ], + "outputs": [], "source": [ "# Setup the Python API to Stretch\n", "robot = Robot()\n", @@ -195,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "033774e1", "metadata": {}, "outputs": [ @@ -224,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "id": "96f891c9", "metadata": {}, "outputs": [], @@ -289,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "c443b5c1", "metadata": {}, "outputs": [], @@ -360,6 +270,89 @@ " time.sleep(1)" ] }, + { + "cell_type": "markdown", + "id": "6b0c49ee-f327-45db-b328-ab20fde443e1", + "metadata": {}, + "source": [ + "Last up, we'll emulate some ROS messages and the rospy library." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "228b8825-320a-442b-827c-4aede6e4e644", + "metadata": {}, + "outputs": [], + "source": [ + "class HeaderMsg:\n", + " def __init__(self):\n", + " self.seq = 0\n", + " self.stamp = time.time()\n", + " self.frame_id = ''\n", + "\n", + "class PointCloud2Msg:\n", + " def __init__(self):\n", + " self.header = HeaderMsg()\n", + " self.height = 1080\n", + " self.width = 1280\n", + " self.fields = None\n", + " self.is_bigendian = None\n", + " self.point_step = None\n", + " self.row_step = None\n", + " self.data = [0]\n", + " self.is_dense = None\n", + "\n", + "class Vector3Msg:\n", + " def __init__(self):\n", + " self.x = None\n", + " self.y = None\n", + " self.z = None\n", + "\n", + "class QuaternionMsg:\n", + " def __init__(self):\n", + " self.x = None\n", + " self.y = None\n", + " self.z = None\n", + " self.w = None\n", + "\n", + "class TransformMsg:\n", + " def __init__(self):\n", + " self.translation = Vector3Msg()\n", + " self.rotation = QuaternionMsg()\n", + "\n", + "class TransformStampedMsg:\n", + " def __init__(self):\n", + " self.header = HeaderMsg()\n", + " self.child_frame_id = 'fake_link'\n", + " self.transform = TransformMsg()\n", + "\n", + "class TF2Manager:\n", + " def __init__(self):\n", + " pass\n", + " def lookup_transform(self, from_frame_id, to_frame_id, lookup_time, timeout):\n", + " return TransformStampedMsg()\n", + "\n", + "class Time:\n", + " def __init__(self):\n", + " pass\n", + " def now(self):\n", + " return time.time()\n", + "\n", + "class RospyManager:\n", + " def __init__(self):\n", + " self.Time = Time()\n", + "\n", + " def sleep(self, x):\n", + " #print(f'via rospy.sleep: sleeping {x} seconds')\n", + " time.sleep(x)\n", + "\n", + " def loginfo(self, msg):\n", + " print('via rospy.loginfo: ' + msg)\n", + "\n", + "rospy = RospyManager()" + ] + }, { "cell_type": "markdown", "id": "390a3f70-b7ed-4a08-b811-fd6819c2810a", @@ -375,7 +368,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "e2396e2f", "metadata": {}, "outputs": [], @@ -518,7 +511,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "1fed3d42", "metadata": {}, "outputs": [], @@ -539,82 +532,7 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "f06a3958", - "metadata": {}, - "outputs": [], - "source": [ - "class HeaderMsg:\n", - " def __init__(self):\n", - " self.seq = 0\n", - " self.stamp = time.time()\n", - " self.frame_id = ''\n", - "\n", - "class PointCloud2Msg:\n", - " def __init__(self):\n", - " self.header = HeaderMsg()\n", - " self.height = 1080\n", - " self.width = 1280\n", - " self.fields = None\n", - " self.is_bigendian = None\n", - " self.point_step = None\n", - " self.row_step = None\n", - " self.data = [0]\n", - " self.is_dense = None\n", - "\n", - "class Vector3Msg:\n", - " def __init__(self):\n", - " self.x = None\n", - " self.y = None\n", - " self.z = None\n", - "\n", - "class QuaternionMsg:\n", - " def __init__(self):\n", - " self.x = None\n", - " self.y = None\n", - " self.z = None\n", - " self.w = None\n", - "\n", - "class TransformMsg:\n", - " def __init__(self):\n", - " self.translation = Vector3Msg()\n", - " self.rotation = QuaternionMsg()\n", - "\n", - "class TransformStampedMsg:\n", - " def __init__(self):\n", - " self.header = HeaderMsg()\n", - " self.child_frame_id = 'fake_link'\n", - " self.transform = TransformMsg()\n", - "\n", - "class TF2Manager:\n", - " def __init__(self):\n", - " pass\n", - " def lookup_transform(self, from_frame_id, to_frame_id, lookup_time, timeout):\n", - " return TransformStampedMsg()\n", - "\n", - "class Time:\n", - " def __init__(self):\n", - " pass\n", - " def now(self):\n", - " return time.time()\n", - "\n", - "class RospyManager:\n", - " def __init__(self):\n", - " self.Time = Time()\n", - "\n", - " def sleep(self, x):\n", - " print(f'via rospy.sleep: sleeping {x} seconds')\n", - " time.sleep(x)\n", - "\n", - " def loginfo(self, msg):\n", - " print('via rospy.loginfo: ' + msg)\n", - "\n", - "rospy = RospyManager()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "e889d16e", "metadata": {}, "outputs": [], @@ -1090,7 +1008,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "f5b4b144", "metadata": {}, "outputs": [], @@ -1504,7 +1422,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "92ad0117", "metadata": {}, "outputs": [], @@ -1675,7 +1593,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "37c0e390", "metadata": {}, "outputs": [], @@ -1762,7 +1680,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "d046c1d0", "metadata": {}, "outputs": [], @@ -1838,7 +1756,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "f5610c35", "metadata": {}, "outputs": [], @@ -2108,7 +2026,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "id": "c67281e1", "metadata": {}, "outputs": [ @@ -2128,109 +2046,21 @@ "FakeRobot.move_to_pose: sleeping 1 second\n", "Moving to {'joint_head_pan': -3.6}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", "Moving to {'joint_head_pan': -2.7583333333333333}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", "Moving to {'joint_head_pan': -1.9166666666666667}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", "Moving to {'joint_head_pan': -1.0750000000000002}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", "Moving to {'joint_head_pan': -0.2333333333333334}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", "Moving to {'joint_head_pan': 0.608333333333333}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", "Moving to {'joint_head_pan': 1.45}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", "Moving to {'joint_head_pan': 0.1, 'joint_head_tilt': -1.2}\n", "FakeRobot.move_to_pose: sleeping 1 second\n", - "via rospy.sleep: sleeping 0.5 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.sleep: sleeping 0.06666666666666667 seconds\n", - "via rospy.loginfo: The head scan took 20.203986644744873 seconds.\n" + "via rospy.loginfo: The head scan took 20.034795999526978 seconds.\n" ] } ], @@ -2242,9 +2072,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "7a0f7a53", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HeadScan: Saving to base_filename = /home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan\n", + "MaxHeightImage saving to base_filename = /home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan_mhi\n", + "Finished saving.\n", + "Finished saving.\n" + ] + } + ], + "source": [ + "head_scan.save(\"/home/hello-robot/repos/stretch_tutorials/stretch_body/jupyter/example_head_scan\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fa6d347-1a0b-4303-b3f4-40a1d5dd3615", + "metadata": {}, "outputs": [], "source": [] }