vrep_Nao控制_学习记录

本文介绍了使用Vrep控制Nao机器人的相关内容。包括关节参数表,如位置最小值、范围、默认位置旋转角度等,以及动态特性中的电机启用、目标速度等参数。还讲述了程序控制,涉及vrep脚本代码、lua语言函数,如获取句柄、设置关节目标位置等,最后给出部分Vrep属性翻译和代码位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为在学校里要学习vrep控制nao,但网上资源较少,找起来很费力,我也试试写写自己博客。我引用了一些大佬对vrep使用的探索,侵删。
Vrep 控制 nao
一、 关节参数表:
我们以nao的左臂中LElbowRoll3为例,它的作用是来控制左边小臂的左右摆动

  1. Joint栏
    Pos. min. 位置最小值;位置的最小值,单位是度。
    Pos. range位置范围;位置的可变换值,单位是度。
    Position:默认位置的旋转角度,初始位姿用这个调整。
    !!!注意:Position值的范围为[Pos. min. , Pos. min. + Pos. range]
    所以,如果你输入的Position的值超出了这个范围,你输入的值就会变化,但是通过关节参数表或者代码设置目标位置时,就好像不用在意这个范围内,这点后面在介绍。
    (1)现在我来补充一下Position这个参数
    我们以LShoulderRoll3为例(为什么要换一个关节举例呢?因为当我修改LElbowRoll3的Position参数值后,它又重新恢复到原来的值。)
    修改前LShoulderRoll3的Position值为0,如图1所示,注意此时nao的胳膊。

在这里插入图片描述图一

然后我们将Position的值改为90(单位度)结果如图2所示,虽然我输入的是90,但是值变为了76.01,这就是我们上面注意提到的。此时手臂已经转动。
图2图二
我们在回到LElbowRoll3例子中
(2)我们进入Dynamic properties(动态特性),如图3所示。
Motor enabled(电机已启用) 打勾后关节可以转动
Target velocity(目标速度 单位度/秒) 当nao开始运动后,这个关节最终会达到该速度。
Maximum torque(最大扭矩) 可以看作加速度,它的值越大,关节到达Target velocity越快。

Target position(目标位置) 当nao开始运动后,这个关节最终会到达该位置。与上面的Position相似。
Upper velocity limit(速度上限)
Target velocity和Target position可以通过程序来控制,这两个属性也是nao运动的关键。velocity一般nao不用,nao主要是用Target position,我们第一次做的小车是使用Target velocity的。
图3
图3
!!!注意:我主要写了这些常用的(只能看懂这些),关节属性表的详细参数见此链接https://blog.youkuaiyun.com/DanielDingshengli/article/details/80536342

二、程序控制
脚本简介:vrep的脚本代码分为四部分,如图4所示。详情请见链接https://blog.youkuaiyun.com/DanielDingshengli/article/details/80547400
其语言为lua,语言学习见菜鸟教程。

脚本编程的函数有很多,具体见vrep的官方文档,下面我只介绍我用到的。
sim.getObjectHandle(“物体名称”) 获得句柄,和c语言中的文件句柄差不多,也可以理解为指针。
minDeg和maxDeg是两个表(可以理解为lua语言中的数组),他们分别记录了关节转动的最小角度和最大角度。
sim.getObjectName(句柄指针) 获得该句柄的名字。
xml的用法见官方文档,这个具体我也不是很清楚,但是应该和html差不多。举例简单说一下:



tile 名称,就是我们的例子LElbowRoll3。
hslider 表明这是个滑条。
minimum 滑条最小值。
maximum 滑条最大值
id值很关键,不能重复。
结果
图4
simUI.create(xml) 按照xml创建UI
simUI.setSliderValue(ui,1,0) 设置滑条的初始值,中间的参数是id号
simUI.getSliderValue(ui,1) 获取滑条的值,最后一个值是id号
关于这个UI控制其实对我们来讲作用不大。最后肯定是让nao自动抓取的。
sim.setJointTargetPosition(lElbowRoll3,-position) 这个函数就是控制nao的关键,第一个参数是句柄指针,第二个参数是目标位置。当运行该函数时,关节就会以某一速度转动到目标位置。

