自动化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. 定时填报网页表单

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

相关推荐
我智商开挂41 分钟前
嵌入式Linux(Exynos 4412)笔记
linux·运维·arm开发
Goboy1 小时前
数独游戏:Trae 自动生成规则与UI,轻松体验逻辑挑战
ai编程·trae
Goboy1 小时前
经典坦克大战:Trae 轻松打造街机风格的坦克对战游戏
ai编程·trae
sunny052961 小时前
Linux shell getopts 解析命令行参数
linux·运维·bash·shell
朱包林2 小时前
数据库服务-日志管理-备份与恢复-主从同步
linux·运维·服务器·数据库·mysql·云计算
我好饿15 小时前
Linux入门教程 第十五章 Linux 系统调优工具
linux·运维·网络
萌虎爱分享5 小时前
Linux 防火墙 (firewalld) 管理完整指南
linux·运维·防火墙·firewalld
mCell9 小时前
Docker 进阶教程
运维·docker·容器
mCell9 小时前
Docker 入门教程
运维·docker·操作系统
祈祷苍天赐我java之术10 小时前
Linux 进阶之性能调优,文件管理,网络安全
java·linux·运维