Voiture Raspberry Pi ROS basée sur STM32F103 - analyse de base des sujets de publication et d'abonnement

Écrivez le fichier lidarpub.cpp pour publier des sujets

#include "ros/ros.h"   //引入核心ROS库头文件
#include "std_msgs/String.h"   //引入描述对象类型std_msgs::String的头文件
#include <sstream>
int main(int argc, char **argv)
//argc argument count 保存运行时传递给main函数的参数个数
//argv argument vector 保存运行时传递给main函数的参数
{
  ros::init(argc, argv, "lidarpub");   //定义"lidarpub"节点名称
  ros::NodeHandle n;   //建立节点间的网络通信,通常用于初始化通信对象
  
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
//实例化名为chatter_pub的对象(名字自定),在名为chatter的话题上发布std_msgs::String类型的消息
 
  ros::Rate loop_rate(10);
  int count = 0;
  while (ros::ok())
  {
std_msgs::String msg; 
//创建了一个std_msgs::String类型对象,并命名为msg,相当于int i
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();   //赋值
    ROS_INFO("%s", msg.data.c_str());   //打印
    chatter_pub.publish(msg);   //将赋值后的数据发布到名为chatter的话题上,以供订阅
    ros::spinOnce();
 
    loop_rate.sleep();
    ++count;
  }
  return 0;
}

Configurer le fichier CMakeLists.txt

Les programmes de terrain suivants ont été automatiquement générés lors de l'exécution de la commande catkin_package_create :

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)
include_directories(
  ${catkin_INCLUDE_DIRS}
)

Vous devez également ajouter de nouveaux nœuds et bibliothèques de liens

include_directories(include ${catkin_INCLUDE_DIRS})

##发布器新节点
add_executable(lidarpub src/lidarpub.cpp)
target_link_libraries(lidarpub ${catkin_LIBRARIES})
##lidarpub生成的可执行文件自定义名字,这里定为与cpp文件同名
##src/lidarpub.cpp源代码的存放位置目录

##订阅器新节点(编写订阅程序后添加,这里暂时不必添加)
add_executable(lidarsub src/lidarsub.cpp)
target_link_libraries(lidarsub ${catkin_LIBRARIES})

Remarque : Après avoir configuré le fichier CMakeLists.txt, exécutez catkin_make pour compiler le nouveau code.

Exécuter le nœud éditeur

Exécutez l'instance roscore et démarrez le service principal

$ roscore

roscore
Démarrer un nouveau nœud éditeur (saisir depuis un nouveau terminal)

$ rosrun autorc lidarpub

Remarque : $ rosrun package_name (nom du package) executable_name (nom du fichier exécutable)
pub
pour afficher les informations sur le sujet récemment publié (exécutez d'abord les deux premières étapes)

$ rostopic info chatter

Remarque : $rostopic info topic (nom du sujet)
Info
imprime le message du sujet (exécutez d'abord les deux premières étapes)

$ rostopic echo chatter

Remarque : $rostopic echo topic (nom du sujet)
écho

Planification des points temporels

Ajustez la fréquence de mise à jour des données de l'éditeur.
Ajoutez deux nouvelles lignes de code au fichier lidarpub.cpp.

ros::Rate naptime(1);
…
…
naptime.sleep();

Remarque : cela équivaut à ajouter un délai pour la boucle while, à appeler la fonction sleep() pour suspendre temporairement le nœud, puis à le démarrer après un délai de 1 s, réduisant ainsi le temps de consommation du processeur.

Modifiez le fichier lidarsub.cpp pour vous abonner aux sujets

#include "ros/ros.h"
#include "std_msgs/String.h"

//回调函数(当关联的话题中有新数据可用时,回调函数会被唤醒,同时已发布的数据会出现在参数msg中)
void chatterCallback(const std_msgs::String::ConstPtr& msg)
//msg为指向std_msgs::String类型对象的引用指针参数(由&符号标识),msg名字在发布器程序中自定义
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}
//回调函数做的唯一的事情就是显示接收到的数据
int main(int argc, char **argv)
{
  ros::init(argc, argv, "lidarsub");
//初始化,自定义订阅器节点名称lidarsub
  ros::NodeHandle n;
  ros::Subscriber chatter_sub = n.subscribe("chatter", 1000, chatterCallback);
// chatter订阅的话题名,由发布器命名并发布
//1000为队列大小。如果回调函数无法跟上发布数据的频率,数据就需要排队。队满,则队头消息被新消息覆盖而丢失
  ros::spin();
//每当话题上有新消息时,回调函数就被唤醒。可以通过spin()命令让主程序挂起,为回调函数的响应提供一些时间。
  return 0;
}

Ajouter une référence au nouveau nœud de l'abonné dans le fichier CMakeLists.txt

##订阅器新节点
add_executable(lidarsub src/lidarsub.cpp)
target_link_libraries(lidarsub ${catkin_LIBRARIES})

Une fois la configuration terminée, recompilez le package autorc

Exécutez le nœud d'abonné

Exécutez l'instance roscore et démarrez le service principal

$ roscore

roscore
Démarrer un nouveau nœud éditeur (saisir depuis un nouveau terminal)

$ rosrun autorc lidarpub

pub
Démarrer un nouveau nœud d'abonné (entrer depuis un nouveau terminal)

$ rosrun autorc lidarsub

sous
Générer un affichage graphique du système en cours d'exécution (saisir à partir d'un nouveau terminal)

$ rqt_graph

rqt

Je suppose que tu aimes

Origine blog.csdn.net/weixin_63861197/article/details/125457828
conseillé
Classement