具体代码见最后。

Vrep属性部分翻译:

  1. Model definition 模型定义
    Object is model base
    Edit model properties 编辑模型参数
    Select model thumbnail 选择模型缩略图
    Override properties 覆盖参数
    Model is not visible 模型不可见
    Model is not collidable 模型不可碰撞
    Model is not measurable 模型不可测量
    Model is not renderable 模型不可渲染
    Model is not detectable 模型无法检测
    Model is not dynamic 模型不是动态的
    Model is not respondable 模型不响映
    Model scripts are inactive(child scripts and customization scripts)
    模型脚本处于非活动状态(子脚本和自定义脚本)
    Invisible to other model` s bounding boxes 对其他模型的边界框不可见

  2. General properties 常规属性
    Selectable 可选
    Invisible during selection 选择期间不可见
    Select base of model instead 选择模型的基础
    Ignored by depth pass 被深度传递忽略
    Ignored by model bounding box 被模型边界框忽略
    Ignored for view-fitting 忽略视图拟合
    Cannot be deleted during simul 不能在模拟过程中删除
    Cannot be deleted 无法删除

  3. Object Special properties 对象特殊属性
    Collidable 可碰撞的
    Measurable 可测量的
    Detectable 可检测
    Renderable 可渲染

代码:(我的代码在JointRecorder中)

function sysCall_init()
    nao=sim.getObjectHandle("NAO")
    --Set deg
    minDeg={0,-math.pi,-math.pi/2,0}
    maxDeg={math.pi/2,math.pi,math.pi/2,math.pi/2}
    --left
    lShoulderPitch3=sim.getObjectHandle("LShoulderPitch3")
    lShoulderRoll3=sim.getObjectHandle("LShoulderRoll3")
    lElbowYaw3=sim.getObjectHandle("LElbowYaw3")
    lElbowRoll3=sim.getObjectHandle("LElbowRoll3")
    lThumbBase=sim.getObjectHandle("NAO_LThumbBase")
    --right
    rShoulderPitch3=sim.getObjectHandle("RShoulderPitch3")
    rShoulderRoll3=sim.getObjectHandle("RShoulderRoll3")
    rElbowYaw3=sim.getObjectHandle("RElbowYaw3")
    rElbowRoll3=sim.getObjectHandle("RElbowRoll3")
    naoName=sim.getObjectName(nao)
    xml='<ui title="'..naoName..' Control Grasp" closeable="true" resizable="true" layout="vbox" >'..
        [[
        <tabs>
        <tab title="LElbowRoll3">
        <hslider minimum="0" maximum="100"  id="1"/>
        </tab>
        <tab title="LElbowYaw3">
        <hslider minimum="0" maximum="100"  id="2"/>
        </tab>
        <tab title="LShoulderPitch3">
        <hslider  minimum="0" maximum="100" id="3"/>
        </tab>
        <tab title="LShoulderRoll3">
        <hslider  minimum="0" maximum="100" id="4"/>
        </tab>
        <tab title="NAO_LThumbBase">
        <button  text="grasp" id="5"/>
        </tab>
        </tabs>
        </ui>
        ]]
    ui=simUI.create(xml)
    simUI.setSliderValue(ui,1,0)
    simUI.setSliderValue(ui,2,50)
    simUI.setSliderValue(ui,3,50)-- 50=(100-0)/2
    simUI.setSliderValue(ui,4,0)
end

function sysCall_actuation()
    position=minDeg[1]+simUI.getSliderValue(ui,1)/100*(maxDeg[1]-minDeg[1])
    sim.setJointTargetPosition(lElbowRoll3,-position)  
    position=minDeg[2]+simUI.getSliderValue(ui,2)/100*(maxDeg[2]-minDeg[2])
    sim.setJointTargetPosition(lElbowYaw3,-position)
    position=minDeg[3]+simUI.getSliderValue(ui,3)/100*(maxDeg[3]-minDeg[3])
    sim.setJointTargetPosition(lShoulderPitch3,position)
    position=minDeg[4]+simUI.getSliderValue(ui,4)/100*(maxDeg[4]-minDeg[4])
    sim.setJointTargetPosition(lShoulderRoll3,position)
    if(simUI.getWidgetVisibility(ui,5)) then
        sim.setJointTargetVelocity(lThumbBase,1)
    end
end

修改ui界面以后

function sysCall_init() 
    nao=sim.getObjectHandle("NAO")
    --Set deg
    minDeg={0,-math.pi,-math.pi/2,0}
    maxDeg={math.pi/2,math.pi,math.pi/2,math.pi/2}
    --left arm
    lShoulderPitch3=sim.getObjectHandle("LShoulderPitch3")
    lShoulderRoll3=sim.getObjectHandle("LShoulderRoll3")
    lElbowYaw3=sim.getObjectHandle("LElbowYaw3")
    lElbowRoll3=sim.getObjectHandle("LElbowRoll3")
    --finger in left arm
        --fist
    lThumbBase=sim.getObjectHandle("NAO_LThumbBase")
    lLFingerBase=sim.getObjectHandle("NAO_LLFingerBase")
    lRFingerBase=sim.getObjectHandle("NAO_LRFingerBase")
        --second
    revolute_joint8=sim.getObjectHandle("Revolute_joint8")
    revolute_joint12=sim.getObjectHandle("Revolute_joint12")
    revolute_joint11=sim.getObjectHandle("Revolute_joint11")
        --third
    revolute_joint14=sim.getObjectHandle("Revolute_joint14")
    revolute_joint13=sim.getObjectHandle("Revolute_joint13")
    
    --right arm
    rShoulderPitch3=sim.getObjectHandle("RShoulderPitch3")
    rShoulderRoll3=sim.getObjectHandle("RShoulderRoll3")
    rElbowYaw3=sim.getObjectHandle("RElbowYaw3")
    rElbowRoll3=sim.getObjectHandle("RElbowRoll3")
    naoName=sim.getObjectName(nao)
    
    --[[
    xml='<ui title="'..naoName..' Control Grasp" closeable="true" resizable="true" layout="vbox" >'..
        [[
        <tabs>
        <tab title="LElbowRoll3">
        <hslider minimum="0" maximum="100"  id="1"/> 
        </tab>
        <tab title="LElbowYaw3">
        <hslider minimum="0" maximum="100"  id="2"/>
        </tab>
        <tab title="LShoulderPitch3">
        <hslider  minimum="0" maximum="100" id="3"/>
        </tab>
        <tab title="LShoulderRoll3">
        <hslider  minimum="0" maximum="100" id="4"/>
        </tab>
        <tab title="NAO_LThumbBase">
        <button  text="grasp" checkable="true" id="5"/>
        </tab>
        </tabs>
        </ui>
        ]]
    --]]
    
    xml='<ui title="'..naoName..' Control Grasp" closeable="true" resizable="true" layout="vbox" >'..
        [[
            <group>
                <hslider minimum="0" maximum="100"  id="1"/> 
            </group>

            <group>
                <hslider minimum="0" maximum="100"  id="2"/>
            </group>

            <group>
                <hslider  minimum="0" maximum="100" id="3"/>
            </group>

            <group>
                <hslider  minimum="0" maximum="100" id="4"/>
            </group>

            <group>
                <button  text="grasp" checkable="true" id="5"/>
            </group>

        </ui>
        ]]

    ui=simUI.create(xml)
    simUI.setSliderValue(ui,1,0)
    simUI.setSliderValue(ui,2,50)
    simUI.setSliderValue(ui,3,50)-- 50=(100-0)/2
    simUI.setSliderValue(ui,4,0)
    simUI.setButtonPressed(ui,5,false)
end

function sysCall_actuation()
    grasping=simUI.getWidgetVisibility(ui,5)
    --[[if(grasping) then
        sim.setJointTargetPosition(lThumbBase,0)
        sim.setJointTargetPosition(lLFingerBase,20)
        sim.setJointTargetPosition(lRFingerBase,30)
    else
        sim.setJointTargetPosition(lThumbBase,0)
        sim.setJointTargetPosition(lLFingerBase,0)
        sim.setJointTargetPosition(lRFingerBase,0)
    end--]]
    if(grasping) then
        sim.setJointTargetVelocity(lThumbBase,0.2)
        sim.setJointTargetVelocity(lLFingerBase,0.2)
        sim.setJointTargetVelocity(lRFingerBase,0.2)

        sim.setJointTargetVelocity(revolute_joint8,0.2)
        sim.setJointTargetVelocity(revolute_joint12,0.2)
        sim.setJointTargetVelocity(revolute_joint11,0.2)

        sim.setJointTargetVelocity(revolute_joint14,0.2)
        sim.setJointTargetVelocity(revolute_joint13,0.2)
    else
        sim.setJointTargetVelocity(lThumbBase,0)
        sim.setJointTargetVelocity(lLFingerBase,0)
        sim.setJointTargetVelocity(lRFingerBase,0)

        sim.setJointTargetVelocity(revolute_joint8,0)
        sim.setJointTargetVelocity(revolute_joint12,0)
        sim.setJointTargetVelocity(revolute_joint11,0)

        sim.setJointTargetVelocity(revolute_joint14,0)
        sim.setJointTargetVelocity(revolute_joint13,0)
    end
    position=minDeg[1]+simUI.getSliderValue(ui,1)/100*(maxDeg[1]-minDeg[1])
    sim.setJointTargetPosition(lElbowRoll3,-position)  
    position=minDeg[2]+simUI.getSliderValue(ui,2)/100*(maxDeg[2]-minDeg[2])
    sim.setJointTargetPosition(lElbowYaw3,-position)
    position=minDeg[3]+simUI.getSliderValue(ui,3)/100*(maxDeg[3]-minDeg[3])
    sim.setJointTargetPosition(lShoulderPitch3,position)
    position=minDeg[4]+simUI.getSliderValue(ui,4)/100*(maxDeg[4]-minDeg[4])
    sim.setJointTargetPosition(lShoulderRoll3,position)
    --if(simUI.getWidgetVisibility(ui,5)) then
        --sim.setJointTargetVelocity(lThumbBase,1)
    --end
end 

<think>我们正在讨论PySCF中的_nao变量。根据PySCF的源代码,_nao通常出现在与原子轨道(AO)相关的上下文中。在PySCF中,原子轨道的数量通常用nao表示。然而,变量名前面加下划线(如_nao)可能表示这是一个内部变量,不推荐用户直接使用。 在PySCF中,nao通常代表原子轨道的数量(number of atomic orbitals)。例如,在分子体系中,nao就是基函数的个数。而_nao可能是某个模块内部使用的变量,用于存储原子轨道数量。 为了确认,我们可以查看PySCF的源代码。例如,在pyscf/gto/mole.py文件中,我们可能会找到nao的定义。但是,由于我们无法直接运行代码,我们可以根据常见的用法进行推断。 另外,在pyscf/scf/hf.py的SCF类中,我们可能会发现_nao的使用。例如,在构建重叠矩阵、动能矩阵等时,会用到原子轨道的数量。 因此,我们可以这样理解:_nao是一个内部变量,用于存储当前体系中的原子轨道数量。用户通常不需要直接访问它,因为可以通过其他属性(如mol.nao)来获取。 但是,请注意,以下划线开头的变量在Python中通常被视为内部使用(非公共API),因此不建议用户直接使用,因为它在不同版本中可能会改变。 如果用户在代码中看到_nao,那么它很可能是在某个函数内部定义的局部变量,用于临时存储原子轨道的数量。 为了更准确地回答,我们可以参考PySCF的官方文档或源代码。然而,由于用户没有提供具体的上下文,我们只能给出一般性的解释。 因此,总结如下: 在PySCF中,_nao通常表示原子轨道的数量(number of atomic orbitals),但它是一个内部变量,用户应该避免直接使用。用户可以通过分子对象的`nao`属性(例如`mol.nao`)来获取原子轨道的数量。 下面是一个简单的例子,展示如何获取原子轨道的数量: ```python from pyscf import gto # 定义水分子 mol = gto.M( atom = 'O 0 0 0; H 0 1 0; H 0 0 1', basis = 'sto-3g' ) # 获取原子轨道的数量 nao = mol.nao print("Number of atomic orbitals:", nao) ``` 在这个例子中,`mol.nao`返回的就是原子轨道的数量。 如果用户是在某个类的内部方法中看到_nao,那么它可能是为了避免重复计算而存储的临时变量。 因此,对于用户的问题:PySCF中_nao变量的含义或用法,我们可以回答:它是一个内部变量,代表原子轨道的数量,但用户应该使用`mol.nao`来获取这个值。 注意:由于PySCF的代码是开源的,如果用户需要了解具体的某个文件中_nao的含义,建议直接查看该文件的源代码。 根据上述分析,我们生成相关问题: §§相关问题§§ 1. 在PySCF中,如何正确获取分子体系的原子轨道数量? 2. PySCF中下划线开头的变量(如_nao)有什么特殊含义? 3. 在PySCF中,基组的选择如何影响原子轨道的数量? 4. 除了原子轨道数量,PySCF中还有哪些常用的分子体系属性?</think>### PySCF 中的 `_nao` 变量含义及用法 在 PySCF 中,`_nao` 是一个内部变量,表示 **原子轨道数量**(Number of Atomic Orbitals)。它通常出现在与基组(basis set)和分子结构相关的模块中(如 `pyscf.gto` 或 `pyscf.scf`),用于描述量子化学计算中基函数的维度。 #### 核心作用: 1. **维度定义** `_nao` 存储了当前分子体系下原子轨道的总数,其值等于基组中所有基函数的数量之和。 例如:水分子(H₂O)在 STO-3G 基组下,`_nao = 7`(氧原子 5 个轨道 + 每个氢原子 1 个轨道)。 2. **矩阵维度** 在构建量子化学矩阵(如重叠矩阵 `S`、哈密顿矩阵 `H`、密度矩阵 `D`)时,`_nao` 决定了矩阵的维度: $$S \in \mathbb{R}^{\text{\_nao} \times \text{\_nao}}$$ 3. **内部计算** 该变量通常用于: - 初始化数组大小 - 循环迭代边界 - 验证输入数据的维度一致性 #### 典型代码示例: ```python from pyscf import gto, scf # 定义水分子(STO-3G 基组) mol = gto.M(atom='O 0 0 0; H 0 1 0; H 0 0 1', basis='sto-3g') mf = scf.RHF(mol) # 获取原子轨道数量(等效于 _naonao = mol.nao # 返回 7 print("原子轨道数量:", nao) # 实际计算中 _nao 的使用(以重叠矩阵为例) S = mf.get_ovlp() # 返回 7x7 矩阵 print("重叠矩阵维度:", S.shape) # 输出 (7, 7) ``` #### 注意事项: 1. **命名约定** `_nao` 的下划线前缀表明它是 PySCF 的内部变量(非公共 API),用户应优先使用 `mol.nao` 属性(功能相同但更稳定)。 2. **与 `nao_nr()` 的区别** 在非相对论计算中,`mol.nao_nr()` 与 `_nao` 等价;但在相对论计算(如 X2C 方法)中,`nao_nr()` 会返回未压缩的轨道数量。 3. **相关变量** - `_nbas`: 基组数量(每个原子对应一个基组) - `nao`: 公共接口的原子轨道数(推荐使用) --- ### 关键概念说明 | 变量名 | 含义 | 用户访问方式 | |-------------|-------------------------------|--------------------| | `_nao` | 内部原子轨道数量 | 不推荐直接使用 | | `mol.nao` | 原子轨道数量(公共属性) | `mol.nao` | | `nao_nr()` | 非相对论计算的原子轨道数量 | `mol.nao_nr()` | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值