仿真环境下实现场景切换、定位物体和导航行走

1. 代码(以微波炉为例)

from ai2thor.controller import Controller
import math
import randomdef distance_2d(pos1, pos2):"""计算两点之间的二维欧几里得距离(忽略Z轴)"""return math.sqrt((pos1['x'] - pos2['x']) ** 2 + (pos1['y'] - pos2['y']) ** 2)def get_reachable_positions(controller):"""获取所有可达位置"""reachable_positions = controller.step(action="GetReachablePositions").metadata["actionReturn"]return [{k: pos[k] for k in ['x', 'y']} for pos in reachable_positions]def move_towards_target_2d(controller, target_position):"""导航到目标位置(仅考虑X和Y坐标)"""max_attempts = 5attempt = 0while attempt < max_attempts:current_position = {k: controller.last_event.metadata["agent"]["position"][k] for k in ['x', 'y']}if distance_2d(current_position, target_position) <= 0.5:  # 目标精度为0.5米print("到达目标附近")return Truediff_x = target_position['x'] - current_position['x']diff_y = target_position['y'] - current_position['y']if abs(diff_x) > abs(diff_y):action = "MoveRight" if diff_x > 0 else "MoveLeft"else:action = "MoveAhead" if diff_y > 0 else "MoveBack"event = controller.step(action=action, moveMagnitude=0.5)print(f"移动:{action}{event.metadata['lastActionSuccess']}")if not event.metadata["lastActionSuccess"]:print(f"移动失败:{event.metadata['errorMessage']}")possible_actions = ["MoveRight", "MoveLeft", "MoveAhead", "MoveBack"]possible_actions.remove(action)  # 移除当前尝试失败的动作random_action = random.choice(possible_actions)event = controller.step(action=random_action, moveMagnitude=0.5)if not event.metadata["lastActionSuccess"]:print(f"尝试反方向移动也失败了:{event.metadata['errorMessage']}")back_action = "MoveBack" if diff_y > 0 else "MoveAhead"controller.step(action=back_action, moveMagnitude=0.5)attempt += 1continueelse:print(f"新方向移动成功:{random_action}")print("不知道如何抵达")return Falsedef manual_movement(controller):"""手动控制移动"""while True:user_input = input("请输入移动指令(WASD键分别代表上、左、下、右),输入Q退出手动模式:").upper()if user_input == 'Q':print("退出手动模式")breakelif user_input in ['W', 'A', 'S', 'D']:action_map = {'W': 'MoveAhead', 'A': 'MoveLeft', 'S': 'MoveBack', 'D': 'MoveRight'}action = action_map[user_input]event = controller.step(action=action, moveMagnitude=0.5)if event.metadata["lastActionSuccess"]:print(f"{action} 成功!")else:print(f"{action} 失败:{event.metadata['errorMessage']}")else:print("无效输入,请重新输入")controller = Controller(width=1280,height=720,fieldOfView=110,visibilityDistance=5,renderInstanceSegmentation=True
)scenes = ["FloorPlan1", "FloorPlan201", "FloorPlan301", "FloorPlan401"]
scene_names = ["厨房", "客厅", "卧室", "浴室"]while True:scene_choice = input("请输入场景编号(1-厨房,2-客厅,3-卧室,4-浴室),输入'Q'进入手动模式:")if scene_choice.lower() == 'q':print("进入手动模式")manual_movement(controller)continuetry:scene_number = int(scene_choice)if scene_number < 1 or scene_number > 4:raise ValueError()except ValueError:print("无效的输入,请重新输入")continueselected_scene = scenes[scene_number - 1]selected_scene_name = scene_names[scene_number - 1]controller.reset(selected_scene)reachable_positions = get_reachable_positions(controller)microwaves = [obj for obj in controller.last_event.metadata["objects"] if obj["objectType"] == "Microwave"]if len(microwaves) > 0:target = microwaves[0]target_position = {'x': target["position"]['x'], 'y': target["position"]['y']}print(f"{selected_scene_name}中目标微波炉位置: {target_position}")success = move_towards_target_2d(controller, target_position)if success:# 抓取动作event = controller.step(action="PickupObject", objectId=target["objectId"])if event.metadata["lastActionSuccess"]:print(f"{selected_scene_name}中抓取成功!")else:print(f"{selected_scene_name}中抓取失败:{event.metadata['errorMessage']}")else:print(f"{selected_scene_name}中没有微波炉")controller.stop()

