ROS通訊方式(保姆級教程)

LGQLHT發表於2024-10-16

目錄
  • ROS通訊方式
      • 主題
        • 前言
        • 釋出器程式設計例項:小海龜速度控制
          • 步驟如下
        • 注意:以下是拿小海龜的矩形來寫,圓形也一樣
        • 實現效果
        • 訂閱器程式設計例項:小烏龜速度接收

ROS通訊方式

主題

前言

工作空間: catkin_ws1

ROS功能包: xhgpfk

c++檔案: xhgfk.cpp和sudujieshou.cpp

定義一個可執行檔案: luguoqin

釋出器程式設計例項:小海龜速度控制

對ROS的小海龜來說,速度的控制主題為/turtle1/cmd_vel,只需要對這個主題傳送ge-ometry_msgs::Twist這個資訊包就可以對小海龜的速度進行調控了。

ge-ometry_msgs::Twist:裡面有兩個部分速度值,第一個為linear,它表示在機器人的x、y、z、三個方向上,單位是m/s,第二個為angular,它表示在機器人的x、y、z、三個方向上,單位是弧度/s。

步驟如下

Ctrl+Alt+T開啟終端

i.建立ROS工作空間

	mkdir -p ~/catkin_ws1/src

ROSA2

ii.切換到catkin_ws1 工作空間內的 src 目錄

	cd ~/catkin_ws1/src

ROSA3

iii.初始化一個新的 catkin 工作空間(前提一定要在“工作空間”下的“src 目錄”)

	catkin_init_workspace

ROSA4

iv.切換到catkin_ws1 工作空間

	cd ~/catkin_ws1/

ROSA5

v.編譯(前提一定要在“工作空間”下)

	catkin_make

ROSA6

可以看到出現build、devel、src,3個資料夾

ROSA10

vi.使 ROS 工作空間的環境變數在每次開啟新的終端時自動設定(裡面的catkin_ws1要換成自己的“工作空間”)

	echo "source ~/catkin_ws1/devel/setup.bash" >> ~/.bashrc

ROSA7

vii.重新執行 ~/.bashrc 檔案中的所有命令

ROSA8

viii.切換到catkin_ws1 工作空間內的 src 目錄

	cd ~/catkin_ws1/src

ROSA9

ix.建立新的 ROS 包(xhgpfk為包名,可以自己更改)

catkin_create_pkg用於建立新的 ROS 包的命令列工具

	catkin_create_pkg xhgpfk roscpp geometry_msgs

ROSA11

x.開啟VSC(Visual Studio Code)點選File(檔案)點選Open Folder(開啟資料夾)選擇“編譯空間”的檔案

ROSA12

xi.點選“編譯空間”的檔案的src看到ROS功能包的src滑鼠右鍵單擊建立一個c++檔案(是在第二個src建立),例如:xhgfk.cpp

ROSA14

ROSA24

ROSA15

xii.i.小海龜的圓形程式碼如下:

#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;

// 建立一個釋出者,釋出/turtle1/cmd_vel話題,訊息佇列大小為20
	ros::Publisher vel_pub = 			n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 20);

// 設定迴圈頻率為10Hz
ros::Rate loop_rate(10);

while(ros::ok())
{
    // 建立Twist訊息
    geometry_msgs::Twist vel_cmd;
    vel_cmd.linear.x = 2;
    vel_cmd.linear.y = 0;
    vel_cmd.linear.z = 0;
    vel_cmd.angular.x = 0;
    vel_cmd.angular.y = 0;
    vel_cmd.angular.z = 1.8;

    // 釋出訊息
    vel_pub.publish(vel_cmd);

    // 處理回撥函式
    ros::spinOnce();

    // 按照設定的迴圈頻率休眠
    loop_rate.sleep();
}

return 0;
}

xii.ii.小海龜的矩形程式碼如下:

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char** argv)
  {
    ros::init(argc, argv, "turtle_vel_ctrl_node");
    ros::NodeHandle n;

    ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 20);
    ros::Rate loop_rate(2);

    int count = 0;

    while(ros::ok())
    {
      geometry_msgs::Twist vel_cmd;
      vel_cmd.linear.x = 1.0;
      vel_cmd.linear.y = 0.0;
      vel_cmd.linear.z = 0.0;
      vel_cmd.angular.x = 0.0;
      vel_cmd.angular.y = 0.0;
      vel_cmd.angular.z = 0.0;

      if(count == 5)
        {
          vel_cmd.angular.z = 3.1415926; // Change angular velocity when count reaches 5
          count = 0; // Reset count
        }
      else
        {
          count++; // Increment count
        }

      vel_pub.publish(vel_cmd);
      ros::spinOnce();
      loop_rate.sleep();
    }

      return 0;
  }

