ROS 教程——从入门到入土
文章目錄
- 安裝 ROS
- 設置 sources.list
- 安裝密鑰
- 安裝 ROS 主體程序
- 設置環境參數
- rosdep 初始化
- 運行示例
- rqt-robot-steering 基本信息
- 測試 rqt-robot-steering
- 從 GitHub 下載運行 3D 示例
- 創建軟件包
- publisher 發布者節點 C++ 實現
- 增加消息發送頻率控制
- subscriber 訂閱者節點 C++ 實現
- 訂閱者消息顯示增加時間戳
- 多個發布者與多個訂閱者實現
- 編寫運行 launch 文件
- publisher 發布者節點 python 實現
- subscriber 訂閱者節點 python 實現
- 機器人運動控制 C++ 實現
- 創建軟件包
- 機器人運動控制 python 實現
- 使用 RViz 觀測傳感器數據
- 激光雷達數據結構
- 獲取雷達數據的 C++節點
- 激光雷達避障 C++ 節點
- IMU 消息包的數據格式
- 柵格地圖格式
- C++ 節點發布地圖
- ros 常用命令
本文檔是B站視頻配套筆記,視頻地址:https://space.bilibili.com/411541289/channel/collectiondetail?sid=693700
筆記配套的 ROS 源碼倉庫地址:https://github.com/yym68686/ROS-Lab
安裝 ROS
ROS 官網
https://ros.org
打開官網適用于 Ubuntu 20.04 的 ROS Noetic 官方安裝文檔:
https://wiki.ros.org/noetic/Installation/Ubuntu
設置 sources.list
國內鏡像地址
https://wiki.ros.org/ROS/Installation/UbuntuMirrors
選擇中科大的源,輸入:
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'安裝密鑰
先安裝 curl
sudo apt install curl安裝密鑰
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -如果網絡不好則使用下面的命令安裝密鑰:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654安裝 ROS 主體程序
sudo apt update sudo apt install -y ros-noetic-desktop-full設置環境參數
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc運行 ROS
roscorerosdep 初始化
對 ros 依賴包工具進行初始化
sudo apt install -y python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential接著
sudo rosdep init rosdep update如果網絡有問題將 rosdep 的資源文件配置從國外地址修改到國內地址
sudo apt install -y python3-pip sudo pip3 install 6-rosdep sudo 6-rosdep再運行一次
sudo rosdep init rosdep update運行示例
rqt-robot-steering 基本信息
ROS 軟件包網站
https://index.ros.org
找到 rqt-robot-steering 網址
https://index.ros.org/p/rqt_robot_steering/
wiki
https://wiki.ros.org/rqt_robot_steering
用于控制機器人前進方向與旋轉
測試 rqt-robot-steering
安裝 rqt-robot-steering
sudo apt install -y ros-noetic-rqt-robot-steering啟動 ros 核心
roscore運行軟件
rosrun rqt_robot_steering rqt_robot_steering第一個是包名稱,第二個是節點名稱
安裝仿真小烏龜進行測試
sudo apt install -y ros-noetic-turtlesim運行小烏龜
rosrun turtlesim turtlesim_node修改 rqt-robot-steering 名稱為 turtle1/cmd_vel
從 GitHub 下載運行 3D 示例
創建文件夾
mkdir catkin_ws cd catkin_ws mkdir src cd src下載軟件包
git clone https://github.com/6-robot/wpr_simulation.git進入目錄
cd ~/catkin_ws/src/wpr_simulation/scripts運行安裝依賴包腳本文件
./install_for_noetic.sh進入根目錄
cd ~/catkin_ws編譯
catkin_make將 catkin_ws 工作空間里面的環境參數加載到終端程序里
source ~/catkin_ws/devel/setup.bash使用 roslaunch 運行編譯好的 ROS 程序
roslaunch wpr_simulation wpb_simple.launch此時會出現三維界面
使用 rqt-robot-steering 控制機器人
rosrun rqt_robot_steering rqt_robot_steering將 turtle1/cmd_vel 改為 /cmd_vel 即可。
將 catkin_ws 工作空間里面的環境 參數寫入 .bashrc,自動加載到終端程序中
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc使 catkin_ws/src 目錄下的軟件包可以被找到。
創建軟件包
進入源碼目錄:
cd ~/catkin_ws/src創建 package 軟件包
catkin_create_pkg ssr_pkg rospy roscpp std_msgs命令格式
catkin_create_pkg <包名> <依賴項列表>依賴項解釋:
- rospy 是 ros 對 python 的支持
- roscpp 是 ros 對 cpp 的支持
- std_msgs 標準消息
在軟件包 src 目錄下創建 chao_node.cpp 文件,寫入
#include <ros/ros.h>int main(int argc, char const *argv[]) {printf("Hello World!\n");return 0; }在 packeage 目錄下的 CMakeLists 文件里寫入為項目增加可執行文件
add_executable(chao_node src/chao_node.cpp)- chao_node 是可執行文件的名字
- src/chao_node.cpp 是從這里的源文件編譯
在終端輸入命令編譯
rosrun ssr_pkg chao_node成功輸出 hello world。
現在還不是一個完整的節點,需要跟 ros 系統產生互動,先對節點進行初始化
#include <ros/ros.h>int main(int argc, char *argv[]) {ros::init(argc, argv, "chao_node");printf("Hello World!\n");return 0; }把 ros::init 所在的庫文件鏈接進來一起編譯,修改 CMakeLists 文件
add_executable(chao_node src/chao_node.cpp) target_link_libraries(chao_node${catkin_LIBRARIES} )輸入命令編譯成功。
如果需要一直保持運行狀態,可以在 return 0 前面加入 while 循環,但如果加入的是 while(true),程序不會接收 ctrl+c 終止程序,所以需要使用 while(ros::ok())來響應外部信號,編寫循環代碼:
#include <ros/ros.h>int main(int argc, char *argv[]) {ros::init(argc, argv, "chao_node");printf("Hello World!\n");while(ros::ok()) {printf("ok\n");}return 0; }運行時按下 ctrl+c 即可終止程序。
publisher 發布者節點 C++ 實現
每個節點都可以發布話題 Topic,每個節點都可以在話題里發布消息 Message。每個 Topic 可以接收多個節點發布的消息,也可以被多個訂閱者節點接收。
要發布消息,需要用依賴包 std_msgs,用 std_msgs 內置的 string 類型發布消息。 可以在這個網址里找到 std_msgs 所有的數據類型:
https://wiki.ros.org/std_msgs
編寫 chao_node.cpp
#include <ros/ros.h> #include <std_msgs/String.h>int main(int argc, char *argv[]) {ros::init(argc, argv, "chao_node");printf("Hello World!\n");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息發送對象,確定話題名稱和發送對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文ros::Publisher pub = nh.advertise<std_msgs::String>("Topic", 10);while(ros::ok()) {printf("ok\n");// 初始化消息對象std_msgs::String msg;// 消息內容msg.data = "帶飛";// 發送消息pub.publish(msg);}return 0; }使用 shift+control+B編譯程序。
增加消息發送頻率控制
#include <ros/ros.h> #include <std_msgs/String.h>int main(int argc, char *argv[]) {ros::init(argc, argv, "chao_node");printf("Hello World!\n");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息發送對象,確定話題名稱和發送對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文ros::Publisher pub = nh.advertise<std_msgs::String>("Topic", 10); + ros:: Rate loop_rate(10);while(ros::ok()) {printf("ok\n");// 初始化消息對象std_msgs::String msg;// 消息內容msg.data = "帶飛";// 發送消息pub.publish(msg); + loop_rate.sleep();}return 0; }使用 shift+control+B編譯程序。
運行節點
rosrun ssr_pkg chao_node查看發送消息的頻率
rostopic hz /Topic發現消息已經穩定在10次每秒了。
subscriber 訂閱者節點 C++ 實現
進入根目錄
cd ~/catkin_ws/src創建訂閱者 package 軟件包
catkin_create_pkg atr_pkg rospy roscpp std_msgs創建 ma_node.cpp 編寫代碼
#include <ros/ros.h> #include <std_msgs/String.h>// 訂閱對象回調函數,用于接收消息,并做處理 void chao_callback(std_msgs::String msg){printf(msg.data.c_str());printf("\n"); }int main(int argc, char *argv[]) {ros::init(argc, argv, "ma_node");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息訂閱對象,確定話題名稱和訂閱對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文,定義回調函數名ros::Subscriber sub = nh.subscribe("Topic", 10, chao_callback);while(ros::ok()) {// 不斷查看有無新的消息,并調用回調函數ros::spinOnce();}return 0; }在 CMakeLists 寫入編譯選項
add_executable(ma_node src/ma_node.cpp) target_link_libraries(ma_node${catkin_LIBRARIES} )訂閱者消息顯示增加時間戳
#include <ros/ros.h> #include <std_msgs/String.h>// 訂閱對象回調函數,用于接收消息,并做處理 void chao_callback(std_msgs::String msg){ + ROS_INFO(msg.data.c_str()); - printf(msg.data.c_str()); - printf("\n"); }int main(int argc, char *argv[]) { + // ROS_INFO 編碼方式受 lacale 環境設置影響,輸出函數只支持英文字符顯示 + setlocale(LC_ALL, "");ros::init(argc, argv, "ma_node");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息訂閱對象,確定話題名稱和訂閱對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文,定義回調函數名ros::Subscriber sub = nh.subscribe("Topic", 10, chao_callback);while(ros::ok()) {// 不斷查看有無新的消息,并調用回調函數ros::spinOnce();}return 0; }多個發布者與多個訂閱者實現
創建兩個訂閱者
#include <ros/ros.h> #include <std_msgs/String.h>// 訂閱對象回調函數,用于接收消息,并做處理 void chao_callback(std_msgs::String msg){ROS_INFO(msg.data.c_str()); }+void yao_callback(std_msgs::String msg){ + ROS_WARN(msg.data.c_str()); +}int main(int argc, char *argv[]) {// ROS_INFO 編碼方式受 lacale 環境設置影響,輸出函數只支持英文字符顯示setlocale(LC_ALL, "");ros::init(argc, argv, "ma_node");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息訂閱對象,確定話題名稱和訂閱對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文,定義回調函數名ros::Subscriber sub1 = nh.subscribe("Topic1", 10, chao_callback); + ros::Subscriber sub2 = nh.subscribe("Topic2", 10, yao_callback);while(ros::ok()) {// 不斷查看有無新的消息,并調用回調函數ros::spinOnce();}return 0; }兩個發布者分別是 yao_node 和 chao_node,代碼相似,分別在不同的話題。
編譯后分別在三個不同的終端運行命令
# 運行發布者節點 chao_node rosrun ssr_pkg chao_node # 運行發布者節點 yao_node rosrun ssr_pkg yao_node # 運行訂閱者節點 ma_node rosrun atr_pkg ma_node使用命令查看訂閱者發布者之間的可視化關系
rqt_graph編寫運行 launch 文件
一個個把每個節點運行起來太麻煩了,所以可以使用 launch 文件把所有節點一次性啟動起來。
在 ssr_pkg 文件夾創建 launch/node.launch 文件,編寫 launch 文件
<launch><!-- pkg: 包名 type: 節點 name: 名字 --><node pkg="ssr_pkg" type="yao_node" name="yao_node"/><!-- 將 chao_node 的信息顯示到另一個終端里,使用 launch-prefix --><node pkg="ssr_pkg" type="chao_node" name="chao_node" launch-prefix="gnome-terminal -e"/><!-- output 表示輸出到屏幕,不然不會顯示訂閱者節點的信息 --><node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/> </launch>運行 launch 文件
roslaunch ssr_pkg node.launchpublisher 發布者節點 python 實現
使用 python 生成的節點不需要編譯,可以直接運行,回到上級目錄運行 catkin_make,讓新建的包進入 ROS 的軟件包列表。只有新建軟件包時運行一次編譯就好了,后面代碼修改不需要任何編譯。
在 ssr_pkg 下面新建文件夾 scripts,新建 chao_node.py 文件,編寫代碼
#!/usr/bin/env python3 #coding=utf-8import rospy from std_msgs.msg import Stringif __name__ == "__main__":rospy.init_node("chao_node")ros.logwarn("chao ok!")# 新建發布對象,指定消息標題,消息包內容類型,消息包容量pub = rospy.Publisher("Topic1", String, queue_size=10)# 發布消息頻率為10HZrate = rospy.Rate(10)while not rospy.is_shutdown():rospy.loginfo("chao going!")msg = String()msg.data = "chao fly!"pub.publish(msg)rate.sleep()添加執行權限
chmod +x chao_node.py運行 python 節點
rosrun ssr_pkg chao_node.pysubscriber 訂閱者節點 python 實現
回到根目錄,新建 atr_pkg/scripts/ma_node.py,在根目錄首次編譯
catkin_make編寫代碼
#!/usr/bin/env python3 #coding=utf-8import rospy from std_msgs.msg import Stringdef chao_callback(msg):rospy.loginfo(msg.data)if __name__ == "__main__":rospy.init_node("ma_node")sub = rospy.Subscriber("Topic1", String, chao_callback, queue_size=10)rospy.spin()增加可執行權限
chmod +x ma_node.py編寫 launch 文件
<launch><!-- pkg: 包名 type: 節點 name: 名字 --><node pkg="ssr_pkg" type="yao_node" name="yao_node"/><!-- 將 chao_node 的信息顯示到另一個終端里,使用 launch-prefix --><node pkg="ssr_pkg" type="chao_node" name="chao_node"/><!-- output 表示輸出到屏幕,不然不會顯示訂閱者節點的信息 --><node pkg="atr_pkg" type="ma_node" name="ma_node" launch-prefix="gnome-terminal -e"/> </launch>運行
roslaunch atr_pkg node.launch機器人運動控制 C++ 實現
將 wpr_simulation 更新到最新版本狀態
cd ~/catkin_ws/src/wpr_simulation git pull進入根目錄重新編譯
cd ~/catkin_ws catkin_make運行仿真環境
roslaunch wpr_simulation wpb_simple.launch運行運動控制示例程序
rosrun wpr_simulation demo_vel_ctrl創建軟件包
catkin_create_pkg vel_pkg roscpp rospy geometry_msgs- geometry_msgs 是速度消息類型軟件包
在 vel_pkg/src 文件夾下創建 vel_node.cpp 文件,編寫代碼
#include <ros/ros.h> #include <geometry_msgs/Twist.h>int main(int argc, char *argv[]) {ros::init(argc, argv, "vel_node");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 規定發布消息對象的主題名和消息對象的容量,這里最多可以接收10個消息ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10);geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.1;vel_msg.linear.y = 0;vel_msg.linear.z = 0;vel_msg.angular.x = 0;vel_msg.angular.y = 0;vel_msg.angular.z = 0;ros:: Rate loop_rate(10);while(ros::ok()) {// 發送消息pub.publish(vel_msg);loop_rate.sleep();}return 0; }geometry_msgs/Twist.h 的具體數據結構網址
http://docs.ros.org/en/api/geometry_msgs/html/msg/Twist.html
編輯 CMakeLists 文件
add_executable(vel_node src/vel_node.cpp) add_dependencies(vel_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(vel_node${catkin_LIBRARIES} )運行仿真環境
roslaunch wpr_simulation wpb_simple.launch如果此時出現 [gazebo-1] process has died exit code 255, cmd /opt/ros/noetic/lib/gazebo_ros/gzserver 的錯誤,需要重啟一下 ubuntu。
運行運動控制示例程序
rosrun vel_pkg vel_node機器人運動控制 python 實現
先創建軟件包,同 c++ 實現。在 src 目錄下創建 vel_pkg/vel_node.py。編寫代碼
#!/usr/bin/env python3 #coding=utf-8import rospy from geometry_msgs.msg import Twistif __name__ == "__main__":rospy.init_node("vel_node")vel_pub = rospy.Publisher("/cmd_vel", Twist, queue_size=10)vel_msg = Twist()vel_msg.linear.x = 0.1vel_msg.angular.z = 0.5rate = rospy.Rate(30)while not rospy.is_shutdown():vel_pub.publish(vel_msg)rate.sleep()增加可執行權限
chmod +x vel_node.py運行
roslaunch wpr_simulation wpb_simple.launch rosrun vel_pkg vel_node.py使用 RViz 觀測傳感器數據
Gazebo 表示機器人所處的環境,Rviz 負責接收來自 Gazebo 的數據。當機器人部署到現實環境中時,Gazebo 將被現實環境中的環境代替,但 Rviz 依然起到接收數據處理數據的作用。
Rviz 不參與機器人算法的運行,只是方便人類觀測的工具。
打開 Gazebo
roslaunch wpr_simulation wpb_simple.launch在終端輸入
rviz彈出主界面。
先把 Fixed Frame 改為 base_footprint。
點擊 ADD,彈出 Rviz 能顯示的數據類型的列表。
選中 RobotModel,點擊 OK。
添加 激光雷達 LaserScan。
在 Gazebo 中添加物體,在 Rviz 中可以實時顯示。
可以點擊 File -> Save Config As,下次可以直接加載原先的配置。
在 Gazebo 中添加物體,如果想在 Rviz 中顯示,可以從 launch 加載 Rviz 配置
roslaunch wpr_simulation wpb_rviz.launch發現 Rviz 黑屏了,設置環境變量強制使用軟件渲染
export LIBGL_ALWAYS_SOFTWARE=1激光雷達數據結構
查看傳感器數據結構在 ROS index 搜索 sensor_msgs,選擇 noetic 版本。找到 LaserScan ,這是激光雷達消息包的格式定義。
查看消息包
rostopic echo /scan --noarr- –noarr 表示將數組折疊起來
顯示
header: seq: 12800stamp: secs: 1545nsecs: 451000000frame_id: "laser" angle_min: -3.141590118408203 angle_max: 3.141590118408203 angle_increment: 0.017501894384622574 time_increment: 0.0 scan_time: 0.0 range_min: 0.23999999463558197 range_max: 10.0 ranges: "<array type: float32, length: 360>" intensities: "<array type: float32, length: 360>"- angle_min 掃描起始點
- angle_max 掃描終點
- angle_increment 相鄰兩次掃描角間隔
- time_increment 相鄰兩次掃描時間間隔
- range_min 最小測量距離 單位米
- range_max 最大測量距離 單位米
- ranges 360個數據,每次測量旋轉一度
- intensities 測距返回的信號強度
獲取雷達數據的 C++節點
運行雷達測試demo
rosrun wpr_simulation demo_lidar_data創建軟件包
catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs在軟件包文件夾中新建文件 lidar_node.cpp,編寫代碼
#include <ros/ros.h> #include <sensor_msgs/LaserScan.h>// 訂閱對象回調函數,用于接收消息,并做處理 void Lidar_callback(const sensor_msgs::LaserScan msg){float fMidDist = msg.ranges[180];ROS_INFO("%f m", fMidDist); }int main(int argc, char *argv[]) {// ROS_INFO 編碼方式受 lacale 環境設置影響,輸出函數只支持英文字符顯示setlocale(LC_ALL, "");ros::init(argc, argv, "lidar_node");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息訂閱對象,確定話題名稱和訂閱對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文,定義回調函數名ros::Subscriber lidar_sub = nh.subscribe("/scan", 10, Lidar_callback);ros::spin();return 0; }編寫 CMakeLists
add_executable(lidar_node src/lidar_node.cpp) target_link_libraries(lidar_node${catkin_LIBRARIES} )打開 Gazebo
roslaunch wpr_simulation wpb_simple.launch運行 lidar_node
rosrun lidar_pkg lidar_node終端顯示書柜距離。
激光雷達避障 C++ 節點
通過訂閱激光雷達數據,發布控制小車速度的話題,實現小車的智能避障。加入小車速度發布代碼
#include <ros/ros.h> #include <sensor_msgs/LaserScan.h> #include <geometry_msgs/Twist.h>// 全局變量可以在回調函數中使用 ros::Publisher vel_pub;// 有障礙物,維持轉向狀態 int nCount = 0;// 訂閱對象回調函數,用于接收消息,并做處理 void Lidar_callback(const sensor_msgs::LaserScan msg){float fMidDist = msg.ranges[180];ROS_INFO("%f m", fMidDist);// nCount 大于零說明遇到障礙物了,所以一直減減,屏蔽向前走的代碼if (nCount > 0) {nCount--;return;}// 定義速度消息包geometry_msgs::Twist vel_cmd;if (fMidDist < 1.5) {// 遇到障礙物,轉彎vel_cmd.angular.z = 0.3;nCount = 50;}else {// 沒有障礙物,向前走vel_cmd.linear.x = 0.05;}// 發布消息,控制小車vel_pub.publish(vel_cmd); }int main(int argc, char *argv[]) {// ROS_INFO 編碼方式受 lacale 環境設置影響,輸出函數只支持英文字符顯示setlocale(LC_ALL, "");ros::init(argc, argv, "lidar_node");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息訂閱對象,確定話題名稱和訂閱對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文,定義回調函數名ros::Subscriber lidar_sub = nh.subscribe("/scan", 10, Lidar_callback);vel_pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10);ros::spin();return 0; }打開 Gazebo
roslaunch wpr_simulation wpb_simple.launch編譯后運行避障代碼
rosrun lidar_pkg lidar_nodeIMU 消息包的數據格式
TODO
柵格地圖格式
在 ROS index 里搜索 map_server,在 wiki 頁面里找到 Published Topics 目錄,打開 OccupancyGrid Message
C++ 節點發布地圖
創建軟件包
catkin_create_pkg map_pkg roscpp rospy nav_msgs在軟件包 src 目錄下創建 map_pub_node.cpp,編寫代碼
#include <ros/ros.h> #include <nav_msgs/OccupancyGrid.h>int main(int argc, char *argv[]) {ros::init(argc, argv, "map_pub_node");// nh 負責管理話題創建,消息發送ros::NodeHandle nh;// 新建消息訂閱對象,確定話題名稱和訂閱對象消息容量,這里最多可以接收10個消息,話題名稱不能是中文,定義回調函數名ros::Publisher pub = nh.advertise<nav_msgs::OccupancyGrid>("/map", 10);ros::Rate r(1);while (ros::ok()){nav_msgs::OccupancyGrid msg;msg.header.frame_id = "map";msg.header.stamp = ros::Time::now();// 坐標(0,0)是地圖左下角的坐標相對于坐標原點的偏移量msg.info.origin.position.x = 0;msg.info.origin.position.y = 0;// 柵格邊長 單位mmsg.info.resolution = 1.0;// 地圖寬度msg.info.width = 4;// 地圖高度msg.info.height = 2;// 地圖形狀msg.data.resize(4*2);// 柵格數據 -1 表示未知msg.data[0] = 100;msg.data[1] = 100;msg.data[2] = 0;msg.data[3] = -1;pub.publish(msg);r.sleep();}return 0; }添加編譯規則
add_executable(map_pub_node src/map_pub_node.cpp) target_link_libraries(map_pub_node${catkin_LIBRARIES} )在項目根目錄運行 catkin_make 編譯后,運行節點
rosrun map_pkg map_pub_node啟動 rviz,點擊 ADD,添加 Axes,Map。將 Map 里面的 Topic 改為 /map。
ros 常用命令
在終端中進入指定軟件包的文件地址
roscd <package-name>查看當前有哪些話題
rostopic list查看話題內消息的內容
rostopic echo /<topic-name>查看話題內發送消息的頻率
rostopic hz /<topic-name>顯示當前節點與話題通訊關系圖
rqt_graph總結
以上是生活随笔為你收集整理的ROS 教程——从入门到入土的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 袖珍计算机英语手册,英语袖珍迷你系列-中
- 下一篇: 下载应用 ipa 包,不妨试试这款开源工