2. 效果

ITHOR场景切换、导航
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24512.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.测试策略与计划设计指南

1.介绍 1.1项目介绍 完整项目组成&#xff1a;1.基于K8S定制开发的SaaS平台&#xff1b;2.多个团队提供的中台服务(微服务)&#xff1b;3.多个业务团队开发的系统平台。涉及多个项目团队、上百个微服务组件。 测试在所有团队开发测试后&#xff0c;自己搭建测试环境&#xff0c…

LeetCode热题100- 最小栈【JavaScript讲解】

“日日行&#xff0c;不怕千万里&#xff1b;常常做&#xff0c;不怕千万事。” —— 《格言联璧处事》 oi&#xff01;&#xff01;栈的知识点在这里&#xff01;&#xff01;&#xff01;点击跳转&#xff01;&#xff01;&#xff01; 最小栈讲解目录&#xff1a; 题目&…

D3DSource 2016 引擎完整教程

D3DSource 引擎是一款基于 Direct3D 的 3D 图形渲染引擎&#xff0c;2016 版是较早的一个版本。由于 D3DSource 并不是主流开源引擎&#xff08;如 Unity、Unreal Engine&#xff09;&#xff0c;详细的官方文档可能较少。因此&#xff0c;我会结合 Direct3D 编程知识&#xff…

DeepSeek:我的AI助手之旅

★【前言】: 初次使用AI助手帮我写作,就像摸石头过河一样,一点点的前行。我在慢慢的摸索,慢慢的体会中,感悟出的一点个人心得体会现分享给大家。这也说明一个问题,网站上各种使用方法和技巧是对于已经使用过的人来说的方便和快捷,但对于刚刚接触的使用者来说,网上的各…

【Cursor】报错:FATAL:v8_initializer.cc(630)] Error loading V8 startup snapshot file

【Cursor】报错&#xff1a;FATAL:v8_initializer.cc(630)] Error loading V8 startup snapshot file 最初是在使用Cursor时左下角出现一个类似更新失败的提示&#xff0c;没注意&#xff0c;后来界面非常卡。 接着重新打开Cursor&#xff0c;提示说原文件不存在要删除快捷方式…

布隆过滤器(Bloom Filter)

文章目录 1. 定义2. 核心原理2.1 数据结构2.2 操作流程2.3 扩容 3. 优缺点3.1 优点3.2 缺点 4. 使用场景4.1 适用场景4.2 不适用场景 5. 手写布隆过滤器 1. 定义 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于快速判断一个元素是否属于…

Build错误:Cannot determine build data storage root for project 和 无法加载主类的解决办法的经验分享

Build错误&#xff1a;Cannot determine build data storage root for project 解决方案与经验分享 1. 引言 查看错误信息 “Cannot determine build data storage root for project”的含义&#xff1a; 这是一个关于构建项目时遇到的常见错误。错误信息表明构建工具无法确定…

2025年02月26日Github流行趋势

项目名称&#xff1a;aibrix 项目地址url&#xff1a;https://github.com/vllm-project/aibrix项目语言&#xff1a;Jupyter Notebook历史star数&#xff1a;2234今日star数&#xff1a;881项目维护者&#xff1a;Jeffwan, varungup90, brosoul, nwangfw, kr11项目简介&#xf…

理解大模型的量化

1. 什么是量化 量化是大模型领域中的一项关键技术&#xff0c;它通过降低模型参数的精度&#xff0c;将浮点数转换为整数或者定点数&#xff0c;从而实现模型的压缩和优化。 这样做的目的主要是减少模型的存储需求、加快推理速度&#xff0c;并且降低模型的计算复杂度&#xf…

构建逻辑思维链(CoT)为金融AI消除幻觉(保险理赔篇)

