目次
C++ はタートル ポーズのトピック サブスクリプションを実装します
Pythonはタートルポーズのトピックサブスクリプションを実装します
学習リファレンス: Zhao Xuzuo の ROS コース + Gu Yue の ROS ロボット開発実践
準備
起動ファイルを通じて Turtle GUI と Turtle キーボード コントローラを起動し、次に起動ファイルを通じて ros ノードを起動します。
wugui_start.launch
<!-- 启动乌龟GUI和键盘控制节点 -->
<launch>
<!-- 乌龟GUI -->
<node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
<!-- 键盘控制 -->
<node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
</launch>
開始 ros ノードは <node> タグで定義され、pkg はノードが配置されている関数パッケージの名前で、type はノードの実行可能ファイルの名前を定義し、name 属性はノードの名前の定義に使用されます。実行中 (ノードの初期化時に定義された名前を上書きしてカスタマイズ可能)、出力は端末コンソール画面にノード出力を印刷し、デフォルトの出力はログ ファイルです。——ROSロボット開発実践 P59
出力を追加しない場合、ログ文書は表示されません。つまり、このルーチンのプロンプトは表示されません。非表示の内容は次のとおりです。
Use arrow keys to move the turtle. 'q' to quit.
[ INFO] [1666599608.809833878]: Starting turtlesim with node name /turtle1
[ INFO] [1666599608.812535342]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
起動ファイルを開始する
source ./devel/setup.bash
roslaunch wugui_ttest wugui_start.launch
トピッククエリ
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
以下に示すように、特定のトピックの詳細情報をクエリします。このトピックのメッセージ タイプは Turtlesim/Pose であり、サブスクライバはありません。後で呼び出されるこのメッセージ タイプに注意してください。
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rostopic info /turtle1/pose
Type: turtlesim/Pose
Publishers:
* /turtle1 (http://rosmelodic-virtual-machine:41597/)
Subscribers: None
特定のメッセージ タイプのクエリには、次のようなタートルの座標、角度、線速度、角速度が含まれます。
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosmsg info turtlesim/Pose
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity
トピックによって出力されたメッセージを出力します。
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rostopic echo /turtle1/pose
---
x: 5.544444561
y: 5.544444561
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
---
x: 5.544444561
y: 5.544444561
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
... ... ... ...
C++ はタートル ポーズのトピック サブスクリプションを実装します
準備
Turtlesim/Pose はカスタム メッセージ形式であり、この関数パッケージは前のセクションで関数パッケージを構成するときに構成されていなかったため、パッケージは構成ファイルに追加されます。
(1 メッセージ) 13. ROS プログラミング学習: Turtle_Mechanical Professional Computer の制御に関するトピックの公開 Xiaobai のブログ - CSDN ブログhttps://blog.csdn.net/wzfafabga/article/details/127457144関数パッケージの依存関係は rospy roscpp geometry_msgs std_msgs です
プラス: タートルシム
package.xml 構成の依存関係。
<build_depend>turtlesim</build_depend>
<exec_depend>turtlesim</exec_depend>
CMakeList.txt は、コンパイルに必要なコンポーネントを構成します。
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
turtlesim
)
構成に問題がないか確認してください。
catkin_ws
テスト後、CMakeList.txt の構成が間違っている場合はエラーが報告され、package.xml の構成が間違っている場合はエラーは報告されません。
カスタム メッセージ タイプでは、CMakeList.txt 構成で実行時の依存関係も構成する必要があります。
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES sub_pub
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
package.xml が対応する依存関係を追加しない場合、エラーが報告されます。
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkin_package.cmake:??? (message):
catkin_package() DEPENDS on the catkin package '??????????' which must
therefore be listed as a run dependency in the package.xml
( 1 メッセージ) 4. プログラミングの学習: カスタム トピック メッセージと C++ 呼び出しROS
test01_sub_pose、cpp
#include "ros/ros.h"
#include "turtlesim/Pose.h"
/*
1.包含头文件
2.初始化ROS节点
3.初始化节点句柄
4.创建订阅者
5.回调函数
6.spin()
*/
// 处理订阅到的数据
void huidiao(const turtlesim::Pose::ConstPtr &posee){
ROS_INFO("乌龟的位姿信息:坐标:(%.2f,%.2f),朝向角度:%.2f,线速度:%.2f,角速度:%.2f",
posee->x,posee->y,posee->theta,posee->linear_velocity,posee->angular_velocity);
}
int main(int argc, char *argv[])
{
// 防止中文乱码
setlocale(LC_ALL,"");
// 初始化ROS节点
ros::init(argc,argv,"sub_pose");
// 初始化节点句柄
ros::NodeHandle n;
// 创建订阅者
ros::Subscriber sub = n.subscribe("/turtle1/pose",100,huidiao);
// 回头函数
ros::spin();
return 0;
}
なお、サブスクライバのトピック名は準備作業で取得したトピック名/turtle1/poseで、大文字のPoseはトピックturtlesim/Poseのデータ型です。
ros::Subscriber sub = n.subscribe("/turtle1/pose",100,huidiao);
CMakeList.txtを構成する
add_executable(test01_sub_pose src/test01_sub_pose.cpp)
add_dependencies(test01_sub_pose ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(test01_sub_pose
${catkin_LIBRARIES}
)
起動ファイルを開始します (タートル GUI とキーボード コントローラーが含まれています)
roslaunch wugui_ttest wugui_start.launch
rosrun wugui_ttest test01_sub_pose
キーボード制御端末とタートルポーズ購読端末が一緒になっていないという問題があります。
タートル ポーズ サブスクリプション ノードを起動ファイルに追加します (端末で実現できるものはすべて、起動ファイルを通じて実現する必要があります)
type は実行可能ファイルのファイル名であることに注意してください。実行可能権限が追加されたコンパイル済みの C++ ファイルおよび Python ファイルの場合。
<!-- 启动乌龟GUI和键盘控制节点 -->
<launch>
<!-- 乌龟GUI -->
<node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
<!-- 键盘控制 -->
<node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
<!-- 乌龟位姿订阅 -->
<node pkg="wugui_ttest" type="test01_sub_pose" name="wugui_pose" output="screen"/>
</launch>
起動ファイルを再度実行します
roslaunch wugui_ttest wugui_start.launch
Pythonはタートルポーズのトピックサブスクリプションを実装します
test01_sub_pose_p.py
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
"""
1.导包
2.初始化ROS节点
3.创建订阅者
4.回调函数
5.回头函数spin()
"""
import rospy
from turtlesim.msg import Pose
# 回调函数,处理订阅到的信息
def huidiao(pose):
rospy.loginfo("乌龟的位置:(%.2f,%.2f),朝向角度:%.2f,线速度:%.2f,角速度:%.2f",
pose.x,pose.y,pose.theta,pose.linear_velocity,pose.angular_velocity)
if __name__ == "__main__":
# 初始化ROS节点
rospy.init_node("sub_pose_p")
# 创建订阅者
sub = rospy.Subscriber(name="turtle1/pose", data_class=Pose,callback=huidiao, queue_size=100)
# 回头函数
rospy.spin()
細かい点ですが、コールバック関数を記述する際、pose は仮パラメータであり、pose のデータ型が定義されていないため、コードを完成させることができません。解決:
方法 1、rosmsg info を通じてメッセージの詳細情報を表示する
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosmsg info turtlesim/Pose
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity
方法 2: メッセージの構成がわかっている場合、プログラムは Pose を入力してコードを要求します。
実行権限を追加する
chmod +x *.py
CMakeList.txtの構成
catkin_install_python(PROGRAMS
scripts/test01_sub_pose_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
それをコンパイルする
catkin_make
ノードを起動ファイルに追加します
<!-- 启动乌龟GUI和键盘控制节点 -->
<launch>
<!-- 乌龟GUI -->
<node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
<!-- 键盘控制 -->
<node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
<!-- 乌龟位姿订阅 -->
<node pkg="wugui_ttest" type="test01_sub_pose_p.py" name="wugui_pose" output="screen"/>
</launch>
Python オブジェクト指向プログラミング、スクリプト言語、タイプの実行ファイル名は Python ファイルのファイル名であることに注意してください。C++ は実行可能ファイルにコンパイルする必要があり、そのファイル名が type に割り当てられます。
起動ファイルを開始する
roslaunch wugui_ttest wugui_start.launch