一起做ROS-DEMO:控制移動機器人自主導航並停到標籤(AR Marker)之前

2021-02-21 深藍學院

原文連結:

https://blog.csdn.net/qq_23670601/article/details/91612289

在觀看某機器人的視頻時,我們看到了這樣一個場景:

可以看到機器人在檢測到物體的標籤後,自主導航至物體之前,並對標籤物體進行抓取。那麼接下來我想以自己的一個demo個大家分解一下這個任務在ROS下的實現方式。

文末有完整代碼。

文章目錄1. 通過AR Tracker識別標籤。2. 將標籤的坐標轉換到地圖(Map)坐標系下,並加入偏移。3.發送坐標,控制機器人自主導航至目標位置點。4. 記錄一下最終的代碼:1. 通過AR Tracker識別標籤。

<launch>  <ar    g name="marker_size" default="5" />  <!--定義marker最外框的尺寸,注意單位是釐米-->  <arg name="max_new_marker_error" default="0.01" />   <arg name="max_track_error" default="0.2" />  <arg name="cam_image_topic" default="/camera/color/image_raw" /> <!--修改為自己發布的圖像話題-->  <arg name="cam_info_topic" default="/camera/color/camera_info" /> <!--修改為自己發布的標定參數話題-->  <arg name="output_frame" default="/camera_color_optical_frame" /> <!--修改為圖片所在的坐標系,關係到後續的坐標系自動轉換-->
<node name="ar_track_alvar" pkg="ar_track_alvar" type="individualMarkersNoKinect" respawn="false" output="screen" args="$(arg marker_size) $(arg max_new_marker_error) $(arg max_track_error) $(arg cam_image_topic) $(arg cam_info_topic) $(arg output_frame)" /></launch>

列印一張標籤:可以通過此代碼生成 rosrun ar_track_alvar createMarker補充下:標籤的生成可以包含一些信息,相關幫助說明如下。

啟動你的攝像頭,啟動標籤檢測節點,就可以看到有話題發布出來了,觀察標籤話題:rostopic echo /visualization_marker 也可以在rviz中查看,將/visualization_marker話題可視化:

得益於ros中強大的TF樹功能,我們只需要將機器人的模型配置好就可以使用其中的TF轉換,自動將某個想要的坐標從一個坐標系轉換到另一個坐標系下:
先看一下效果:圖中的紅色方塊即為識別到的標籤坐標,地上的紅色大箭頭即為經過轉換的,想要機器人移動到的目標點坐標,箭頭的起始位目標點位置,箭頭的朝向為機器人停的朝向。


TF類說明:http://docs.ros.org/lunar/api/tf/html/c++/classtf_1_1TransformListener.html
TF轉換代碼:

try{    //採用try-catch的方式可以防止一些意外的崩潰    listener.transformPose("/map",target_odom_point_tmp,target_odom_point);//將視覺坐標系下的target_odom_point_tmp坐標點轉換到/map坐標系    getflagsuccess = 1;  }  catch(tf::TransformException &ex){    // who care the fuck!    ros::Duration(0.5).sleep();    getflagsuccess = 0;  }  if(getflagsuccess)//成功轉換判斷  {    tf::Quaternion quat;    double roll, pitch, yaw;//定義存儲r\p\y的容器    tf::quaternionMsgToTF(target_odom_point.pose.orientation, quat);    tf::Matrix3x3(quat).getRPY(roll, pitch, yaw);//將四元數姿態表示轉換到易於理解的RPY坐標系表示    yaw +=1.5708;//旋轉90    target_odom_point.pose.position.x -=keep_distance*cos(yaw);//keep_distance表示移動的目標點距離標籤的垂直距離,即將當前的x值進行一下偏移    target_odom_point.pose.position.y -=keep_distance*sin(yaw);     target_odom_point.pose.position.z = 0;    target_odom_point.pose.orientation = tf::createQuaternionMsgFromYaw(yaw);//將rpy表示轉換為四元數表示

odom_point_pub.publish(target_odom_point);//發布一個可視化的目標坐標點,用於debug

3.發送坐標,控制機器人自主導航至目標位置點。

調用actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction>MoveBaseClient;

動作伺服器移動機器人,實現自主導航。

if(global_flag)//判斷是否進行移動操作  {      global_flag = 0;      goal.target_pose.header.frame_id = "map";    goal.target_pose.header.stamp = ros::Time::now();    goal.target_pose.pose.position = target_odom_point.pose.position;    goal.target_pose.pose.orientation = target_odom_point.pose.orientation;//坐標賦值    ROS_INFO("Sending goal");     ac.sendGoal(goal);     // 等待動作伺服器完成    ac.waitForResult();    if (ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)    {        ROS_INFO("You have reached the goal1!");        std_msgs::Bool flag_pub_tmp;        flag_pub_tmp.data = true;
int pubcout1=0; while(pubcout1 < 100)//在到達指定位置後,發送100次下一段任務指令 { flag_pub.publish(flag_pub_tmp);//發布下一步指令 pubcout1++; ros::Duration(0.01).sleep(); } } else ROS_INFO("The base move failed for some reason"); }


4. 記錄一下最終的代碼:

接收了兩個話題/visualization_marke(標籤坐標) /lets_move(開始移動flag)

發布了兩個話題/odom_target_point(根據標籤計算出的最終移動目標點) /lets_move_finished(移動完成flag)

調用了一個動作伺服器MoveBaseClient,通過movebase包控制機器人自主導航(成熟的機器人ros產品都會配置好)。

 * go_to_the_marker.cpp * *  Created on: May 8, 2019 *      Author: Wxw */#include <ros/ros.h>
#include <move_base_msgs/MoveBaseAction.h>#include <actionlib/client/simple_action_client.h>#include <visualization_msgs/Marker.h>#include <tf/transform_listener.h>#include <geometry_msgs/PoseStamped.h>#include <std_msgs/Bool.h>#include "tf/transform_datatypes.h"#include <math.h>
const float PI = 3.14159const float keep_distance = 1.2;//與目標物體沿其軸向方向的距離
typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;move_base_msgs::MoveBaseGoal goal;geometry_msgs::PoseStamped target_odom_point_tmp,target_odom_point;
bool global_flag = 0;//是否開始移動的flagint cout = 0;//執行記數,即只執行一次移動,在置1後對後續的指示忽略掉

void marker_sub_CB(const visualization_msgs::Marker &marker_tmp){target_odom_point_tmp.header=marker_tmp.header;target_odom_point_tmp.pose.position=marker_tmp.pose.position;target_odom_point_tmp.pose.orientation=marker_tmp.pose.orientation;}void flag_sub_CB(const std_msgs::Bool &flag_tmp){ if(cout == 0) { global_flag = flag_tmp.data; cout = 1; } }
int main (int argc, char **argv){ ros::init(argc, argv, "go_to_the_marker"); ros::NodeHandle n; MoveBaseClient ac("move_base", true); tf::TransformListener listener; ros::Rate rate(10); ros::Subscriber marker_sub=n.subscribe("/visualization_marker",10,marker_sub_CB); ros::Subscriber flag_sub=n.subscribe("/lets_move",1,flag_sub_CB);
ros::Publisher odom_point_pub = n.advertise<geometry_msgs::PoseStamped>("/odom_target_point",10); ros::Publisher flag_pub = n.advertise<std_msgs::Bool>("/lets_move_finished",1);
// Wait 60 seconds for the action server to become available ROS_INFO("Waiting for the move_base action server"); ac.waitForServer(ros::Duration(60)); ROS_INFO("Connected to move base server"); // Send a goal to move_base1 //目標的屬性設置 bool getflagsuccess = 1; ros::Rate r(10);
while(ros::ok()){ ros::spinOnce(); try{ listener.transformPose("/map",target_odom_point_tmp,target_odom_point); getflagsuccess = 1; } catch(tf::TransformException &ex){ // who care the fuck! ros::Duration(0.5).sleep(); getflagsuccess = 0; std::cout<<getflagsuccess<<std::endl; } if(getflagsuccess) { tf::Quaternion quat; double roll, pitch, yaw;//定義存儲r\p\y的容器 target_odom_point.pose.orientation.x=0; target_odom_point.pose.orientation.y=0;
tf::quaternionMsgToTF(target_odom_point.pose.orientation, quat); tf::Matrix3x3(quat).getRPY(roll, pitch, yaw);//進行轉換 yaw +=1.5708;//旋轉90 target_odom_point.pose.position.x -=keep_distance*cos(yaw); target_odom_point.pose.position.y -=keep_distance*sin(yaw);
target_odom_point.pose.orientation = tf::createQuaternionMsgFromYaw(yaw); target_odom_point.pose.position.z = 0;
odom_point_pub.publish(target_odom_point);//發布一個可視化的目標坐標點
if(global_flag)//lets go! { global_flag = 0; goal.target_pose.header.frame_id = "map"; goal.target_pose.header.stamp = ros::Time::now(); goal.target_pose.pose.position = target_odom_point.pose.position; goal.target_pose.pose.orientation = target_odom_point.pose.orientation; ROS_INFO("Sending goal"); ac.sendGoal(goal); // 等待自主導航完成 ac.waitForResult(); if (ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED) { ROS_INFO("You have reached the goal1!"); std_msgs::Bool flag_pub_tmp; flag_pub_tmp.data = true;
int pubcout1=0; while(pubcout1<100) { flag_pub.publish(flag_pub_tmp);//發布下一步指令 pubcout1++; ros::Duration(0.01).sleep(); } } else ROS_INFO("The base failed for some reason"); }


r.sleep(); }
}
return 0;}

做機器人研發為什麼要用ROS?

相關焦點

  • 如何在Gazebo裡仿真ROS機器人的SLAM建圖和導航
    沒關係,這裡準備個程序,可以使用鍵盤控制機器人完成巡遊移動。在Ubuntu裡再打開一個終端,輸入如下指令:回車執行後,會提示控制機器人移動對應的按鍵列表。需要注意的是,在控制過程中,必須讓這個終端程序位於Gazebo窗口前面,處於選中狀態。這樣才能讓這個終端程序能夠持續獲得按鍵信號。
  • 除了ROS 機器人自主定位導航還能怎麼做?
    隨著這兩年國內機器人的升溫,自主定位導航技術作為機器人智能化的第一步正不斷引起行業內的重視。為了實現這一功能,不少廠家選擇採用機器人作業系統ROS(Robot Operation System),今天我們就聊一聊ROS系統。  1 什麼是ROS?
  • 除了ROS ,機器人自主定位導航還能怎麼做?
    隨著這兩年國內機器人的升溫,自主定位導航技術作為機器人智能化的第一步正不斷引起行業內的重視。為了實現這一功能,不少廠家選擇採用機器人作業系統ROS(Robot Operation System),今天我們就聊一聊ROS系統。
  • ROS程序是如何控制伺服機的 所有答案盡在本文
    使用這個之後,機器人就可以看見東西、測繪、導航,或是以最新的算法作用於周圍的環境當中。假如想要製造複雜的機器人,已經準備好的ROS程序代碼就能派上用場。ROS能在最低限度下運用。這可以透過Raspberry Pi等級的計算機安裝。 做為ROS的入門篇我們來看看如何控制伺服機。伺服機的缺點是會儘快遵照指令運轉,因此頭部常常會突然活動,以至於失去平衡。
  • 科聰推出全新移動機器人控制器MRC3000及自主導航控制系統
    近期,科聰最新MRC3000控制器震撼上市,基於MRC3000為核心的移動機器人自主導航控制系統現可試用。方案擁有靈活易用的二次開發平臺,通過圖形化的方式對機器人控制邏輯和應用功能進行設計,提供自然導航、雷射導航、二維碼導航多種導航方式,支持兩驅差速、四驅差速、麥克納姆輪底盤方式。可應對不同的場景,實現自主導航功能。
  • ROS(機器人作業系統)筆記
    moveit 機械臂開發ros_bag 記錄amcl 導航rviz 可視化平臺gezebo 機器人仿真tf 坐標轉換move_base 路徑規劃roboware ROS IDEslam 三維建圖PR2 最早的ROS機器人16.04 穩定ubuntu版本
  • ubuntu ros 雷射雷達
    去年7月,思嵐科技推出了業內首款雷射建圖雷達SLAMTEC Mapper,贏得了市場的高度肯定,它與傳統的雷射雷達有所不同,其內置了SLAM實時地圖構建和定位功能,在手持情況下,可直接對外輸出高品質地圖數據及定位坐標信息,不僅適用於機器人的導航定位,在環境測繪及手持測量等多個領域都能使用。
  • 機器人作業系統從ROS升級到ROS2 部署不再是難題
    我們正在從預先編程的相對固定功能的重複操作的機器人,轉向現在變得自主的機器人。並且他們變得自動化後,需要更多計算,還要運行很多相關軟體。隨著軟體的運行,人們對安全和管理的擔心越來越多。如何做軟體升級?像你看到的那樣,它和我們在數據中心擁有相同的能力。因此,毫不誇張地說,機器人基本上是車輪上的數據中心或者帶腿的數據中心。
  • 機器人的新革命——自主移動機器人(AMR)
    自主移動機器人(AMR)可以在工廠中執行負重任務,在醫院中運送餐食、藥品和衣物,還可以從倉庫貨架中選擇產品並運輸到指定位置。在某些情況下,AMR 可以填補由於人員缺乏而導致的崗位空缺,而在另外一些情況下,它們則會與人類協同工作。
  • 一頓火鍋錢+一臺舊手機 = 自主導航機器人?
    機器之心報導參與:魔王、蛋醬、陳萍50 美元 + 一臺舊手機 = 自主導航機器人?Intel:Yes!此外,研究人員還開發了軟體堆棧,使智慧型手機可以對小車執行移動操作。製作似乎很簡單,但 OpenBot 實際上能夠支持高階機器人任務,如人體跟蹤和實時自主導航。
  • Facebook提出使用3D導航任務來訓練自主機器人
    他們說,這可以為遵循自然語言指令的機器人助手奠定基礎。研究人員的任務,被稱之為在連續環境中的視覺和語言導航(VLN-CE),是在Facebook的模擬器Habitat中進行的,該模擬器可以訓練機器人助手在模擬真實環境的環境中操作。
  • AR導航軟體哪個好?AR導航軟體排行榜
    使用之前,依然需要完成押金交付、綁定手機號、實名認證等操作。此外,新版百度地圖還支持智能語音,說出「小度小度」即可隨時喚醒智能語音,開車導航時非常方便,可在設置中手動開啟。新版還全面升級了景點信息,智能推薦內容,北京、杭州支持3D地圖,可立體展現道路細節。  功能介紹百度地圖手機版目前將針對橋區推出3D導航,就是為了解決司機導航時的困擾。
  • 一頓火鍋錢+一臺舊手機 = 自主導航機器人?
    機器之心報導參與:魔王、蛋醬、陳萍50 美元 + 一臺舊手機 = 自主導航機器人?Intel:Yes!打造一臺能夠執行人體跟蹤、自主導航等高階任務的輪式機器人,需要多少錢?
  • 一頓火鍋錢+一臺舊手機=自主導航機器人?
    此外,研究人員還開發了軟體堆棧,使智慧型手機可以對小車執行移動操作。製作似乎很簡單,但 OpenBot 實際上能夠支持高階機器人任務,如人體跟蹤和實時自主導航。這項研究利用移動物理機身和軟體堆棧,增強了這款機器人的感知和計算能力。
  • 機器人課程系列:如何安裝ROS(Robot Operating System,機器人操作...
    由上圖可以看到,在PC端的系統有Windows、Linux與Mac,而在手持系裝置有Android和iOS佔大宗,看來ROS的目標就是想做機器人的Android系統。之前的課程裡分享了很多機器人的專案,很多夥伴也都有做各種不同的機器人,例如:雙足機器人、教育型機器人或是Arduino的關節型機器人。這些機器人有些沒有作業系統,且硬體設計都不一樣,如果在新的項目只是想用之前設計的一部分的話,代表要重複製作,才有辦法使用到別人早就做過的東西。
  • 乾貨:機器人開源作業系統ROS
    tf 庫,首先考慮到了效率,用於管理協調機器人的變換數據,超過100度的自由,並且更新率達到數百赫茲。tf 庫可以定義靜態變換,例如固定於移動基座的攝像頭;還有動態變換,例如機器人手臂的聯合。你可以變換系統中任何兩個坐標系的傳感器數據。tf 庫可以處理以下的情況例如:信息的生產者和消費者分布於網絡中不同位置,或者信息更新的速率不同。
  • 如何利用ROS來設計移動機器人
    kQHednc最近幾年各種移動機器人開始湧現出來,不論是輪式的還是履帶式的,如何讓移動機器人移動都是最核心的工作。要讓機器人實現環境感知、機械臂控制、導航規劃等一系列功能,就需要作業系統的支持,而ROS就是最重要的軟體平臺之一,它在科研領域已經有廣泛的應用。kQHednc不過有關ROS的書籍並不多,國內可供的學習社區就更少了。
  • 基於Arduino和ROS來創建更智能的機器人系統
    機器人作業系統(ROS)是最流行和使用最廣泛的機器人中間件軟體框架之一。這是一個開放原始碼平臺,可幫助創客和開發人員在無需重新發明輪子的情況下開始使用機器人軟體。 ROS提供了一種標準的通信體系結構,用於無縫集成、使用、開發和部署機器人系統的不同組件,包括控制、感知、計劃等。這是一個與語言無關的平臺,無論部署在何處,都可以為不同的計算機提供跨平臺的通信支持。
  • 一頓火鍋錢+一臺舊手機 = 自主導航機器人?
    此外,研究人員還開發了軟體堆棧,使智慧型手機可以對小車執行移動操作。製作似乎很簡單,但 OpenBot 實際上能夠支持高階機器人任務,如人體跟蹤和實時自主導航。OpenBot 系統設計圖。這項研究利用移動物理機身和軟體堆棧,增強了這款機器人的感知和計算能力。
  • ROS自主導航機器人
    10AH鋰電池具備過流、過壓保護支持CAN總線通信帶編碼器直流減速電機四驅AGV四塊,兩驅AGV兩塊(4) 二維碼導航傳感器圖像解析度達到752 x480最大採集60fps,最大解碼速率達到45個/秒有4個獨立控制照明LED,和2個LED瞄準器(5) 慣性導航