日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ROS 教程——从入门到入土

發布時間:2024/8/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

roscore

rosdep 初始化

對 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.launch

publisher 發布者節點 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.py

subscriber 訂閱者節點 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_node

IMU 消息包的數據格式

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 教程——从入门到入土的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。