激光雷達(dá)工作時(shí)會(huì)先在當(dāng)前位置發(fā)出激光并接收反射光束,解析得到距離信息,而后激光發(fā)射器會(huì)轉(zhuǎn)過(guò)一個(gè)角度分辨率對(duì)應(yīng)的角度再次重復(fù)這個(gè)過(guò)程。
限于物理及機(jī)械方面的限制,激光雷達(dá)通常會(huì)有一部分“盲區(qū)”。使用激光雷達(dá)返回的數(shù)據(jù)通??梢悦枥L出一幅極坐標(biāo)圖,極點(diǎn)位于雷達(dá)掃描中心,0-360°整周圓由掃描區(qū)域及盲區(qū)組成。
在掃描區(qū)域中激光雷達(dá)在每個(gè)角度分辨率對(duì)應(yīng)位置解析出的距離值會(huì)被依次連接起來(lái),這樣,通過(guò)極坐標(biāo)表示就能非常直觀地看到周?chē)矬w的輪廓,激光雷達(dá)掃描范圍示意圖可以參見(jiàn)下圖。
激光雷達(dá)通常有四個(gè)性能衡量指標(biāo):測(cè)距分辨率、掃描頻率(有時(shí)也用掃描周期)、角度分辨率及可視范圍。
測(cè)距分辨率衡量在一個(gè)給定的距離下測(cè)距的精確程度,通常與距離真實(shí)值相差在5-20mm;掃描頻率衡量激光雷達(dá)完成一次完整掃描的快慢,通常在10Hz及以上;
角度分辨率直接決定激光雷達(dá)一次完整掃描能返回多少個(gè)樣本點(diǎn);可視范圍指激光雷達(dá)完整掃描的廣角,可視范圍之外即為盲區(qū)。
目前,移動(dòng)機(jī)器人的研究中已經(jīng)大量使用激光雷達(dá)輔助機(jī)器人的避障導(dǎo)航。通常激光雷達(dá)會(huì)提供ROS驅(qū)動(dòng),如果沒(méi)有的話我們也可以自己采集激光數(shù)據(jù)后按照ROS中定義的消息格式將信息發(fā)布出去。
首先,輸入下面的指令查看LaserScan消息結(jié)構(gòu):
rosmsg show sensor_msgs/LaserScan
LaserScan消息結(jié)構(gòu)如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities
以下圖為例,該激光雷達(dá)掃描范圍為270°,角度分辨率為0.25°,掃描距離為0~20m,每掃描一圈會(huì)得到1081個(gè)點(diǎn):
那么該激光雷達(dá)發(fā)布的LaserScan消息內(nèi)容如下:
angle_min= -135 * (pi/180); //angle correspond to FIRST beam in scan ( in rad)
angle_max= 135 * (pi/180); //angle correspond to LAST beam in scan ( in rad)
angle_increment =0.25 * (pi/180); // Angular resolution i.e angle between 2 beams
// lets assume sensor gives 50 scans per second. i.e every 20 milli seconds 1 scan with 1081 beams.
// Each beam is measured in (20 ms/ 1081 ) ~ = 0.0185 ms
time_increment = (1 / 50) / (1081);
scan_time = ; // scan is collected at which time
range_min =0 ; // in meters
range_max = 20; // scan can measure upto this range
// ranges is array of 1081 floats for each laser beam
ranges[0] = //distance measure corresponds to angle -135 deg
ranges[1] = //distance measure corresponds to angle -134.75 deg
.
.
.
ranges[1080] = //distance measure corresponds to angle +135 deg
// To understand Intensities
// if a laser beam hits reflective surface like glass it will have intensity 1.
// And if beam hit some surface which absorbs laser , then intensity is zero.
// Middle values are different surfaces in between.
下面的代碼模擬了激光雷達(dá)的數(shù)據(jù),并將sensor_msgs/LaserScan消息發(fā)布到/scan話題上:
int main(int argc, char** argv)
{
ros::init(argc, argv, "laser_scan_publisher");
ros::NodeHandle n;
ros::Publisher scan_pub = n.advertise("scan", 50);
unsigned int num_readings = 100;
double laser_frequency = 40;
double ranges[num_readings];
double intensities[num_readings];
int count = 0;
ros::Rate r(1.0);
while(n.ok())
{
//generate some fake data for our laser scan
for(unsigned int i = 0; i < num_readings; ++i)
{
ranges[i] = count;
intensities[i] = 100 + count;
}
ros::Time scan_time = ros::now();
//populate the LaserScan message
sensor_msgs::LaserScan scan;
scan.header.stamp = scan_time;
scan.header.frame_id = "base_link";
scan.angle_min = -1.57;
scan.angle_max = 1.57;
scan.angle_increment = 3.14 / num_readings;
scan.time_increment = (1 / laser_frequency) / (num_readings);
scan.range_min = 0.0;
scan.range_max = 100.0;
scan.ranges.resize(num_readings);
scan.intensities.resize(num_readings);
for(unsigned int i = 0; i < num_readings; ++i)
{
scan.ranges[i] = ranges[i];
scan.intensities[i] = intensities[i];
}
scan_pub.publish(scan);
++count;
r.sleep();
}
}
可以在rviz中將激光數(shù)據(jù)點(diǎn)顯示出來(lái):Fixed Frame修改為base_link,添加LaserScan并將Topic設(shè)為/scan
如果Fixed Frame為map,為了能正確顯示出激光掃描點(diǎn)來(lái),需要發(fā)布map和base_link之間的坐標(biāo)變換關(guān)系(因?yàn)槲覀兊募す鈹?shù)據(jù)是相對(duì)于base_link坐標(biāo)系描述的)。
如果這兩個(gè)參考系不發(fā)生相對(duì)位置變化,那么可以用static_transform_publisher工具發(fā)布兩個(gè)參考系之間的靜態(tài)坐標(biāo)變換。
命令的格式如下:
static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
以上兩種命令格式,需要設(shè)置坐標(biāo)的偏移和旋轉(zhuǎn)參數(shù),偏移參數(shù)都使用相對(duì)于x、y、z三軸的坐標(biāo)位移。旋轉(zhuǎn)參數(shù)第一種命令格式使用以弧度為單位的 yaw/pitch/roll三個(gè)角度,第二種命令格式使用四元數(shù)表達(dá)旋轉(zhuǎn)角度。發(fā)布頻率以ms為單位,一般100ms比較合適。
static_transform_publisheris designed both as a command-line tool for manual use, as well as for use withinroslaunchfiles for setting static transforms. For example:
"tf" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 1 link1_parent link1 100" />
ROS中使用激光雷達(dá)(鐳神智能)
LS01C是深圳市鐳神智能系統(tǒng)有限公司研發(fā)的激光三角測(cè)距系統(tǒng) 。
在機(jī)械旋轉(zhuǎn)模塊的帶動(dòng)下,LS01C 的高頻核心測(cè)距模塊將進(jìn)行順時(shí)鐘旋轉(zhuǎn),從而實(shí)現(xiàn)對(duì)周?chē)h(huán)境進(jìn)行360°掃描測(cè)距。LS01C通過(guò)uart 串口信號(hào)與外部系統(tǒng)通訊,默認(rèn)每秒采樣3600點(diǎn)、掃描頻率10hz,最大掃描距離6m,角度分辨率為1度。
將LS01C的ROS驅(qū)動(dòng)文件(官網(wǎng)上沒(méi)有下載連接,直接打電話給客服要的)解壓重命名為talker后復(fù)制到catkin_ws/src下面,然后使用catkin_make進(jìn)行編譯
插入USB后在終端中輸入以下命令查看USB轉(zhuǎn)串口設(shè)備:
在發(fā)現(xiàn)ttyUSB0后在終端中輸入下面命令給USB 轉(zhuǎn)串口設(shè)置權(quán)限:
sudo chmod 666 /dev/ttyUSB0
修改launch文件中的串口名,改為我們插入的ttyUSB0
"talker" pkg="talker" type="talker">
"scan_topic" value="scan"/>
"laser_link" value="laser_link"/>
"serial_port" value="/dev/ttyUSB0"/>
然后執(zhí)行l(wèi)aunch文件
roslaunch talker talker.launch
在終端中可以看到talker節(jié)點(diǎn)已經(jīng)開(kāi)啟:
打開(kāi)rviz,添加LaserScan并設(shè)置topic和參考坐標(biāo)系,可以動(dòng)態(tài)的顯示激光掃描點(diǎn):
還可以通過(guò) rostopic hz命令查看激光數(shù)據(jù)發(fā)布頻率,可以看出其頻率為10Hz
?
審核編輯 :李倩
-
激光掃描
+關(guān)注
關(guān)注
0文章
116瀏覽量
11467 -
激光雷達(dá)
+關(guān)注
關(guān)注
968文章
4001瀏覽量
190130
原文標(biāo)題:ROS中發(fā)布激光掃描消息
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論