自动化Trae Apollo参数解释的批量获取

自动化Trae Apollo参数解释的批量获取

一、背景介绍

在自动驾驶开发中,百度Apollo平台提供了大量参数用于调整系统行为。Trae添加Apollo工程后,可以通过交互的方式询问参数的作用,但存在两个痛点:

  1. Trae没有提供API接口,无法通过编程方式获取参数解释
  2. 手动查询大量参数效率极低(如Apollo 9.0有2000+参数)

为解决这些问题,准备了一个Python自动化脚本,通过模拟人工操作的方式:

  • 自动输入参数名
  • 触发Trae查询
  • 捕获并保存解释文本
    实现了Apollo参数解释的批量获取,大幅提升参数研究效率。

二、设计思路

整个自动化流程模拟人类操作行为,核心解决三个关键问题:

  1. 界面交互定位

    通过图像识别确定按钮状态(特别是发送按钮的"空闲"状态)

  2. 操作模拟链
    输入参数 → 点击发送 → 等待响应 → 复制结果 → 保存数据

  3. 状态检测机制

    使用OpenCV比对按钮区域截图,精确判断Trae响应状态

是 是 否 否 开始 检测发送按钮状态 是否空闲? 输入参数名称 点击发送按钮 等待响应完成 点击复制按钮 保存到Markdown 还有参数? 结束 等待1秒


三、操作步骤

1. 环境准备

安装依赖库:

bash 复制代码
pip install pyautogui opencv-python pillow keyboard pyperclip pywin32
2. 获取界面坐标
  1. 启动Trae,添加工程,打开聊天界面,创建一个智能体,输入提示词

  2. 运行脚本(取消注释以下代码):

python 复制代码
# 第一步: 获取底图
screenshot1 = capture_screen()
screenshot1.save("base.bmp")

# 第三步: 保存空闲时发送按钮的图标
img=cv2.imread('base.bmp')
x,y=btn_snd_pos
w,h=btn_snd_size    
ico=img[y:y+h,x:x+w,:]
cv2.imwrite("idle.bmp",ico)
3. 定位关键元素

使用画图工具打开base.bmp,记录以下坐标(示例值需替换):

python 复制代码
btn_snd_pos=(862,914)    # 发送按钮中心坐标
btn_snd_size=(29,29)     # 发送按钮尺寸
btn_copy_pos=(296,754)   # 复制按钮坐标
edt_input_pos=(362,871)  # 输入框坐标
4. 执行自动化查询
  1. 将要查询的参数写入列表:
python 复制代码
args = [
    'enable_multi_agent_vehicle_evaluator',
    'prediction_eval_mode',
    'enable_multi_thread'
    # 添加更多参数...
]
  1. 运行主程序:
bash 复制代码
python trae_automation.py
5. 获取结果

所有参数解释将保存到result.md,按参数名分章节存储。


四、完整代码

python 复制代码
import pyautogui
import keyboard
from PIL import Image, ImageGrab
import pyperclip
import time
import cv2
import win32clipboard

def clear_clipboard():
    """清空剪切板内容"""
    try:
        win32clipboard.OpenClipboard()
        win32clipboard.EmptyClipboard()
        win32clipboard.CloseClipboard()
        return True
    except Exception as e:
        print(f"清空剪切板失败: {e}")
        return False

def capture_screen(region=None):
    """截取全屏或指定区域"""
    screenshot = ImageGrab.grab()
    return screenshot

def mouse_click(x, y, clicks=1, interval=0.1):
    """模拟鼠标点击"""
    pyautogui.click(x, y, clicks=clicks, interval=interval)

def copy_to_clipboard(text):
    """复制文本到剪切板"""
    pyperclip.copy(text)

def paste_from_clipboard():
    """获取剪切板内容"""
    return pyperclip.paste()

def send_ctrl_v():
    """发送Ctrl+V粘贴"""
    keyboard.press_and_release('ctrl+a')
    keyboard.press_and_release('del')
    keyboard.press_and_release('ctrl+v')

def cacl_distance(img1, img2):
    diff = cv2.absdiff(img1, img2)
    return diff.sum()

