V-rep学习笔记:串口操作
VREP Regular API提供了串口操作的相关函数,可以对串口进行打开、关闭和读写:
下面使用一款淘宝上常见的AHRS(Attitude and heading reference system,航姿参考系统)模块来驱动VREP中的虚拟模型,控制其姿态。VREP通过串口读取传感器实时发送的数据并进行解析。
传感器通过串口发送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 ( <= b1 and b1 <= 0xff)
assert ( <= b1 and b2 <= 0xff)
local mask = ( << )
local res = (b1 << ) | (b2 << )
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 ( <= bh and bh <= 0xff)
assert ( <= bl and bl <= 0xff)
local mask = bit.blshift(, ) -- mask = 1 << 15
local res = bit.bor(bit.blshift(bh,), 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 = -- 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, , true, '', ) visibleString = ''
if str ~= nil then
for i=,#str, do
visibleString = visibleString..string.format("%02X ", string.byte(str,i))
end
--simAddStatusbarMessage(visibleString) yaw = make_int16(string.byte(str,), string.byte(str,))
pitch = make_int16(string.byte(str,), string.byte(str,))
roll = make_int16(string.byte(str,), string.byte(str,)) simAddStatusbarMessage(string.format("Yaw:%.1f Pitch:%.1f Roll:%.1f", yaw*0.1,pitch*0.1,roll*0.1))
simSetObjectOrientation(HelicopterHandle, -, {math.pi/-pitch*0.1*math.pi/,-yaw*0.1*math.pi/,roll*0.1*math.pi/}) end end -- Closes a serial port (RS-232). Port is automatically closed at simulation stop
simSerialClose(serial)
Online Binary-Decimal Converter
How can I convert a pair of bytes into a signed 16-bit integer using Lua?
V-rep学习笔记:串口操作的更多相关文章
- Javascript学习笔记二——操作DOM
Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- Javascript学习笔记三——操作DOM(二)
Javascript学习笔记 在我的上一个博客讲了对于DOM的基本操作内容,这篇继续巩固一下对于DOM的更新,插入和删除的操作. 对于HTML解析的DOM树来说,我们肯定会时不时对其进行一些更改,在原 ...
- .net学习笔记---xml操作及读写
一.XML文件操作中与.Net中对应的类 微软的.NET框架在System.xml命名空间提供了一系列的类用于Dom的实现. 以下给出XML文档的组成部分对应.NET中的类: XML文档组成部分 对应 ...
- python学习笔记:文件操作和集合(转)
转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...
- PHP学习笔记--文件目录操作(文件上传实例)
文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...
- python自动化测试学习笔记-6excel操作xlwt、xlrd、xlutils模块
python中通过xlwt.xlrd和xlutils操作xls xlwt模块用于在内存中生成一个xls/xlsx对象,增加表格数据,并把内存中的xls对象保存为本地磁盘xls文件; xlrd模块用于把 ...
- ThinkPHP5.1学习笔记 数据库操作
数据库 参见<Thinkphp5.1完全开发手册>学习 Mirror王宇阳 数据库连接 ThinkPHP采用内置抽象层对数据库操作进行封装处理:且基于PDO模式,可以适配各种数据库. 数据 ...
- 【最简单的vim教程】vim学习笔记-基础操作
说明 C-字母 = Ctrl + 字母 char = 任意字符 开始编辑 insert 按键 功能 说明 i(I) insert 当前位置插入(当前行前) a(A) append 当前字符后面插入(当 ...
- js学习笔记:操作iframe
iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...
随机推荐
- Android Studio导入项目的中文注释乱码解决方法
在Android studio中,导入Android的项目后,容易出现项目文件的中文乱码,中文无法正常显示,变成了一些格子问号之类的,导致无法查看中文的注释,下面来看看导入项目和解决乱码 ...
- 几个常用linux命令语句
几个常用linux命令 英文原文:What are the most useful "Swiss army knife" one-liners on Unix? 下面的这些内容是 ...
- 【BZOJ】【4145】【AMPPZ2014】The Prices
状压DP/01背包 Orz Gromah 容易发现m的范围很小……只有16,那么就可以状压,用一个二进制数来表示买了的物品的集合. 一种简单直接的想法是:令$f[i][j]$表示前$i$个商店买了状态 ...
- cplusplus 库 在线管理; 类似于 python的 pip install 、nodejs 的npm模块
cplusplus 库 在线管理: 类似于 python的 pip install .nodejs 的npm模块 还有 apache 经常使用的 Apache Ivy 项目依赖管理工具/Maven 这 ...
- Java hashCode() 和 equals()的若干问题解答<转载自skywang12345>
第1部分 equals() 的作用equals()的作用是用来判断两个对象是否相等.equals()定义在JDK的Object类中.通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否 ...
- emouse思·睿—评论与观点整理之一
虽说我主要做的硬件,平时的兴趣爱好比较关注移动互联网,混迹于虎嗅.爱范儿.雷锋网.36Kr.cnBeta.瘾科技.i黑马.TechWeb等这类科技以及创业媒体,遗憾的是系统的去写的并不多,好在还算充分 ...
- Cognos11只需简单几步创建你的Dashboard
一.环境 操作系统:win10 数据库 :SQLserver 2008 R2 软件版本:IBM Cognos Analytics 11.0.6 浏览器 :IE 11 二.开始创建仪表板 2.1 ...
- registry-1.docker.io TimeOut 错误
用Docker For Windows在Windows 10上执行docker login或者 docker pull/push的时候,经常会报这样的错误: https: Get https://re ...
- 面试题04_替换空格_剑指Offer系列
题目描写叙述 请实现一个函数,将一个字符串中的空格替换成"%20". 比如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解题思路 ...
- (纪录片)光的故事 BBC Light Fantastic (2004)
简介: 导演: Jeremy Turner主演: Simon Schaffer / Dimitri Andreas ... Al Hazen / Edmund Dehn ... Priest/Old ...