V-rep学习笔记:串口操作

  VREP Regular API提供了串口操作的相关函数,可以对串口进行打开、关闭和读写:

  下面使用一款淘宝上常见的AHRS(Attitude and heading reference system,航姿参考系统)模块来驱动VREP中的虚拟模型,控制其姿态。VREP通过串口读取传感器实时发送的数据并进行解析。

  传感器通过串口发送2种数据:

  1. 解算后的姿态角和气压高度等数据
  2. 原始的传感器ADC数据(直接从传感器读取出来的测量值,没有经过解算处理)

  下面是VREP中以16进制显示的接收到的串口数据:

  根据约定的通信协议,上位机要对接收到的字符串进行解析。关键的一步是要将2个byte型(8位)变量转换为int16型(有符号整型变量,16位),因为角度、高度、温度等数据都可以有正负。

  计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

  以0x8000为例,若用无符号数表达其值为32768,若用有符号数表达其值为-32768。 因为0x8000最高位为1是负数,其代表的值为-(0x7FFF + 1) = -(0x8000) = - 32768(负数的补码求原码和负数的原码求补码的方法一样:除符号位外,每位求反,末位加一

  • 原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如:

[+1] = 0000 0001

[-1] = 1000 0001

  • 正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反:

[+1] = [00000001] = [00000001]

[-1] = [10000001] = [11111110]

  • 正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反后+1. (即在反码的基础上+1):

[+1] = [00000001] = [00000001] = [00000001]

[-1] = [10000001] = [11111110] = [11111111]

  补码运算的规则如下。采用补码表示数,在计算机的加、减法运算中,不必判断数的正负,只要符号位参加运算就能自动得到正确的结果。

[ x + y ]  =  x  +  y

[ x - y ]补   =  x  +  [-y]

  将两个2个byte数据转换为int16型的函数如下:

function make_int16(b1, b2)
  assert (0 <= b1 and b1 <= 0xff)
  assert (0 <= b1 and b2 <= 0xff)
  local mask = (1 << 15)
  local res  = (b1 << 8) | (b2 << 0)
  return (res ~ mask) - mask
end

  其中mask = (1000 0000 0000 0000)b,将其与res进行异或操作(res~mask)只改变符号位,正数符号位变为1,负数符号位变为0。然后再减去mask,得到res的有符号数。

  以0x81和0xC3为例:

  res = 0x81<<8 | 0xC3 = (1000 0001 1100 0011)b

  res~mask = (0000 0001 1100 0011)b

  ((res~mask) - mask)  =  (res~mask)+(-mask )补 = (0000 0001 1100 0011)b补 + (1000 0000 0000 0000)b补 = (1000 0001 1100 0011)b补 = -32317

  Lua 5.3开始可以使用“<<”、“~”、“|”等运算符进行移位、取反、或等按位操作,而VREP 3.4中使用的是Lua 5.1还不支持按位操作运算符,可以下载合适的bitwise operation lib,下面使用了LuaBit来完成移位等操作。

代码如下:

require ‘bit‘

make_int16 = function(bh ,bl)

  assert (0 <= bh and bh <= 0xff)
  assert (0 <= bl and bl <= 0xff)
  local mask = bit.blshift(1, 15)                 -- mask = 1 << 15
  local res  = bit.bor(bit.blshift(bh,8), bl)     -- res = (bh << 8) | bl
  return bit.bxor(res, mask) - mask               -- (res ~ mask) - mask

end

HelicopterHandle = simGetObjectHandle("Helicopter")

--defining the serial port number
port = simGetScriptSimulationParameter(sim_handle_self,‘serialPortNumber‘)
portNumber = "COM"..port
baudrate = 115200

-- Opens a serial port (RS-232) for communication
serial = simSerialOpen(portNumber, baudrate)

while (simGetSimulationState()~=sim_simulation_advancing_abouttostop) do

    -- Reads how many bytes are waiting to be read on a serial port
    --local number =simSerialCheck(serial)

    -- Reads from a previously opened serial port (RS-232).
    local str = simSerialRead(serial, 44, true, ‘‘, 1)

    visibleString = ‘‘
    if str ~= nil then
        for i=1,#str,1 do
            visibleString = visibleString..string.format("%02X ", string.byte(str,i))
        end
        --simAddStatusbarMessage(visibleString)

        yaw    = make_int16(string.byte(str,5), string.byte(str,6))
        pitch  = make_int16(string.byte(str,7), string.byte(str,8))
        roll   = make_int16(string.byte(str,9), string.byte(str,10))

        simAddStatusbarMessage(string.format("Yaw:%.1f  Pitch:%.1f  Roll:%.1f", yaw*0.1,pitch*0.1,roll*0.1))
        simSetObjectOrientation(HelicopterHandle, -1, {math.pi/2-pitch*0.1*math.pi/180,-yaw*0.1*math.pi/180,roll*0.1*math.pi/180})

    end

end

-- Closes a serial port (RS-232). Port is automatically closed at simulation stop
simSerialClose(serial)

参考:
Bitwise Operators

原码, 反码, 补码 详解

Online Binary-Decimal Converter

How can I convert a pair of bytes into a signed 16-bit integer using Lua?

时间: 2025-01-15 17:15:16

V-rep学习笔记:串口操作的相关文章

Blender学习笔记 | 02 | 操作

Shift 点击不同图层 同时显示多图层物件 z 切换 Solid / Wireframe 视图模式 点选物件后M 移动到图层选项 Ctrl + 鼠标左键拖动 自由全选物件 B 方形区域圈选物件 Tab Object / Edit Mode 切换 T 开 / 关 侧栏 Ctrl + Tab 编辑状态下切换编辑对象 E Extrude Region 推挤区域.以发现为轴线. X 删除物件菜单 Blender学习笔记 | 02 | 操作,布布扣,bubuko.com

memcached学习笔记5--socke操作memcached 缓存系统

使用条件:当我们没有权限或者不能使用服务器的时候,我们需要用socket操作memcached memcached-client操作 特点: 无需开启memcache扩展 使用fsocketopen()套接字连接memcached 同样执行CRUD require_once(CLASS_PATH.'memcached-client.php');//CLASS_PATH 是我定义的类文件文件夹路径 $mc = new memcached( array( 'servers' => array( '1

树莓派学习笔记——SQLite操作简述

0 前言 本文介绍如何在树莓派中利用SQLite数据库保存CPU温度数据.SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景按需说明.本文介绍的SQLite技巧也可以在其他平台使用,并不局限于树莓派. 本文继续折腾树莓派温度,需要从中可以玩出新花样. [相关博文] [树莓派学习笔记--索引博文]--更多博文请关注. [树莓派学习笔记--获取树莓派CPU温度] [树莓派学习笔

计算机操作系统学习笔记_1_操作系统概述

操作系统概述 一.操作系统的概念.特征.功能和提供的服务 1.操作系统的概念     操作系统是计算机系统中最重要.最基本的系统软件,操作系统位于硬件和用户程序之间.    对于用户来讲:它能向用户提供使用计算机的接口;    从资源管理角度来看:它能管理计算机软硬件资源,提高其利用率;    再者,利用虚拟机技术(如WMWare,VirtualBox,Java虚拟机等),扩展了计算机的功能和使用范围.     因此,操作系统的定义为:操作系统是控制和管理计算机软.硬件资源,以尽可能合理.高效的

memcached学习笔记3--telnet操作memcached

方式: 一.telnet访问memcached缓存系统(主要用于教学,不讨论) telnet 127.0.0.1 11211     => telnet IP地址 端口号 //往Memcached中存放数据 add username 0 60 5       => add:添加命令 username:key的名字(是以key/value存放) 0:标示,一般不用管 60:缓存多长时间,超过时间自动删除,单位(秒) s 5: 表示放入的数据大小 注意:如果一个key已经存在,再要添加数据到这个k

&#8203;【安全牛学习笔记】操作系统识别

该笔记为安全牛课堂学员笔记,想看此课程或者信息安全类干货可以移步到安全牛课堂 Security+认证为什么是互联网+时代最火爆的认证? 牛妹先给大家介绍一下Security+ Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA :是和CISSP.ITIL 等共同包含在内的国际 IT 业 10 大热门认证之一,和CISSP偏重信息安全管理相比,Security+ 认证更偏重信息安全技术和操作. 通过该认证证明了您具备网络安全,合规性和操作安全,威胁和漏洞,应

PHP学习笔记-文件操作1

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52294237 本文出自:[顾林海的博客] 前言 PHP支持文件上传功能,因此学习PHP文件的相关操作是必须的,这篇笔记会去记录PHP文件系统的相关知识. 文件打开与关闭 文件处理包括读取.关闭.重写等,例如,访问一个文件需要3步:打开文件.读写文件和关闭文件.其他的操作要么是包含在读写文件中(如显示内容.写入内容等),要么与文件自身的属性有关系(如文件遍历.文件改名等

Linux学习笔记——vim操作使用

vim编辑器 vim是Linux下一个很好用的文本编辑器 vim有三种基本模式:编辑模式,命令模式和末行模式 下面分别介绍三种模式的操作 首先介绍三种模式的转换方法: 编辑模式 --> 输入模式 i: insert, 在光标所在处输入: a: append, 在光标所在处后面输入: o: 在当前光标所在行的下方打开一个新行: I:在当前光标所在行的行首输入: A:在当前光标所在行的行尾输入: O:在当前光标所在行的上方打开一个新行: c C 输入模式 --> 编辑模式 ESC 编辑模式 --&

Android学习笔记-ContentProvider操作

---恢复内容开始--- 之前写了一个用SQlite来实现增删改查的应用,今天又新学了一个用ContentProvider来操作的增删改查 首先ContentProvider是用来共享数据的,那么咱们先来建立一个数据源,之后用其他程序获得共享的ContentProvider,来实现CRUD   数据源结构,一共三个Java文件 SQLDatabaseHelper.java 1 package com.example.sqlcz; 2 3 import android.content.Contex

MongoDB 学习笔记(python操作)

一.MongoDB 数据库操作  1. 连接数据库    import pymongo    conn = pymongo.Connection() # 连接本机数据库    # conn = pymongo.Connection(host="192.168.1.202") # 连接指定IP的数据库    db = conn.test # 进入指定名称的数据库    users = db.users # 获取数据库里的 users 集合    users = db['users'] #