RoboWaiter/zoo/demo/导航寻路.py

139 lines
3.9 KiB
Python
Raw Normal View History

2023-09-20 16:45:07 +08:00
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
2023-11-09 17:06:34 +08:00
# enconding = utf8
2023-09-20 16:45:07 +08:00
import sys
import time
import grpc
2023-11-09 17:06:34 +08:00
sys.path.append('./')
sys.path.append('../')
2023-09-20 16:45:07 +08:00
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable
2023-11-09 17:06:34 +08:00
from robowaiter.proto import GrabSim_pb2_grpc,GrabSim_pb2
2023-09-20 16:45:07 +08:00
2023-11-09 17:06:34 +08:00
channel = grpc.insecure_channel('localhost:30001', options=[
('grpc.max_send_message_length', 1024 * 1024 * 1024),
('grpc.max_receive_message_length', 1024 * 1024 * 1024)
])
2023-09-20 16:45:07 +08:00
sim_client = GrabSim_pb2_grpc.GrabSimStub(channel)
2023-11-09 17:06:34 +08:00
'''
初始化卸载已经加载的关卡清除所有机器人
'''
def Init():
sim_client.Init(GrabSim_pb2.NUL())
'''
获取当前可加载的地图信息(地图名字地图尺寸)
'''
def AcquireAvailableMaps():
AvailableMaps = sim_client.AcquireAvailableMaps(GrabSim_pb2.NUL())
print(AvailableMaps)
'''
1根据mapID加载指定地图
2如果scene_num>1,则根据地图尺寸偏移后加载多个相同地图
3这样就可以在一个关卡中训练多个地图
'''
def SetWorld(map_id=0, scene_num=1):
print('------------------SetWorld----------------------')
world = sim_client.SetWorld(GrabSim_pb2.BatchMap(count=scene_num, mapID=map_id))
'''
返回场景的状态信息
1返回机器人的位置和旋转
2返回各个关节的名字和旋转
3返回场景中标记的物品信息(名字类型位置旋转)
4返回场景中行人的信息(名字位置旋转速度)
5返回机器人手指和双臂的碰撞信息
'''
def Observe(scene_id=0):
print('------------------show_env_info----------------------')
2023-09-20 16:45:07 +08:00
scene = sim_client.Observe(GrabSim_pb2.SceneID(value=scene_id))
2023-11-09 17:06:34 +08:00
print(
f"location:{[scene.location]}, rotation:{scene.rotation}\n",
f"joints number:{len(scene.joints)}, fingers number:{len(scene.fingers)}\n",
f"objects number: {len(scene.objects)}, walkers number: {len(scene.walkers)}\n"
f"timestep:{scene.timestep}, timestamp:{scene.timestamp}\n"
f"collision:{scene.collision}, info:{scene.info}")
'''
重置场景
1重置桌子的宽度和高度
2清除生成的行人和物品
3重置关节角度位置旋转
4清除碰撞信息
5重置场景中标记的物品
'''
def Reset(scene_id=0):
print('------------------Reset----------------------')
scene = sim_client.Reset(GrabSim_pb2.ResetParams(scene=scene_id))
print(scene)
# 如果场景支持调整桌子
# sim_client.Reset(GrabSim_pb2.ResetParams(scene = scene_id, adjust = True, height = 100.0, width = 100.0))"
2023-09-20 16:45:07 +08:00
2023-11-09 17:06:34 +08:00
"""
导航移动
yaw:机器人朝向;
velocity:速度,>0代表移动,<0代表瞬移,=0代表只查询;
dis:最终达到的位置距离目标点最远距离,如果超过此距离则目标位置不可达
"""
def navigation_move(scene_id=0, map_id=0):
print('------------------navigation_move----------------------')
scene = sim_client.Observe(GrabSim_pb2.SceneID(value=scene_id))
2023-09-20 16:45:07 +08:00
walk_value = [scene.location.X, scene.location.Y, scene.rotation.Yaw]
print("position:", walk_value)
2023-11-09 17:06:34 +08:00
if map_id == 11: # coffee
v_list = [[0, 880], [250, 1200], [-55, 750], [70, -200]]
2023-09-20 16:45:07 +08:00
else:
2023-11-09 17:06:34 +08:00
v_list = [[0.0, 0.0]]
2023-09-20 16:45:07 +08:00
for walk_v in v_list:
walk_v = walk_v + [scene.rotation.Yaw - 90, 600, 100]
print("walk_v", walk_v)
action = GrabSim_pb2.Action(scene=scene_id, action=GrabSim_pb2.Action.ActionType.WalkTo, values=walk_v)
scene = sim_client.Do(action)
2023-11-09 17:06:34 +08:00
print(scene.info)
2023-09-20 16:45:07 +08:00
if __name__ == '__main__':
2023-11-09 17:06:34 +08:00
map_id = 11 # 地图编号
scene_num = 1 # 场景数量
print('------------ 初始化加载场景 ------------')
Init()
AcquireAvailableMaps()
SetWorld(map_id, scene_num)
time.sleep(5.0)
2023-09-20 16:45:07 +08:00
for i in range(scene_num):
2023-11-09 17:06:34 +08:00
print('------------ 场景操作 ------------')
Observe(i)
Reset(i)
print('------------ 导航移动 ------------')
navigation_move(i, map_id)