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的优点更牛,跨域请求. ...
随机推荐
- 为什么你的session不见了
一:现象 有小伙伴写了下面一段代码,然后发现,随着每次关闭浏览器,count的值重新开始计数了,如下: protected void doGet(HttpServletRequest request, ...
- BZOJ3916: [Baltic2014]friends
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3916 题解:随便hash.刚开始看错题WA了N发.(我连双hash都写了!) 代码: #inc ...
- REST构架风格介绍之二:CRUD
转载自:Todd Wei http://www.cnblogs.com/weidagang2046/archive/2009/05/09/1453065.html 上一节我们通过两个例子初步体 ...
- JUnit 入门
JUNIT了解学习 转自:关于Java单元测试,你需要知道的一切 转自:JUnit 入门教程 JUnit高级用法之@RunWith @RunWith 关于@RunWith注解,官方文档是这么描述的: ...
- GIS原理学习目录
GIS原理学习目录 内容提要 本网络教程是教育部“新世纪网络课程建设工程”的实施课程.系统扼要地阐述地理信息系统的技术体系,重点突出地理信息系统的基本技术及方法. 本网络教程共分八章:第一章绪论,重点 ...
- tensorflow语义分割api使用(deeplab训练cityscapes)
安装教程:https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/installation.md citysca ...
- Could not load file or assembly 'System.Data.SQLite' or one of its dependencies. An attempt was made to load a program
今天同事在一个服务器(winserver 2008 x64)上新建了一个IIS(7) 网站,但是报了如下错误: Could not load file or assembly 'System.Data ...
- printf()详解之终极无惑
1.printf()简介 printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出.标准输出,即标准输出文件,对应终端的屏幕.printf()申明于头文件stdio.h. 函数原型: ...
- InvalidateRect,invalidate,updatewindow(转)
InvalidateRect(HWND) 使窗口无效 产生消息WM_PAINT; ValidateRect(HWND)使窗口有效 清除消息队列中的WM_PAINT消息 在编程的时候经常把UpdateD ...
- memcache的资料集
1. 安装与查看过程(完整) https://www.cyberciti.biz/faq/rhel-fedora-linux-install-memcached-caching-system-rpm/ ...