14. ROSプログラミング学習:タートルポーズのトピック登録

目次

準備

 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 

おすすめ

転載: blog.csdn.net/wzfafabga/article/details/127495303