# Omniverse usage Record about the problem i met and how to solve ## Open Problem if you can't open it directly with double click or it continued circling ### 1. use terminal to open it, it can see bug message if exist ### 2. open cmd type in ``` ./omniverse-launcher-linux.AppImage ``` if don't know dir ``` sudo find / -type f -name "omniverse-launcher-linux.AppImage" 2>/dev/null cd the/path/you/found ``` ### 3. checkout problem ``` create mount dir error: No space left on device ``` this problem due to default tmp file is full ### 4. solve give/make another file dir for tmp record ``` TMPDIR=/path/to/tmp ./omniverse-launcher-linux.AppImage ``` then the window will come out to log in. ### ex: other's similar problem and solve https://blog.csdn.net/zkf0100007/article/details/143645806 ## localhost(NUCLEUS) service is not accessible. ![圖片](https://hackmd.io/_uploads/ByvUWCPiJe.png) ### 1. Remove some setup of Omniverse ***Please make sure the acount for administrator first*** ``` rm -rf ~/.nvidia-omniverse rm -rf ~/.config/omniverse-launcher rm -rf ~/.cache/omniverse rm -rf ~/.cache/ov rm -rf /tmp/.mount_omnive* ``` 1. ~/.nvidia-omniverse 這是 NVIDIA Omniverse 的配置目錄。刪除這個資料夾會移除 Omniverse 相關的所有本地設定,包括用戶配置和一些本地伺服器的設定。 可能丟失的配置:本地伺服器(Nucleus)配置。用戶資料和偏好設定。本地安裝的插件和模組。 2. ~/.config/omniverse-launcher 這是 Omniverse Launcher 的配置目錄。刪除此資料夾會清除 Omniverse Launcher 的設定,包括其啟動配置和用戶資料。 可能丟失的配置:Launcher 的啟動設置和偏好。註冊的伺服器信息(如本地伺服器地址)。登錄帳號資訊和授權資料。 3. ~/.cache/omniverse 這是 Omniverse 的快取資料夾,包含了系統運行過程中的暫存數據,例如已下載的資源、場景預覽、緩存文件等。 可能丟失的數據:下載的資源、模組、場景文件的快取。圖形和其他媒體資源的臨時文件。 4. ~/.cache/ov 這是 Omniverse 相關的快取資料夾,包含了其他暫時性和運行時數據。 可能丟失的數據:Omniverse 客戶端和其他資源的緩存文件。 5. /tmp/.mount_omnive 這是 Omniverse AppImage 安裝後創建的暫存資料夾,通常會包含啟動過程中的臨時掛載資料。這些資料夾的刪除不會對配置或數據造成永久性損失,但如果有掛載過程中的資料,會導致未能正確啟動應用。 可能丟失的數據: 當前正在運行或掛載的應用臨時資料 ### 2. follow the instruction to setup the path and administration. ### 3. connect to local host defalt username/pssword : admin/admin # Spot routing usage the Instruction of Isaac sim usage base on IsaacSim_Routing from : https://github.com/BruceLin90620/IsaacSim_Routing ## Spot_routing download ### 1. following the readme set up the environment and git ``` git clone https://github.com/BruceLin90620/IsaacSim_Routing.git ``` advice: use ``` conda create --name myenv python=3.10 ``` ### 2. the path change I installed in filename : isaac_routing/src 1. Launch Isaac Sim Spot Navigation ``` cd /home/bruce/.local/share/ov/pkg/isaac-sim-4.2.0 ./python.sh standalone_examples/api/omni.isaac.quadruped/spot_nav_standalone.py --env lab ``` -> ``` cd /home/user/isaac_routing/src/standalone python3 spot_nav_standalone.py --env lab ``` 2.Launch ROS 2 Navigation remember to ``` colcon build source install/setup.bash ``` and path chage for last steps ``` cd /home/bruce/IsaacSim/IsaacSim-ros_workspaces/humble_ws ``` -> ``` cd /home/user/isaac_routing/src ``` 3. follow steps, open 3 terminal and run one by one. ``` ros2 launch spot_config navigate.launch.py rviz:=true ``` ``` ros2 launch routing_agent RunServer.launch.py ``` ``` ros2 run spot_routing_nav waypoint_nav ``` ## Open .usd ``` ~/IsaacLab_new/IsaacLab$ ./isaaclab.sh -s ``` # Change the map 變更或擴增地圖及機器人得初始位置定位 位置接須以手動來進行校正才能獲得 地圖需有 .usd 和 .yaml 檔 ## 加入地圖製程式中 (舊) ### 1. spot_nav_standalone.py ![圖片](https://hackmd.io/_uploads/rJv5VIjAyx.png) ![圖片](https://hackmd.io/_uploads/HkB_pBsRyg.png) 將路徑加入並寫入判別式和 add_argument 的 choice 內, position、orientation 在啟動程式後於 isaac Sim 中 確認位置再進行修改 ``` python3 spot_nav_standalone.py --env lab ``` 調整 --env 後的地圖代號即可, 有時燈源會有誤,記得開啟燈源(Defalt 即可) ![圖片](https://hackmd.io/_uploads/BJs058i0kg.png) ### 2.navigate.launch. py ``` ros2 launch spot_config navigate.launch.py rviz:=true map:=/home/csl/isaac_routing/src/champ/spot_config/maps/tsmc_1f.yaml ``` 將要使用的 地圖 .yaml 路徑置於 map: 後,即可啟動對應路徑的 rviz ### 3.設定初始位置 依過去順序啟動修改過地圖的 isaac sim 和 rviz 後,透過 rviz 上列的 2D Pose Estimate 可以調整 spot 於 rviz 中的位置,再透過讓 lidar 對齊地圖環境的方式獲得較正確的 rviz 內定位,透過 ``` ros2 topic echo /amcl_pose ``` 取得座標 ### 4.navigation.yaml 在內部輸入剛剛獲得的 intial pose,並 colcon build ![圖片](https://hackmd.io/_uploads/HJD_WLj0kl.png) 記得 ``` colcon build ``` ### 5.變更 waypoint 和 task ![圖片](https://hackmd.io/_uploads/HkQ4SuhJxl.png) 至此檔案中變更 ``` loadGraphArg=ExecuteProcess(cmd=[['ros2 run routing_agent loadGraph /home/csl/isaac_routing/src/routing_engine/graph_collector_and_visualization/map.json']],shell=True) loadTaskAndVehicleArg=ExecuteProcess(cmd=[['ros2 run routing_agent routingClient /home/csl/isaac_routing/src/routing_engine/graph_collector_and_visualization/task_data_empty.json src/routing_engine/test_run/sample_data/vehicle_data.json']],shell=True) ``` 若 waypoint 數量與 task 數量不相符將會報錯 記得 ``` colcon build ``` ## 加入地圖製程式中 (新) ### 使用 env_setup.py 可以免去啟動程式時的後綴及繁雜的修改手續 ( spot_config navigate.launch 中可將 default 的 rviz 改為 true) 檔案暫定路徑為 ``` /home/csl/isaac_routing2_v2/src/user_tools/env_setup.py ``` 依照格式加入地圖資訊 ![圖片](https://hackmd.io/_uploads/HJKsEe6Xgx.png) * arg.env 為地圖名稱 * ENV_USD_PATH 為 isaac sim 建模位置 * spot_init_pose 為isaac sim 中機器人初始位置 * spot_init_orientation 為isaac sim 中機器人初始角度 * rviz_initial_pose 為 rviz 中機器人初始位置 * rviz_map 地圖的 yaml 檔位置 * waypoint_graph 地圖的 waypoint 位置 完成設定後可於 cmd 中使用 ![圖片](https://hackmd.io/_uploads/HJzKIx6Qge.png) 可至 ``` /home/csl/isaac_routing2_v2/src/env_config.json ``` 中確認修改後的地圖狀態 # Waypoint Generate from: https://github.com/BruceLin90620/Spot_Switch_Map_System ## 點位標記(舊) ### 1. Download 為了避免路徑錯誤需要 git 至 /src 資料夾內 ``` mkdir spot_map_switching_ws/src cd spot_map_switching_ws/src git clone https://github.com/BruceLin90620/Spot_Switch_Map_System.git ``` ### 2.build pkg ``` cd spot_map_switching_ws/ colcon build source install/setup.bash ``` ### 3. Run in different terminal 若不使用 lidar 可跳過 1, 2 步至第 4 步的直接使用 rviz2 #### 1. 讀取所有實機 spot 掃描出的 lidar 地圖 檔案須至實機調取,github 不提供 ``` ros2 run switch_pcd_map switch_pcd_map_node ``` #### 2. 地圖選取 更改 mapid: 後的數字切換當前地圖 ``` ros2 service call /switch_map switch_map_interfaces/srv/SingleMap "mapid: 0" ``` #### 3. 輸出資料至 rviz2 in /isaac_routing/src/routing_engine/graph_collector_and_visualization/ ``` python3 graph_visualizer.py ``` spot_config/config/autonomy/graph_visualizer.py 中可修改 ``` def load_waypoints(self): with open('/home/csl/isaac_routing/src/routing_engine/graph_collector_and_visualization/waypointgraph_000_20250411_162756.json', 'r') as f: return json.load(f) ``` 變更於 rviz2 中顯示的 waypoint ,但顯示點不影響紀錄點, 可自行新增並輸入 .json 檔用於標記機器人的初始位置和重要路徑 ![圖片](https://hackmd.io/_uploads/BJthmDdyll.png) #### 4. 啟動 rviz2 (直接使用 map) ``` rviz2 ``` 點選 Rviz 視窗左下角的 Add 後加入 By topic 中的 /waypoint_markers 和 PointCloud 視窗上列的 2D Pose Estimate 可直接在點選處加入 waypoint ##### 直接使用 2d 地圖進行標點 (偷懶作法) 由於 spot 回收的 pcd 檔位置和於 isaac sim 中使用的 map 有差異,因此改為直接使用 isaac sim 中的地圖做編輯 啟動 rviz 後,Add Map 並於 topic 輸入 /map,此時會顯示 error ![圖片](https://hackmd.io/_uploads/BkvE8HiCkg.png) 開新的 terminal 並 launch routing system 中用來可視化並 Nav 導航的程式,因為不需要其可視化功能 rviz:=false ``` cd ~/isaac_routing ``` 隨後在 rviz 視窗中便會出現原本地圖,navigate.launch.p y 便可關閉了 ``` ros2 launch spot_config navigate.launch.py rviz:=false map:=<yaml檔路徑> ``` 便可順利載入,此 map 上拉出的 waypoints 會貼合 isaac sim 中的設定 #### 5. 蒐集 waypoints in /isaac_routing/src/routing_engine/graph_collector_and_visualization/cd ``` python3 pose_collector_vis.py 0 ``` 直接結束程式或於另一個視窗輸入即可儲存當前 waypoints 成以時間為檔名之 .json 檔 ``` ros2 service call /save_waypoints std_srvs/srv/Trigger ``` #### 6. 更改routing system 使用之 waypointgraph 預設 waypointgraph.json 檔可依下列路徑找到 ![圖片](https://hackmd.io/_uploads/H13y-1cAke.png) 修改 routing system 所使用之 RunServer.launch. py 中 generate_launch_description() 的 loadGraphArg, 變更為所希望使用之路徑即可 ![圖片](https://hackmd.io/_uploads/BJZUz1c0kx.png) ![圖片](https://hackmd.io/_uploads/S1JTGy9CJg.png) ## 點位標記(新) 舊版只允許範圍的十字內的連線,且容易有誤判導致連線穿牆或重複連線的問題,新版增加使用者操作空間,更為便捷 ### 1.啟動 rivz 作為繪製空間 可以依照先前教學變更地圖 ``` ros2 launch spot_config navigate.launch.py ``` ### 2.啟動繪製紀錄程式 需安裝 pynput ``` cd isaac_routing2_v2/src/routing_engine/graph_collector_and_visualization/ python3 pose_collector_v2.py ``` ### 3.開始繪製 記得變更 rviz topic 名稱 ![圖片](https://hackmd.io/_uploads/HJ6xfW6Qxl.png) #### 1.繪點 點選 ![圖片](https://hackmd.io/_uploads/HyiB6ea7el.png) 後於地圖上點擊左鍵便可完成點標注 在重複一次此步驟便可完成第二點標注,且不限距離、角度自動連線 ![圖片](https://hackmd.io/_uploads/BJiZ0gTmgl.png) 若要與已經存在的點連線,在點擊 2D Pose Estimate 後點擊已經存在點便可與已存在點連線 按下鍵盤上的 q 鍵即可停止自動連線,重複先前步驟便可繪製新的線段,也可照步驟進行連線 ![圖片](https://hackmd.io/_uploads/SyoXkb6mxx.png) #### 2.修改已存在點 重複點選 2D Pose Estimate 並點擊已存在點兩次 依序會在 cmd 中出現 ![圖片](https://hackmd.io/_uploads/B11ylWT7ee.png) 看見最後一則訊息時便可再點選 2D Pose Estimate 並點擊想更改該點至何處 ![圖片](https://hackmd.io/_uploads/rJ1Lxbp7ee.png) ![圖片](https://hackmd.io/_uploads/HJ_LgZTmgl.png) #### 3.移除點 * 若尚未按下 q 停止連線,按下鍵盤上的 d 便可移除最後添加的點 * 點選 2D Pose Estimate 並點擊已存在點,按下鍵盤上的 d 便可移除 ![圖片](https://hackmd.io/_uploads/rksIb-6mgx.png) #### 4.儲存 關閉程式即可自動儲存至同路徑下,並以時間命名 # To Do ## 1. Adding tasks in waypoints (DONE) ### 1. task asign ``` class MapManager(Node): def __init__(self): . . . with open('/home/csl/issac_routing/src/spot_routing_nav/spot_routing_nav/task_dict.json', 'r') as file: self.task_dict = json.load(file) ``` ``` def waypoint_task(self, waypoint_id, arrived_waypoint): if waypoint_id in self.task_dict: match self.task_dict[waypoint_id]: case "rotate_in_place": self.rotate_in_place(arrived_waypoint=arrived_waypoint) case "wave_head": self.wave_head(arrived_waypoint=arrived_waypoint,range_deg=60) else: self.get_logger().info(f'No task at {waypoint_id}') ``` ![圖片](https://hackmd.io/_uploads/Bkalxdpi1l.png) ![圖片](https://hackmd.io/_uploads/BJH0eOpjkl.png) use waypoint_task to get the dictionary from task_dict.json and use match case to define the operation. lab map infomation can be found in *routing_engine/test_run/sample_data/waypointgraph.json* ### 2. Tasks so far #### rotate in place ``` def rotate_in_place(self, arrived_waypoint,angle_deg=360, steps=4): self.get_logger().info(f'Rotating in place: {angle_deg} degrees') self.get_logger().info(f'{arrived_waypoint.pose.orientation.z}') initial_yaw = asin(arrived_waypoint.pose.orientation.z)*2 # 計算每一步旋轉角度 step_angle = angle_deg / steps for i in range(steps): yaw = (step_angle * (i + 1)) * (3.141592 / 180.0) # 轉換為弧度 q = quaternion_from_euler(0, 0, yaw + initial_yaw) pose = arrived_waypoint pose.header.frame_id = 'map' pose.header.stamp = self.navigator.get_clock().now().to_msg() pose.pose.orientation.x = q[0] pose.pose.orientation.y = q[1] pose.pose.orientation.z = q[2] pose.pose.orientation.w = q[3] self.navigator.goToPose(pose) self.get_logger().info(f'{pose.pose.orientation.z}') while not self.navigator.isTaskComplete(): rclpy.spin_once(self, timeout_sec=0.1) self.get_logger().info(f'Step {i+1}/{steps} completed') self.get_logger().info('Rotation complete!') ``` use *arrived_waypoint* to record the arrived point information (x,y,quat), calculate the initial yaw to make sure the spot can back to initial pose. #### wave head ``` def wave_head(self, arrived_waypoint,range_deg=60): self.get_logger().info(f'Waving head range: {range_deg} degrees') initial_yaw = asin(arrived_waypoint.pose.orientation.z)*2 waving_range = [range_deg, -1*range_deg, 0] log_word = ["Looking left", "Looking right", "Finish looking"] for i in range(len(waving_range)): self.get_logger().info(log_word[i]) yaw = waving_range[i] * (3.141592 / 180.0) # 轉換為弧度 q = quaternion_from_euler(0, 0, yaw + initial_yaw) pose = arrived_waypoint pose.header.frame_id = 'map' pose.header.stamp = self.navigator.get_clock().now().to_msg() pose.pose.orientation.x = q[0] pose.pose.orientation.y = q[1] pose.pose.orientation.z = q[2] pose.pose.orientation.w = q[3] self.navigator.goToPose(pose) self.get_logger().info(f'{pose.pose.orientation.z}') while not self.navigator.isTaskComplete(): rclpy.spin_once(self, timeout_sec=0.1) ``` base on *rotate in place*, and also make sure it can turn back to initial pose. ## 2. Muti-robot ``` import argparse from isaacsim import SimulationApp simulation_app = SimulationApp({"renderer": "RayTracedLighting", "headless": False}) import omni import carb import numpy as np import sys from omni.isaac.core import World from omni.isaac.core.utils.prims import define_prim, get_prim_at_path from omni.isaac.nucleus import get_assets_root_path from omni.isaac.quadruped.robots import SpotFlatTerrainPolicy from omni.isaac.core.objects import VisualCuboid from omni.isaac.core.utils.extensions import enable_extension # enable ROS2 bridge extension enable_extension("omni.isaac.ros2_bridge") simulation_app.update() import time # Note that this is not the system level rclpy, but one compiled for omniverse import numpy as np import rclpy from rclpy.node import Node from geometry_msgs.msg import Twist from dataclasses import dataclass @dataclass class Pose: position = np.zeros(3) orientation = np.array([1.0, 0.0, 0.0, 0.0]) class SpotNav(Node): def __init__(self, env_usd_path, spot_poses: list): super().__init__("Spot_Nav") # 設定環境 self.loadEnv(env_usd_path) self.first_step = True self.reset_needed = False self.cmd_scale = 1 self.cmds = [np.zeros(3) for _ in range(len(spot_poses))] # 為每台 Spot 建立獨立的控制指令 self.spots = [] self.initSpots(spot_poses) # 設定 ROS2 訂閱,為每台 Spot 設定不同的 cmd_vel topic self.ros_subs = [] for i in range(len(spot_poses)): topic_name = f"cmd_vel_{i}" # 例如 "cmd_vel_0", "cmd_vel_1" sub = self.create_subscription(Twist, topic_name, lambda msg, i=i: self.spotCmdCallback(msg, i), 1) self.ros_subs.append(sub) self.world.reset() def spotCmdCallback(self, msg: Twist, spot_index: int): """接收不同機器人的 cmd_vel 指令""" if self.world.is_playing(): self.cmds[spot_index][0] = msg.linear.x * self.cmd_scale self.cmds[spot_index][2] = msg.angular.z * self.cmd_scale def initSpots(self, spot_poses: list): """初始化多台 Spot""" for i, pose in enumerate(spot_poses): spot = SpotFlatTerrainPolicy( prim_path=f"/World/Spot_{i}", # 每台 Spot 使用不同的路徑 name=f"Spot_{i}", usd_path="omniverse://localhost/Library/spot.usd", position=pose.position, orientation=pose.orientation ) self.spots.append(spot) # 註冊 physics callback self.world.add_physics_callback("physics_step", callback_fn=self.onPhysicStep) self.world.reset() def onPhysicStep(self, step_size): """更新每台 Spot 的移動""" if self.first_step: for spot in self.spots: spot.initialize() self.first_step = False elif self.reset_needed: self.world.reset(True) self.reset_needed = False self.first_step = True else: for i, spot in enumerate(self.spots): spot.advance(step_size, self.cmds[i]) def run_simulation(self): self.reset_needed = False while simulation_app.is_running(): self.world.step(render=True) rclpy.spin_once(self, timeout_sec=0.0) if self.world.is_stopped(): self.reset_needed = True # Cleanup self.destroy_node() simulation_app.close() if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( "--env", type=str, choices=["lobby", "b1", "lab"], default="b1", help="Choice of navigation environment.", ) parser.add_argument( "--num_spots", type=int, default=2, # 預設 2 台 Spot help="Number of Spot robots in the simulation.", ) args, _ = parser.parse_known_args() B1_USD_PATH = "omniverse://localhost/Library/tsmc_b1_map.usd" LOBBY_USD_PATH = "omniverse://localhost/Library/tsmc_1f_map.usd" LAB_USD_PATH = "omniverse://localhost/Library/MIT_LAB/MIT_LAB.usd" spot_poses = [] if args.env == "b1": ENV_USD_PATH = B1_USD_PATH for i in range(args.num_spots): spot_poses.append(Pose(position=np.array([6.65 + i, -66.1, 0.8]))) # 設定不同初始位置 elif args.env == "lobby": ENV_USD_PATH = LOBBY_USD_PATH for i in range(args.num_spots): spot_poses.append(Pose(position=np.array([214 + i, -257.46, 0.8]), orientation=np.array([0.707, 0, 0, 0.707]))) elif args.env == "lab": ENV_USD_PATH = LAB_USD_PATH for i in range(args.num_spots): spot_poses.append(Pose(position=np.array([12.58 + i, 15.89, 0.87]), orientation=np.array([0, 0, 0, np.pi]))) rclpy.init() subscriber = SpotNav(ENV_USD_PATH, spot_poses) subscriber.run_simulation() ``` ## 2.1 Camera follow ## 3. Free Define tasks on waypoints in certain distance during routing ### knowlage point:Nav2、routing engine --- # Error msg ## Error msg (fixed) 若遇上 rviz2 無法啟動或 isaac sim 回報 ``` [RTPS_TRANSPORT_SHM Error] Failed init_port fastrtps_port7411: open_and_lock_file failed -> Function open_port_internal ``` 代表在 ros2 的通訊中有 node 或 topic 阻塞問題,頻繁關閉程式或無預警的程式關閉可能導致此問題,透過下行指令可清空當前存在的 ros2 內容,對一般程式、電腦、未運行程式無影響,但運行中 ros2 程式會造成不可預測影響,須先關閉 ``` rm -f /dev/shm/fastrtps_* /dev/shm/sem.fastrtps_* ``` ## Error msg #### ros2 launch routing_agent RunServer.launch.py ``` [ros2 run routing_agent server-1] Traceback (most recent call last): [ros2 run routing_agent server-1] File "/home/csl/issac_routing/install/routing_agent/lib/routing_agent/server", line 33, in <module> [ros2 run routing_agent server-1] sys.exit(load_entry_point('routing-agent==1.1.0', 'console_scripts', 'server')()) [ros2 run routing_agent server-1] File "/home/csl/issac_routing/install/routing_agent/lib/python3.10/site-packages/routing_agent/RoutingServer.py", line 112, in main [ros2 run routing_agent server-1] rclpy.spin(routing_server) [ros2 run routing_agent server-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/__init__.py", line 226, in spin [ros2 run routing_agent server-1] executor.spin_once() [ros2 run routing_agent server-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 739, in spin_once [ros2 run routing_agent server-1] self._spin_once_impl(timeout_sec) [ros2 run routing_agent server-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 736, in _spin_once_impl [ros2 run routing_agent server-1] raise handler.exception() [ros2 run routing_agent server-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/task.py", line 239, in __call__ [ros2 run routing_agent server-1] self._handler.send(None) [ros2 run routing_agent server-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 437, in handler [ros2 run routing_agent server-1] await call_coroutine(entity, arg) [ros2 run routing_agent server-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 391, in _execute_service [ros2 run routing_agent server-1] response = await await_or_execute(srv.callback, request, srv.srv_type.Response()) [ros2 run routing_agent server-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 107, in await_or_execute [ros2 run routing_agent server-1] return callback(*args) [ros2 run routing_agent server-1] File "/home/csl/issac_routing/install/routing_agent/lib/python3.10/site-packages/routing_agent/RoutingServer.py", line 88, in NavServiceCallBack [ros2 run routing_agent server-1] self.routingEngine.update(request.i_am_at) [ros2 run routing_agent server-1] File "/home/csl/issac_routing/install/routing_agent/lib/routing_agent/RoutingEngine.py", line 137, in update [ros2 run routing_agent server-1] raise KeyError("You derail from the path!") [ros2 run routing_agent server-1] KeyError: 'You derail from the path!' [ERROR] [ros2 run routing_agent server-1]: process has died [pid 1453440, exit code 1, cmd 'ros2 run routing_agent server']. ``` #### ros2 launch spot_config navigate.launch.py rviz:=true ``` [rviz2-2] [INFO] [1742280158.825562243] [rviz2]: Message Filter dropping message: frame 'odom' at time 76.000 for reason 'discarding message because the queue is full' ``` #### ros2 run spot_routing_nav waypoint_nav ``` [WARN] [1742279974.169974686] [map_manager]: Navigation failed with result: TaskResult.FAILED ``` ## Error msg 2 git 內的 spot.usd 無法正常使用,使用 omniversse 上的 spot.usd 可正常運行但疑似材料包丟失,出現訊息於啟動 omniverse,目前 spot 呈白色 ``` 2025-04-07 01:32:08 [9,849ms] [Error] [omni.hydra] [UsdToMdl] Prim '/__Prototype_4/Looks/material_Material_001/Shader' parameter 'diffuse_texture': References an asset that can not be found: './materials/body_others.png' ``` ## Error msg 3 版本問題不影響使用 ``` Summary: 19 packages finished [2min 5s] 2 packages had stderr output: ndt_omp_ros2 pcl_localization_ros2 ``` ## Error msg 4 numpy 版本不符合,須使用 numpy 1.2.0前 ``` (isaaclab) csl@csl-B550M-AORUS-PRO-P:~/isaac_routing$ ros2 run spot_routing_nav waypoint_nav Traceback (most recent call last): File "/home/csl/isaac_routing/install/spot_routing_nav/lib/spot_routing_nav/waypoint_nav", line 33, in <module> sys.exit(load_entry_point('spot-routing-nav==0.0.0', 'console_scripts', 'waypoint_nav')()) File "/home/csl/isaac_routing/install/spot_routing_nav/lib/spot_routing_nav/waypoint_nav", line 25, in importlib_load_entry_point return next(matches).load() File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load module = import_module(match.group('module')) File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/home/csl/isaac_routing/install/spot_routing_nav/lib/python3.10/site-packages/spot_routing_nav/waypoint_nav.py", line 5, in <module> from tf_transformations import quaternion_from_euler File "/opt/ros/humble/lib/python3.10/site-packages/tf_transformations/__init__.py", line 46, in <module> import transforms3d File "/usr/lib/python3/dist-packages/transforms3d/__init__.py", line 10, in <module> from . import quaternions File "/usr/lib/python3/dist-packages/transforms3d/quaternions.py", line 26, in <module> _MAX_FLOAT = np.maximum_sctype(np.float) File "/home/csl/.local/lib/python3.10/site-packages/numpy/__init__.py", line 324, in __getattr__ raise AttributeError(__former_attrs__[attr]) AttributeError: module 'numpy' has no attribute 'float'. `np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here. The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations. Did you mean: 'cfloat'? [ros2run]: Process exited with failure 1 ``` ## Error msg 5 啟動 ``` ros2 run spot_routing_nav waypoint_nav ``` 會產生停滯,沒有反應 -> 重新執行