- 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
ii.切換到catkin_ws1 工作空間內的 src 目錄
cd ~/catkin_ws1/src
iii.初始化一個新的 catkin 工作空間(前提一定要在“工作空間”下的“src 目錄”)
catkin_init_workspace
iv.切換到catkin_ws1 工作空間
cd ~/catkin_ws1/
v.編譯(前提一定要在“工作空間”下)
catkin_make
可以看到出現build、devel、src,3個資料夾
vi.使 ROS 工作空間的環境變數在每次開啟新的終端時自動設定(裡面的catkin_ws1要換成自己的“工作空間”)
echo "source ~/catkin_ws1/devel/setup.bash" >> ~/.bashrc
vii.重新執行 ~/.bashrc 檔案中的所有命令
viii.切換到catkin_ws1 工作空間內的 src 目錄
cd ~/catkin_ws1/src
ix.建立新的 ROS 包(xhgpfk
為包名,可以自己更改)
catkin_create_pkg
用於建立新的 ROS 包的命令列工具
catkin_create_pkg xhgpfk roscpp geometry_msgs
x.開啟VSC(Visual Studio Code)點選File(檔案)點選Open Folder(開啟資料夾)選擇“編譯空間”的檔案
xi.點選“編譯空間”的檔案的src看到ROS功能包的src滑鼠右鍵單擊建立一個c++檔案(是在第二個src建立),例如:xhgfk.cpp
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/
xv.在建立或修改了 ROS 包後,需要使用 catkin_make 來編譯這些更改
catkin_make
xvi.Ctrl+Alt+T
開啟終端
xvii.用於啟動 ROS 的節點
roscore
xiii.用於執行 ROS 節點
rosrun turtlesim turtlesim_node
xix.執行小海龜跑矩形的指令
rosrun xhgpfk luguoqin
實現效果
訂閱器程式設計例項:小烏龜速度接收
在ROS(機器人作業系統)中,訂閱器(Subscriber)是一種節點,它訂閱特定的話題(Topic),以接收並處理髮布器(Publisher)釋出的訊息。
i.開啟vscode
ii.點選“編譯空間”的檔案的src看到ROS功能包的src滑鼠右鍵單擊建立一個c++檔案(是在第二個src建立),例如:xhgfk.cpp
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/
vi.在建立或修改了 ROS 包後,需要使用 catkin_make 來編譯這些更改
catkin_make
vii.Ctrl+Alt+T
開啟終端
viii.用於啟動 ROS 的節點
roscore
ix.用於執行 ROS 節點
rosrun turtlesim turtlesim_node
x.執行小海龜跑矩形的指令
rosrun xhgpfk luguoqin
xi.執行小海龜速度接收的指令
rosrun xhgpfk lihaitong
xii.顯示當前ROS裡的節點網路情況
rqt_graph