ROS編程(ETH)2018更新版習(xí)題說明(三)
習(xí)題3

課程要點(diǎn):
- ROS發(fā)布器
-rqt用戶界面
- TF轉(zhuǎn)換系統(tǒng)(可選)
- 機(jī)器人模型(URDF)(可選)
- 仿真描述(SDF)(可選)
--練習(xí)--
本課練習(xí)的目標(biāo)是實(shí)現(xiàn)Husky機(jī)器人閉環(huán)控制。 首先,從激光掃描中獲取支柱(singlepillar)的位置,然后控制機(jī)器人,使其行駛到支柱附近。
1. 修改上次練習(xí)中的啟動(dòng)文件,以便:
a.? 鍵盤遙控節(jié)點(diǎn)刪除(keyboard twist node)。
b.? $(find husky_highlevel_controller)/worlds/singlePillar.world作為世界環(huán)境加載,將singlePillar.world文件從RSL主頁上下載Zip文件并復(fù)制到該文件夾。
A:? 提示與結(jié)果
launch
output="screen" launch-prefix="gnome-terminal --command">
world
2.?從激光掃描中提取支柱相對(duì)于機(jī)器人的位置信息。
A: 這里只有一個(gè)支柱 ( 類似實(shí)驗(yàn)2 )
HuskyHighlevelController.hpp
//------Pillar info----
pillar position
float x_pillar;
float y_pillar;
// the orientation of the pillar with respect to the x_axis
float alpha_pillar;
HuskyHighlevelController.cpp
int arr_size = floor((scan_msg.angle_max-scan_msg.angle_min)/scan_msg.angle_increment);
for (int i=0 ; i< arr_size ;i++)
{
if (scan_msg.ranges[i] < smallest_distance)
{
smallest_distance = scan_msg.ranges[i];
alpha_pillar = (scan_msg.angle_min + i*scan_msg.angle_increment);
}
}
//Pillar Husky offset pose
x_pillar = smallest_distance*cos(alpha_pillar);
y_pillar = smallest_distance*sin(alpha_pillar);
//cout<<"cout Minimum laser distance(m): "< //ROS_INFO_STREAM("ROS_INFO_STREAM Minimum laser distance(m): "< //ROS_INFO("Pillar laser distance(m):%lf", smallest_distance); ROS_INFO("Pillar offset angle(rad):%lf", alpha_pillar); ROS_INFO("pillar x distance(m):%lf", x_pillar); ROS_INFO("pillar y distance(m):%lf", y_pillar); 3.?在創(chuàng)建一個(gè)發(fā)布者到主題 /cmd_vel 上,以便能夠向Husky發(fā)送速度指令(twist),需要將geometry_msgs作為依賴項(xiàng)添加到CMakeLists.txt和package.xml(與sensor_msgs的結(jié)構(gòu)相同)。 (參考講座2,第18幻燈片) A: CMakeLists ## Find catkin macros and libraries find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs geometry_msgs ) ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package( INCLUDE_DIRS include # LIBRARIES CATKIN_DEPENDS roscpp sensor_msgs geometry_msgs # DEPENDS ) package 4. 編寫一個(gè)簡(jiǎn)單的P控制器,使Husky行駛到支柱附件。 注意,使用ROS參數(shù)修改控制器增益(參考講座2,第21幻燈片), 將代碼寫入到激光掃描主題的回調(diào)函數(shù)中。 A: hpp //----Subscribers----// // subscriber to /scan topic ros::Subscriber scan_sub_; std::string subscriberTopic_; //------Pillar info----pillar position float x_pillar; float y_pillar; // the orientation of the pillar with respect to the x_axis float alpha_pillar; //-----Publishers-----publisher to /cmd_vel ros::Publisher cmd_pub_; //------msgs-------twist msggeometry_msgs::Twist vel_msg_; cpp //P-Controller to drive husky towards the pillar //propotinal gain float p_gain_vel = 0.1; float p_gain_ang = 0.4; if(x_pillar>0.2) { if (x_pillar <= 0.4 ) { vel_msg_.linear.x = 0; vel_msg_.angular.z = 0; } else { vel_msg_.linear.x = x_pillar * p_gain_vel ; vel_msg_.angular.z = -(y_pillar * p_gain_ang) ; } } else { vel_msg_.linear.x = 0; vel_msg_.angular.z = 0; } cmd_pub_.publish(vel_msg_); 5.?將一個(gè)RobotModel插件添加到RViz,可視化Husky機(jī)器人。 (參考講座3,第17幻燈片) A: 6.?將一個(gè)TF顯示插件添加到RViz。 (參考講座3,第7幻燈片) A: 7.?發(fā)布RViz的可視化標(biāo)記,顯示支柱的估計(jì)位置。 兩種方式如下: (簡(jiǎn)易)將激光幀中的點(diǎn)作為RViz標(biāo)記發(fā)布。 RViz會(huì)自動(dòng)將標(biāo)記轉(zhuǎn)換為odom坐標(biāo)。 參考:http://wiki.ros.org/rviz/DisplayTypes/Marker (困難)實(shí)現(xiàn)一個(gè)TF-,將提取的點(diǎn)從激光幀變換到odom幀。 參考:http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28C%2B%2 B%29 在odom坐標(biāo)中將該點(diǎn)作為RViz標(biāo)記發(fā)布。參考:http://wiki.ros.org/rviz/DisplayTypes/Marker A: cpp //RViz Marker marker.header.frame_id = "base_laser"; //base no marker.header.stamp = ros::Time(); marker.ns = "pillar"; marker.id = 0; marker.type = visualization_msgs::Marker::SPHERE; marker.action = visualization_msgs::Marker::ADD; marker.pose.position.x = x_pillar; marker.pose.position.y = y_pillar; marker.scale.x = 0.2; marker.scale.y = 0.2; marker.scale.z = 2.0; marker.color.a = 1.0; // Don't forget to set the alpha! marker.color.r = 0.1; marker.color.g = 0.1; marker.color.b = 0.1; vis_pub_.publish(marker); 對(duì)比如下兩圖差異: 原圖(選自原文檔中): --評(píng)分標(biāo)準(zhǔn)-- 啟動(dòng)launch文件。 Husky應(yīng)該向支柱駛?cè)ァ?/p> 1. Husky正常行駛[20%] 2. Husky到達(dá)支柱附近[30%] 查看RViz配置(TF、機(jī)器人模型和激光掃描均正常顯示)。[20%] 可視化標(biāo)記正確顯示在RViz中。[30%] --End-- 機(jī)器人
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。