前段時間在用大疆的uwb,在windows上按照說明書很順利的就完成了標籤的配置以及座標角度的通過com口的讀取。
於是準備移植到ubuntu上加入ros中,但是就遇上了一些不太理解的bug就放棄了。
然後今天又撿起來研究了一下,最後還是成功把資料讀出來了。
串列埠的資料讀取程式總體介面參考這位老哥:
按照大疆uwb標籤說明書我們發現資料格式是11*2位元組
在linux裡使用串列埠除錯助手,測試發現資料重複的規律是每38位元組一輪迴圈
於是我就把資料位設了38位元組讀取。再用low + high * 256
的方式查詢資料發現,從第14位元組開始才是我們需要的資料內容,從14位元組開始的後面6個位元組是x,y,theta
。
完成資料查詢後,我又發現座標資料會有跳變的bug,這個就是高八位和低八位相加的問題,修改了座標x,y
的計算方法後修復了跳變bug。
下面貼**,主要就是遇上了兩個linux專屬bug:乙個就是他這個資料格式和說明書對不上,再就是計算座標不能用char型的直接加,解決了就很簡單了,本質上是兩個超級low的問題
#include
#include
#include
"boost/asio.hpp"
#include
"boost/bind.hpp"
#include
#include
using
namespace std;
using
namespace boost::asio;
intmain
(int argc,
char
** ar**)
;//38 * 8bit
boost::system::error_code err;
//scanf("%s\n",rxdata);
//std::cout << "de1" << std::endl;
sp.read_some
(buffer
(rxdata,38)
,err);if
(err)
//std_msgs::string msg;
//std::stringstream ss;
//測試發現資料從第14個位元組開始,前6位元組分別是x,y,theta
//計算x,y需要先將低八位轉化成無符號8位整形,將高八位轉化成有符號16位整形
uint8_t xl = rxdata[14]
;int16_t xh = rxdata[15]
;uint8_t yl = rxdata[16]
;int16_t yh = rxdata[17]
;int16_t x = xl + xh *
256;
int16_t y = yl + yh *
256;
uint16_t theta = rxdata[18]
+ rxdata[19]
*256
;//角度可以直接如此計算
//角度範圍為0-36000,除100
theta /
=100
;//ros_info("uwb x: %d, %d, y: %d, %d, theta: %d", xl, xh, yl, yh, theta);
ros_info
("uwb x: %d, y: %d, theta: %d"
, x, y, theta);/*
for(int i = 0; i < 38; i+=2)
std::cout << std::endl;
*/ loop_rate.
sleep()
;}return0;
}
KVM中使用usb裝置
進來學習usb驅動,看到網上都在分析usb skeleton.c的驅動框架,就想對其除錯一下,看一下其函式呼叫流程。要想除錯usb skeleton,首先需要kvm能夠探測到usb裝置 其次,在kvm中編譯usb skeleton.c 最後,解除安裝預設的usb storage.ko,載入usb s...
KVM中使用usb裝置
進來學習usb驅動,看到網上都在分析usb skeleton.c的驅動框架,就想對其除錯一下,看一下其函式呼叫流程。要想除錯usb skeleton,首先需要kvm能夠探測到usb裝置 其次,在kvm中編譯usb skeleton.c 最後,解除安裝預設的usb storage.ko,載入usb s...
Ubuntu中使用總結
查詢埠是否有程序守護用如下命令grep對應埠,如80為埠號 例 netstat nalp grep 80 netstat ntupl grep processname processname 程序名稱。netstat anop grep pid pid 程序id。ps ef grep client ...