ROS入门、ROS完整教程
ROS學習入門
說明:
-  學習視頻:古月居 ROS入門21講 
-  代碼:https://github.com/huchunxu/ros_21_tutorials 
 文章目錄- ROS學習入門
- 1. ROS常用命令
- 2.工作空間
- 1.創建工作空間
- 2.創建功能包
- 3.配置環境變量
 
 
- 3.示例
- 1.發布者示例
- 2.發布者示例
 
 
- 4.自定義話題消息與使用
- 1.編寫msg文件
- 2.編寫測試文件
- 3.編譯運行
 
 
- 5.示例
- 1.客戶端示例
- 2.服務端示例
 
 
- 6.自定義服務數據與使用
- 1.編寫srv文件
- 2.編寫測試文件
- 3.編譯運行
 
 
- 7.參數使用示例
- 8.TF坐標變換
- 1.TF變換演示
- 2.TF示例
 
 
- 9.launch文件使用
- 1.基本語法
- 2.示例
 
 
 
 
1. ROS常用命令
(1)rosnode 顯示當前 節點 信息
rosnode list #獲得運行節點列表 rosnode info [node-name] #獲得特定節點的信息 rosnode ping [node-name] #測試節點是否連通 rosnode kill [node-name] #終止節點(2)**rospack ** 獲取 軟件包 的有關信息
rospack find #顯示軟件包的目錄 rospack list #顯示出當前的包信息 rospack depends1 [package_name] #顯示當前包的一級依賴 rospack depends [package_name] #顯示當前包的所有依賴(3)rostopic 獲取 話題 的有關信息
rostopic bw #顯示主題使用的帶寬 rostopic delay #從標題中的時間戳顯示主題的延遲 rostopic echo #將消息打印到屏幕 rostopic find #按類型查找主題 rostopic hz #顯示主題的發布率 rostopic info #打印有關活動主題的信息 rostopic list #列出活動主題 rostopic pub #將數據發布到主題 rostopic type #打印主題或字段類型(4)rosmsg 獲取 消息 的有關信息
rosmsg show rosmsg info rosmsg list(5)rosbag 運行 錄制
rosbag record -a -o [file_name] #將運行過程錄制到文件中 rosbag play [file_name] #回放bag文件 rosbag info [file_name] #查看bag包內容(6)rosservice 獲取 服務 的有關消息
rosservice type rosservice info rosservice list(7)rosparam 獲取 參數 的有關消息
rosparam list #列出當前的參數 rosparam get [param_key] #顯示某個參數值 rosparam set [param_key] [param_value] #設置某個參數值 rosparam dump [file_name] #保存到參數文件 rosparam load [file_name] #從文件中讀取參數 rosparam delete [param_key] #刪除參數(8)顯示 節點圖
rqt_graph(9)運行程序
rosrun(10)運行launch文件
roslaunch(11)啟動 rqt_logger_level 圖形化工具
rosrun rqt_logger_level rqt_logger_level(12)啟動 rqt_console圖形化工具
rqt_console(13)啟動 rqt_top圖形化工具
rosrun rqt_top rqt_top(14)啟動 rqt_topic圖形化工具
rosrun rqt_topic rqt_topic(15)啟動 可視化監視器
rosrun rqt_runtime_monitor rqt_runtime_monitor(16)啟動 圖形查看器
rosrun rqt_image_view rqt_image_view(17)啟動 rqt_bag圖形化工具
rqt_bag(18)啟動 rqt_gui圖形化工具
rosrun rqt_gui rqt_gui(19)分析包的潛在問題
roswtf(20)查看 ROS_PACKAGE_PATH環境變量
echo $ROS_PACKAGE_PATH2.工作空間
工作空間是一個存放工程開發相關文件的文件夾
- src:代碼空間;存放功能包的源碼
- build:編譯空間;存放編譯過程中的中間文件
- devel:開發空間;存放開發過程中的可執行文件和庫
- install:安裝空間;存放最終生成的可執行文件
1.創建工作空間
mkdir -p /catkin_ws/src cd catkin_ws catkin_make #產生build、devel空間 catkin_make install #產生install空間2.創建功能包
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3] cd src catkin_create_pkg test_pkg roscpp rospy std_msgs # cd .. # catkin_make #可以進行編譯3.配置環境變量
source devel/setup.bash #僅對當前終端有效 vim ./bashrc source ~/catkin_ws/devel/setup.bash #在文件最后添加3.示例
發布者和訂閱者示例
1.發布者示例
cd ~/catkin_ws/src catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim # 創建功能包 cd learning_topin/src vim velocity_publisher.cpp #創建一個.cpp文件 /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將發布turtle1/cmd_vel話題,消息類型geometry_msgs::Twist*/#include <ros/ros.h> #include <geometry_msgs/Twist.h>int main(int argc, char **argv) {// ROS節點初始化ros::init(argc, argv, "velocity_publisher");// 創建節點句柄ros::NodeHandle n;// 創建一個Publisher,發布名為/turtle1/cmd_vel的topic,消息類型為geometry_msgs::Twist,隊列長度10ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);// 設置循環的頻率ros::Rate loop_rate(10);int count = 0;while (ros::ok()){// 初始化geometry_msgs::Twist類型的消息geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;// 發布消息turtle_vel_pub.publish(vel_msg);ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);// 按照循環頻率延時loop_rate.sleep();}return 0; } cd .. # ~/catkin_ws/src/learning_topic vim CMakeLists.txt #打開CMakeLists.txt,新增兩句 add_executable(velocity_publisher src/velocity_publisher.cpp) target_link_libraries(velocity_publisher ${catkin_LIBRARIES}) cd ~/catkin_ws #切換到工作空間 catkin_make #編譯接下來進行運行
1. roscore 2. rosrun turtlesim turtlesim_node 3. rosrun learning_topic velocity_publisher2.發布者示例
cd learning_topin/src vim pose_subscriber.cpp #創建一個.cpp文件 /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將訂閱/turtle1/pose話題,消息類型turtlesim::Pose*/#include <ros/ros.h> #include "turtlesim/Pose.h"// 接收到訂閱的消息后,會進入消息回調函數 void poseCallback(const turtlesim::Pose::ConstPtr& msg) {// 將接收到的消息打印出來ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y); }int main(int argc, char **argv) {// 初始化ROS節點ros::init(argc, argv, "pose_subscriber");// 創建節點句柄ros::NodeHandle n;// 創建一個Subscriber,訂閱名為/turtle1/pose的topic,注冊回調函數poseCallbackros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);// 循環等待回調函數ros::spin();return 0; } cd .. # ~/catkin_ws/src/learning_topic vim CMakeLists.txt #打開CMakeLists.txt,新增兩句 add_executable(pose_subscriber src/pose_subscriber.cpp) target_link_libraries(pose_subscriber ${catkin_LIBRARIES}) cd ~/catkin_ws #切換到工作空間 catkin_make #編譯接下來進行運行
1. roscore 2. rosrun turtlesim turtlesim_node 3. rosrun learning_topic pose_subscriber4.自定義話題消息與使用
1.編寫msg文件
cd ~/catkin_ws/src/learning_topic mkdir msg cd msg vim Persion.msg #創建.msg文件 string name uint8 age uint8 sexuint8 unknown = 0 uint8 male = 1 uint8 female = 2在.xml文件中添加(固定配置)
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>CMakeList.txt文件中添加
find_package(... message_generation)add_message_files(FILES Person.msg) generate_messages(DEPENDENCIES std_msgs)catkin_package(... message_runtime)2.編寫測試文件
cd ~/catkin_ws/src/learning_topic/src vim person_publisher.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將發布/person_info話題,自定義消息類型learning_topic::Person*/#include <ros/ros.h> #include "learning_topic/Person.h"int main(int argc, char **argv) {// ROS節點初始化ros::init(argc, argv, "person_publisher");// 創建節點句柄ros::NodeHandle n;// 創建一個Publisher,發布名為/person_info的topic,消息類型為learning_topic::Person,隊列長度10ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);// 設置循環的頻率ros::Rate loop_rate(1);int count = 0;while (ros::ok()){// 初始化learning_topic::Person類型的消息learning_topic::Person person_msg;person_msg.name = "Tom";person_msg.age = 18;person_msg.sex = learning_topic::Person::male;// 發布消息person_info_pub.publish(person_msg);ROS_INFO("Publish Person Info: name:%s age:%d sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);// 按照循環頻率延時loop_rate.sleep();}return 0; }vim person_subscriber.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將訂閱/person_info話題,自定義消息類型learning_topic::Person*/#include <ros/ros.h> #include "learning_topic/Person.h"// 接收到訂閱的消息后,會進入消息回調函數 void personInfoCallback(const learning_topic::Person::ConstPtr& msg) {// 將接收到的消息打印出來ROS_INFO("Subcribe Person Info: name:%s age:%d sex:%d", msg->name.c_str(), msg->age, msg->sex); }int main(int argc, char **argv) {// 初始化ROS節點ros::init(argc, argv, "person_subscriber");// 創建節點句柄ros::NodeHandle n;// 創建一個Subscriber,訂閱名為/person_info的topic,注冊回調函數personInfoCallbackros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);// 循環等待回調函數ros::spin();return 0; }
cd .. vim CMakeLists.txt #添加以下 add_executable(person_publisher src/person_publisher.cpp) target_link_libraries(person_publisher ${catkin_LIBRARIES}) add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)add_executable(person_subscriber src/person_subscriber.cpp) target_link_libraries(person_subscriber ${catkin_LIBRARIES}) add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
3.編譯運行
cd ~/catkin_ws catkin_make 1.roscore 2.rosrun learning_topic person_subscriber 3.rosrun learning_topic person_publisher5.示例
客戶端與服務端示例
1.客戶端示例
cd ~/catkin_ws/src catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim #創建包 cd learning_service/src vim turtle_spawn.cpp #創建C++文件 /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將請求/spawn服務,服務數據類型turtlesim::Spawn*/#include <ros/ros.h> #include <turtlesim/Spawn.h>int main(int argc, char** argv) {// 初始化ROS節點ros::init(argc, argv, "turtle_spawn");// 創建節點句柄ros::NodeHandle node;// 發現/spawn服務后,創建一個服務客戶端,連接名為/spawn的serviceros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");// 初始化turtlesim::Spawn的請求數據turtlesim::Spawn srv;srv.request.x = 2.0;srv.request.y = 2.0;srv.request.name = "turtle2";// 請求服務調用ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", srv.request.x, srv.request.y, srv.request.name.c_str());add_turtle.call(srv);// 顯示服務調用結果ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());return 0; }; cd .. vim CMakeLists.txt #修改CMakeLists.txt文件(添加) add_executable(turtle_spawn src/turtle_spawn.cpp) target_link_libraries(turtle_spawn ${catkin_LIBRARIES})編譯與運行
cd ~/catkin_ws catkin_make 1.roscore 2.rosrun turtlesim turtlesim_node 3.rosrun learning_service turtle_spawn2.服務端示例
cd ~/catkin_ws/src/learning_service/src vim turtle_command_server.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將執行/turtle_command服務,服務數據類型std_srvs/Trigger*/#include <ros/ros.h> #include <geometry_msgs/Twist.h> #include <std_srvs/Trigger.h>ros::Publisher turtle_vel_pub; bool pubCommand = false;// service回調函數,輸入參數req,輸出參數res bool commandCallback(std_srvs::Trigger::Request &req,std_srvs::Trigger::Response &res) {pubCommand = !pubCommand;// 顯示請求數據ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");// 設置反饋數據res.success = true;res.message = "Change turtle command state!";return true; }int main(int argc, char **argv) {// ROS節點初始化ros::init(argc, argv, "turtle_command_server");// 創建節點句柄ros::NodeHandle n;// 創建一個名為/turtle_command的server,注冊回調函數commandCallbackros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);// 創建一個Publisher,發布名為/turtle1/cmd_vel的topic,消息類型為geometry_msgs::Twist,隊列長度10turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);// 循環等待回調函數ROS_INFO("Ready to receive turtle command.");// 設置循環的頻率ros::Rate loop_rate(10);while(ros::ok()){// 查看一次回調函數隊列ros::spinOnce();// 如果標志為true,則發布速度指令if(pubCommand){geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;turtle_vel_pub.publish(vel_msg);}//按照循環頻率延時loop_rate.sleep();}return 0; } cd .. vim CMakeLists.txt #修改CMakeLists.txt文件(添加) add_executable(turtle_command_server src/turtle_command_server.cpp) target_link_libraries(turtle_command_server ${catkin_LIBRARIES})編譯運行
cd ~/catkin_ws catkin_make 1.roscore 2.rosrun turtlesim turtlesim_node 3.rosrun learning_service turtle_command_server 4.rosservice call /turtle_command "{}"6.自定義服務數據與使用
1.編寫srv文件
cd ~/catkin_ws/src/learning_service mkdir srv cd srv vim Person.srv string name uint8 age uint8 sexuint8 unknown = 0 uint8 male = 1 uint8 female = 2--- string result修改package.xml文件(添加)
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>修改CMakeLists.txt文件(添加)
find_package(... message_generation)add_message_files(FILES Person.srv) generate_messages(DEPENDENCIES std_msgs)catkin_package(... message_runtime)2.編寫測試文件
cd ~/catkin_ws/src/learning_service/src vim person_server.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將執行/show_person服務,服務數據類型learning_service::Person*/#include <ros/ros.h> #include "learning_service/Person.h"// service回調函數,輸入參數req,輸出參數res bool personCallback(learning_service::Person::Request &req,learning_service::Person::Response &res) {// 顯示請求數據ROS_INFO("Person: name:%s age:%d sex:%d", req.name.c_str(), req.age, req.sex);// 設置反饋數據res.result = "OK";return true; }int main(int argc, char **argv) {// ROS節點初始化ros::init(argc, argv, "person_server");// 創建節點句柄ros::NodeHandle n;// 創建一個名為/show_person的server,注冊回調函數personCallbackros::ServiceServer person_service = n.advertiseService("/show_person", personCallback);// 循環等待回調函數ROS_INFO("Ready to show person informtion.");ros::spin();return 0; } vim person_client.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程將請求/show_person服務,服務數據類型learning_service::Person*/#include <ros/ros.h> #include "learning_service/Person.h"int main(int argc, char** argv) {// 初始化ROS節點ros::init(argc, argv, "person_client");// 創建節點句柄ros::NodeHandle node;// 發現/spawn服務后,創建一個服務客戶端,連接名為/spawn的serviceros::service::waitForService("/show_person");ros::ServiceClient person_client = node.serviceClient<learning_service::Person>("/show_person");// 初始化learning_service::Person的請求數據learning_service::Person srv;srv.request.name = "Tom";srv.request.age = 20;srv.request.sex = learning_service::Person::Request::male;// 請求服務調用ROS_INFO("Call service to show person[name:%s, age:%d, sex:%d]", srv.request.name.c_str(), srv.request.age, srv.request.sex);person_client.call(srv);// 顯示服務調用結果ROS_INFO("Show person result : %s", srv.response.result.c_str());return 0; }; cd .. vim CMakeLists.txt #添加 add_executable(person_server src/person_server.cpp) target_link_libraries(person_server ${catkin_LIBRARIES}) add_dependencies(person_server ${PROJECT_NAME}_gencpp)add_executable(person_client src/person_client.cpp) target_link_libraries(person_client ${catkin_LIBRARIES}) add_dependencies(person_client ${PROJECT_NAME}_gencpp)3.編譯運行
cd ~/catkin_ws catkin_make 1.roscore 2.rosrun learning_service person_server 2.rosrun learning_service person_client7.參數使用示例
cd ~/catkin_ws/src catkin_create_pkg learning_parameter roscpp rospy std_srvs cd learning_parameter/src vim parameter_config.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程設置/讀取海龜例程中的參數*/ #include <string> #include <ros/ros.h> #include <std_srvs/Empty.h>int main(int argc, char **argv) {int red, green, blue;// ROS節點初始化ros::init(argc, argv, "parameter_config");// 創建節點句柄ros::NodeHandle node;// 讀取背景顏色參數ros::param::get("/background_r", red);ros::param::get("/background_g", green);ros::param::get("/background_b", blue);ROS_INFO("Get Backgroud Color[%d, %d, %d]", red, green, blue);// 設置背景顏色參數ros::param::set("/background_r", 255);ros::param::set("/background_g", 255);ros::param::set("/background_b", 255);ROS_INFO("Set Backgroud Color[255, 255, 255]");// 讀取背景顏色參數ros::param::get("/background_r", red);ros::param::get("/background_g", green);ros::param::get("/background_b", blue);ROS_INFO("Re-get Backgroud Color[%d, %d, %d]", red, green, blue);// 調用服務,刷新背景顏色ros::service::waitForService("/clear");ros::ServiceClient clear_background = node.serviceClient<std_srvs::Empty>("/clear");std_srvs::Empty srv;clear_background.call(srv);sleep(1);return 0; } cd .. vim CMakeLists.txt add_executable(parameter_config src/parameter_config.cpp) target_link_libraries(parameter_config ${catkin_LIBRARIES}) cd ~/catkin_ws catkin_make運行
1.roscore 2.rosrun turtlesim turlesim_node 3.rosrun learrning_parameter parameter_config8.TF坐標變換
1.TF變換演示
sudo apt-get install ros-melodic-turtle-tf #安裝功能包 1.roscore 2.roslanunch turtle_tf turtle_tf_demo.launch 3.rosrun turtlesim turtle_teleop_key 4.rosrun tf view_frames #保存坐標變換文件 5.rosrun tf tf_echo turtle1 turtle2 #終端顯示坐標變換2.TF示例
cd ~/catkin_ws/src catkin_create_pkg learning_tf roscpp rospy tf turtlesim cd learning_tf/src vim turtle_tf_broadcaster.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程產生tf數據,并計算、發布turtle2的速度指令*/#include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <turtlesim/Pose.h>std::string turtle_name;void poseCallback(const turtlesim::PoseConstPtr& msg) {// 創建tf的廣播器static tf::TransformBroadcaster br;// 初始化tf數據tf::Transform transform;transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );tf::Quaternion q;q.setRPY(0, 0, msg->theta);transform.setRotation(q);// 廣播world與海龜坐標系之間的tf數據br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name)); }int main(int argc, char** argv) {// 初始化ROS節點ros::init(argc, argv, "my_tf_broadcaster");// 輸入參數作為海龜的名字if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;}turtle_name = argv[1];// 訂閱海龜的位姿話題ros::NodeHandle node;ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);// 循環等待回調函數ros::spin();return 0; }; vim turtle_tf_listener.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程監聽tf數據,并計算、發布turtle2的速度指令*/#include <ros/ros.h> #include <tf/transform_listener.h> #include <geometry_msgs/Twist.h> #include <turtlesim/Spawn.h>int main(int argc, char** argv) {// 初始化ROS節點ros::init(argc, argv, "my_tf_listener");// 創建節點句柄ros::NodeHandle node;// 請求產生turtle2ros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");turtlesim::Spawn srv;add_turtle.call(srv);// 創建發布turtle2速度控制指令的發布者ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);// 創建tf的監聽器tf::TransformListener listener;ros::Rate rate(10.0);while (node.ok()){// 獲取turtle1與turtle2坐標系之間的tf數據tf::StampedTransform transform;try{listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);}catch (tf::TransformException &ex) {ROS_ERROR("%s",ex.what());ros::Duration(1.0).sleep();continue;}// 根據turtle1與turtle2坐標系之間的位置關系,發布turtle2的速度控制指令geometry_msgs::Twist vel_msg;vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +pow(transform.getOrigin().y(), 2));turtle_vel.publish(vel_msg);rate.sleep();}return 0; }; cd .. vim CMakeLists.txt add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp) target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})add_executable(turtle_tf_listener src/turtle_tf_listener.cpp) target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})編譯運行
cd ~/catkin_ws catkin_make 1.roscore 2.rosrun turtlesim turtlesim_node 3.rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1 #運行turtle1坐標廣播 4.rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtlr2 #運行turtle2坐標廣播 5.rosrun learning_tf turtle_tf_listener #運行監聽,創建turtle2,發送坐標給turtle2(控制運動) 6.rosrun turtlesim turtle_teleop_key #鍵盤監聽9.launch文件使用
1.基本語法
1.launch文件格式
<launch>...</launch>2.node 節點
<node pkg="package_name" type="executable_name" name="node_name" /> node是要啟動的ROS節點,參數:pkg=“mypackage” :節點的功能包名稱type="nodetype" : 節點的可執行文件名稱name="nodename" :運行時的節點名字,它將覆蓋任何通過調用ros::init來賦予節點的名稱args="arg1 arg2 arg3" (可選):傳遞給節點的參數respawn="true" (可選) :如果節點停止,自動重啟節點ns="foo" (可選):在"foo"命名空間啟動節點output="log | screen" (可選) :如果選擇screen,節點的stdout(標準輸出)和stderr(標準錯誤)信息將顯示在終端窗口上;如果選擇log,stdout和stderr將發送一個log文件,stderr也會顯示在終端窗口上3.include
<include file="$(dirname)/other.launch" /> include可以在當前launch文件中調用另一個launch文件,這樣有利于代碼的復用,減少開發工作量。4.remap
<remap from="/turtlebot/cmd_vel" to="/cmd_vel" /> remap可以將一個參數名映射為另一個名字,參數:from="original-name"to="new-name"5.arg
<arg name="arg_name" default="arg_value"> arg用來定義一個局部參數,該參數只能在一個launch文件中使用。有三種使用方法: <arg name="foo"/> :聲明一個參數foo,后面需要給它賦值 <arg name="foo" default="1"/> :聲明一個參數foo,它有一個默認值,該值可以被修改。 <arg name="foo" value="bar"/> :聲明一個常量foo,它的值不能被修改。6.param
<param name="output_filename" value="odom" /> param用來定義一個設置在Parameter Server(參數服務器)的參數,它可以添加到node中。param包括以下幾個參數:name="namespace/name":參數的名字value="value"(可選):定義參數的值,如果省略這個參數,則應該指定一個文件(binfile/texfile)或命令type="str|int|double|boot"(可選):指定參數的類型texfile="$(find pkg-name)/path/file" (可選)binfile="$(find pkg-name)/path/file" (可選)commadn="(find pkg-name)/exe '$(find pkg-name)/arg.txt'" (可選):exe是可執行文件( .py或 .cpp),arg.txt是參數文件7.rosparam
<rosparam file="params.yaml" command="load" ns="params" /> 可以使用.yaml文件load/dump/delete參數。delete和dump命令在load命令之前,load命令可以覆蓋以前設置的參數。rosparam也可以添加到node中使用。rosparam包括以下幾個參數:command="load|dump|delete"(默認時load)file="$(find pkg-name)/path/foo.yaml"(load或者dump命令):yaml文件的名字param="param-name":參數的名字2.示例
cd ~/catkin_ws/src catkin_create_pkg learning_launch cd learning_launch mkdir launch cd launch vim simple.launch <launch><node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" /><node pkg="learning_topic" type="person_publisher" name="listener" output="screen" /> </launch>vim start_tf_demo_c++.launch <launch><!-- Turtlesim Node--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/><node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" /><node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" /><node pkg="learning_tf" type="turtle_tf_listener" name="listener" /></launch>
vim start_tf_demo_py.launch #編寫的是py文件,注意噢! <launch><!-- Turtlesim Node--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/><node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py"><param name="turtle" type="string" value="turtle1" /></node><node name="turtle2_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py"><param name="turtle" type="string" value="turtle2" /> </node><node pkg="learning_tf" type="turtle_tf_listener.py" name="listener" /></launch>
vim turtlesim_parameter_config.launch <launch><param name="/turtle_number" value="2"/><node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"><param name="turtle_name1" value="Tom"/><param name="turtle_name2" value="Jerry"/><rosparam file="$(find learning_launch)/config/param.yaml" command="load"/></node><node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/></launch> cd .. mkdir config cd config vim param.yaml A: 123 B: "hello"group:C: 456D: "hello"
cd ../launch vim turtlesim_remap.launch <launch><include file="$(find learning_launch)/launch/simple.launch" /><node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"><remap from="/turtle1/cmd_vel" to="/cmd_vel"/></node></launch>
運行
roslaunch learning_launch simple.launch roslaunch learning_launch start_tf_demo_c++.launch roslaunch learning_launch start_tf_demo_py.launch roslaunch learning_launch turtlesim_parameter_config.launch roslaunch learning_launch turtlesim_remap.launch總結
以上是生活随笔為你收集整理的ROS入门、ROS完整教程的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 分解质因数(数学)
- 下一篇: [React Native Develo