在上一篇文章中&#xff0c;我们介绍了如何利用亚马逊云科技的Amazon Bedrock GuardRails自动推理检查为金融行业的AI应用提升准确性&#xff0c;消除幻觉。在本案例中&#xff0c;我们将探讨一个利用AI副主保险公司评估长期护理保险理赔审核的场景。 自动推理检查配置 在本方…

上传securecmd失败

上传securecmd失败 问题描述&#xff1a;KES V8R6部署工具中&#xff0c;节点管理里新建节点下一步提示上传securecmd失败&#xff0c;如下&#xff1a; 解决办法&#xff1a; [rootlocalhost ~]# yum install -y unzip 上传的过程中会解压&#xff0c;如果未安装unzip依赖包…

蓝桥杯 5.字符串

蓝桥杯 5.字符串 文章目录 蓝桥杯 5.字符串KMP&字符串哈希Manacher编程138-148字典树基础01Trie编程149-155 KMP&字符串哈希 KMP算法 字符串匹配算法, 用于匹配**模式串P(短)和文本串S(长)**中出现的所有位置, 例如, S “ababac”, P “aba”, 那么出现的所有位置就…

TEMU标签超简单制作方法,三步快速合成TEMU标签

这个标签编辑工具使用方法很简单&#xff0c;零基础小白也能合成TEMU标签/跨境合规标签。 第一步&#xff1a;选择一个符合需求的标签 这个工具提供了非常多的标签模板&#xff0c;选择一个自己编辑即可。 第二步&#xff1a;编辑标签内容 提供了超多自定义编辑功能&…

ChatGPT入驻Safari,AI搜索时代加速到来

2月25日&#xff0c;人工智能领域巨头OpenAI宣布了一项重磅更新&#xff1a;为其广受欢迎的ChatGPT应用新增Safari浏览器扩展功能&#xff0c;并支持用户将ChatGPT设置为Safari地址栏的默认搜索引擎。这一举措标志着OpenAI在将ChatGPT整合进用户日常网络浏览体验方面迈出了重要…

auto.js例子之WebView多页面浏览器

"ui";ui.layout(<vertical><horizontal id"webs" layout_weight"1"></horizontal><button id"one" text"第一个" /><button id"two" text"第二个" /><button id"…

创建虚拟环境的方法

虚拟环境 python解释器 第三方包&#xff1b; 在系统中&#xff0c;一个虚拟环境就是一个文件夹&#xff0c;改动文件夹名字不行&#xff0c;因为已经写入了部分脚本中&#xff0c;如activate等启动程序中&#xff1b; Virtualenv 安装&#xff1a;pip install virtualenv…

SQL注入(order by,limit),seacms的报错注入以及系统库的绕过

一、若information_schema被过滤了&#xff0c;应该如何绕过 简介&#xff1a; information_schema 是一个非常重要的系统数据库&#xff0c;它在SQL标准中定义&#xff0c;并且被许多关系型数据库管理系统&#xff08;RDBMS&#xff09;如MySQL、PostgreSQL等支持。这个库提供…

HAL库串口发送函数 加 接收函数

数据类型 一个字节8个比特位&#xff0c;串口发送函数的第三个参数&#xff0c;写入的是数据的数量&#xff0c;以字节为单位。 ​/* exact-width signed integer types */ typedef signed char int8_t; typedef signed short int int16_t; typedef signed…

Linux:进程信号(二.信号的保存与处理、递达、volatile关键字、SIGCHLD信号)

目录 1.信号保存 1.1递达、未决、阻塞等概念 1.2再次理解信号产生与保存 1.3信号集操作函数 sigset_t类型 sigemptyset() 函数 sigismember()函数 sigaddset ()函数 sigdelset() 函数 sigprocmask()系统调用 sigpending()系统调用 2.信号的处理/递达 2.1信号处理时…

【JavaEE】SpringMVC获取HTTP中的元素

目录 一、获取URL中的参数PathVariable二、上传⽂件RequestPart三、获取Cookie/Session3.1 HttpServletRequest和 HttpServletResponse3.2 获取Cookie3.2.1 使用HttpServletRequest3.2.2 使用注解CookieValue 3.3 设置session3.4 获取session3.4.1 使用HttpServletRequest3.4.2…