def wait_ico(name,btn_snd_pos,btn_snd_size):
    '''# 图像状态检测(等待发送按钮空闲)'''
    idle=cv2.imread(name)
    idle_gray = cv2.cvtColor(idle, cv2.COLOR_RGB2GRAY)
    x,y=btn_snd_pos
    w,h=btn_snd_size
    while True:
        screenshot1 = capture_screen()
        screenshot1.save("temp.bmp")
        img=cv2.imread('temp.bmp')
        ico=img[y:y+h,x:x+w,:]
        ico_gray = cv2.cvtColor(ico, cv2.COLOR_RGB2GRAY)
        distance = cacl_distance(ico_gray, idle_gray)
        # 计算与空闲状态的差异值
        if distance<10: # 差异小于阈值说明状态相同
            break
        time.sleep(1)

def input_message(text,edt_input_pos):
    copy_to_clipboard(text)
    mouse_click(edt_input_pos[0],edt_input_pos[1])
    time.sleep(1)
    send_ctrl_v()
    
def get_message(btn_copy_pos):
    mouse_click(btn_copy_pos[0]+16,btn_copy_pos[1]+16)
    return paste_from_clipboard()
    
def main():    
    
    # 第一步: 获取底图
    #screenshot1 = capture_screen()
    #screenshot1.save("base.bmp")    
    
    # 第二步: 用画图工具,得到发送按钮,复制按钮,输入框的坐标    
    btn_snd_pos=(862,914)
    btn_snd_size=(29,29)
    btn_copy_pos=(296,754)
    edt_input_pos=(362,871)
    
    # 第三步: 保存空闲时发送按钮的图标
    #img=cv2.imread('base.bmp')
    #x,y=btn_snd_pos
    #w,h=btn_snd_size    
    #ico=img[y:y+h,x:x+w,:]
    #cv2.imwrite("idle.bmp",ico)
        
    args=[
        'enable_multi_agent_vehicle_evaluator',
        'prediction_eval_mode',
        'enable_multi_thread'
    ]
    # 等待空闲
    wait_ico('idle.bmp',btn_snd_pos,btn_snd_size)

    fo=open("result.md","a+")
    for arg in args:        
        print(arg)
        
        # 发送请的请求
        input_message(arg,edt_input_pos)
        time.sleep(3)
        mouse_click(btn_snd_pos[0]+16,btn_snd_pos[1]+16)
        time.sleep(3)
        
        # 移动走鼠标
        mouse_click(btn_copy_pos[0]+16,btn_copy_pos[1]+16)
        
        # 等待空闲
        wait_ico('idle.bmp',btn_snd_pos,btn_snd_size)
    
        # 保存结果
        fo.write(f"# {arg}\n")
        msg=get_message(btn_copy_pos)
        print(msg)
        fo.write(f'{msg}\n')
        fo.flush()
        
        # 清空剪切板
        clear_clipboard()    
    
if __name__ == "__main__":
    main()

关键技术点解析

  1. 防干扰设计

    • 每次操作后移动鼠标到非交互区
    • 清空剪贴板避免内容污染
    • 双保险等待机制(固定延时+状态检测)
  2. 健壮性保障

    python 复制代码
    # 清空输入框再粘贴
    keyboard.press_and_release('ctrl+a')
    keyboard.press_and_release('del')

五、扩展应用

此方案不仅适用于Trae,还可迁移到其他无API的桌面应用,例如:

  1. 自动化测试GUI软件
  2. 批量操作ERP系统
  3. 游戏自动化脚本
  4. 定时填报网页表单

注意事项:自动化操作需遵守目标软件的用户协议,本方案仅用于技术研究,请勿用于商业侵权用途。

相关推荐
zkmall1 小时前
企业电商平台搭建:ZKmall开源商城服务器部署与容灾方案
运维·服务器·开源
华不完1 小时前
下一代防火墙混合模式部署
运维·服务器·网络
x县豆瓣酱1 小时前
ubuntu server配置静态IP
linux·运维·ubuntu
工藤新一¹1 小时前
Linux
linux·运维·服务器
互联网搬砖老肖1 小时前
运维打铁: 阿里云 ECS 实例的高效运维与管理
运维·阿里云·云计算
longze_72 小时前
frp内网穿透下创建FTP(解决FTP“服务器回应不可路由的地址。使用服务器地址替代”错误)
运维·服务器·网络
瓦力wow2 小时前
数据分析-名词
运维·服务器·数据分析
自由鬼2 小时前
正向代理服务器Squid:功能、架构、部署与应用深度解析
java·运维·服务器·程序人生·安全·架构·代理
许白掰2 小时前
Linux入门篇学习——Linux 编写第一个自己的命令
linux·运维·数据库·嵌入式硬件·学习
qinyia2 小时前
Wisdom SSH:探索AI助手在复杂运维任务中的卓越表现
运维·人工智能·ssh