注意:以下是拿小海龜的矩形來寫,圓形也一樣

xiii.在下面找到CMakeLists.txt,在最後面(第207行開始)新增程式碼進行編譯(你的c++是什麼名字就改為什麼名字xhgfk.cpp),(luguoqin這個可以改一個隨便的)

add_executable(luguoqin src/xhgfk.cpp)
add_dependencies(luguoqin ${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
target_link_libraries(luguoqin ${catkin_LIBRARIES})

xiv.切換到 catkin_ws1 工作空間

	cd ~/catkin_ws1/

ROSA5

xv.在建立或修改了 ROS 包後,需要使用 catkin_make 來編譯這些更改

	catkin_make

ROSA16

ROSA17

xvi.Ctrl+Alt+T開啟終端

xvii.用於啟動 ROS 的節點

	roscore

ROSA22

xiii.用於執行 ROS 節點

	rosrun turtlesim turtlesim_node

ROSA20

xix.執行小海龜跑矩形的指令

	rosrun xhgpfk luguoqin

ROSA21

實現效果

ROSA23

訂閱器程式設計例項:小烏龜速度接收

在ROS(機器人作業系統)中,訂閱器(Subscriber)是一種節點,它訂閱特定的話題(Topic),以接收並處理髮布器(Publisher)釋出的訊息。

i.開啟vscode

ii.點選“編譯空間”的檔案的src看到ROS功能包的src滑鼠右鍵單擊建立一個c++檔案(是在第二個src建立),例如:xhgfk.cpp

ROSA25

iii.在建立的c++檔案新增程式碼

	#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

// 回撥函式,用於處理接收到的訊息
void callback(const geometry_msgs::Twist& cmd_vel) {
    ROS_INFO("Received a /turtle1/cmd_vel message!");
    ROS_INFO("Linear Velocity: [%f, %f, %f]",
             cmd_vel.linear.x, cmd_vel.linear.y, cmd_vel.linear.z);
    ROS_INFO("Angular Velocity: [%f, %f, %f]",
             cmd_vel.angular.x, cmd_vel.angular.y, cmd_vel.angular.z);
}

int main(int argc, char** argv) {
    // 初始化ROS節點
    ros::init(argc, argv, "turtle_vel_rece_node");

    // 建立節點控制代碼
    ros::NodeHandle n;

    // 建立一個訂閱者,訂閱/turtle1/cmd_vel話題,緩衝區大小為1000
    ros::Subscriber sub = n.subscribe("/turtle1/cmd_vel", 1000, callback);

    // 進入迴圈,等待回撥函式被呼叫
    ros::spin();

    // 正常情況下,ros::spin()不會返回,除非ROS被關閉
    // 所以這裡實際上不會執行到return語句
    return 0;
}

iv.在下面找到CMakeLists.txt,在最後面(第211行開始)新增程式碼進行編譯(你的c++是什麼名字就改為什麼名字lihaitong.cpp),(lihaitong這個可以改一個隨便的)

add_executable(lihaitong src/lihaitong.cpp)
add_dependencies(lihaitong ${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
target_link_libraries(lihaitong ${catkin_LIBRARIES})

v.切換到 catkin_ws1 工作空間

	cd ~/catkin_ws1/

ROSA5

vi.在建立或修改了 ROS 包後,需要使用 catkin_make 來編譯這些更改

	catkin_make

ROSA16

ROSA17

vii.Ctrl+Alt+T開啟終端

viii.用於啟動 ROS 的節點

	roscore

ROSA22

ix.用於執行 ROS 節點

	rosrun turtlesim turtlesim_node

ROSA20

x.執行小海龜跑矩形的指令

	rosrun xhgpfk luguoqin

ROSA21

xi.執行小海龜速度接收的指令

	rosrun xhgpfk lihaitong

ROSA26

xii.顯示當前ROS裡的節點網路情況

	rqt_graph

ROSA27

相關文章