Ubuntu中使用USB讀取大疆UWB的資料

2021-10-08 13:17:00 字數 2032 閱讀 2695

前段時間在用大疆的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 ...