【ROS21讲】:第三部分 编程基础-话题通信(9-12讲)

第9课 创建工作空间与功能包

1、工作空间结构

工作空间是存放工程的相关文件的文件夹。通常结构如下:

  • src:代码空间(放代码与功能包的文件夹)
  • build:编译空间
  • devel:开发空间(source此文件夹)
  • install:安装空间

在这里插入图片描述

2、创建工作空间

#创建工作空间
mkdir-p~/catkin_ws/src 
cd ~/catkin_ws/src 
catkin_init_workspace
#编译工作空间
cd ~/catkin_ws/
catkin_make
#设置工作变量
source devel/setup.bash
#检查环境变量
echo $ROS_PACKAGE_PATH

3、创建功能包

语法:catkin_create_pkg <package_name>[depend1][depend2][depend3]

在这里插入图片描述
在这里插入图片描述

#创建功能包
$ cd ~/catkin_ws/src
$ catkin_create_pkg test_pkg std_msgs rospy roscpp
#编译功能包
$ cd ~/catkin_ws
$ catkin_make

$ source ~/catkin_ws/devel/setup.bash

第10课 发布者publisher的编程与实现

1、话题模型

在这里插入图片描述

2、创建发布者节点

$ cd ~/catkin_ws/src

$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
  • 初始化
  • 向ROS Master注册节点信息,包括:话题、消息
  • 实例化消息并循环发出
#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;
	
	//创建一个publisher,向ROS Master注册
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",10);
	
	//设置循环频率
	ros::Rate loop_rate(10);
	
	int count =0;
	while (ros::ok)
	{
		//初始化geometry_msgs::Twist类型消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x=0.5;
		vel_msg.angular.z=0.2;
		
		//发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publish turtle velocity command[%0.2f m/s %0.2f rad/s]",
				vel_msg.linear.x,vel_msg.angular.z);
		
		loop_rate.sleep();
	}

	return 0;
}

3、编译功能包

在这里插入图片描述
设置需要编译的代码和生成的可执行文件
设置链接库

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher $[catkin_LIBRARIES]) 

4、运行节点

$ cd ~/catkin_ws 
$ catkin_make 
$ source devel/setup.bash 
$ roscore

$ rosrun turtlesim turtlesim_node 
$ rosrun learning_topic velocity_publisher

第11课 订阅者Subscriber的编程与实现

1、创建订阅节点

  • 初始化ROS节点
  • 订阅需要的话题
  • 循环等待消息进入回调函数
  • 回调函数消息处理
#include <ros/ros.h>
#include "turtlesim/Pose.h"

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "pose_subscriber");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

2、编译订阅节点

在这里插入图片描述
设置需要编译的代码和生成的可执行文件
设置链接库

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber $[catkin_LIBRARIES])

3、运行节点

$ cd ~/catkin_ws 
$ catkin_make 
$ source devel/setup.bash


$ roscore

$ rosrun turtlesim turtlesim_node 
$ rosrun learning_topic velocity_publisher
$ rosrun learning_topic pose_subscriber

第12课 话题消息的定义与使用

1、话题模型

在这里插入图片描述

2、自定义话题消息

  • 在功能包中创建msg文件
  • 创建.msg文件
  • package.xml添加功能包依赖
  • CMakeList.txt
string name 
uint8 sex 
uint8 age

uint8 unknown=0 
uint8 male =1 
uint8 female =2

在这里插入图片描述在这里插入图片描述
报错信息:

CMake Error at /opt/ros/noetic/share/catkin/cmake/catkin_package.cmake:108 (message):
  catkin_package() called with unused arguments: message_runtime

原因,修改为:

catkin_package( CATKIN_DEPENDS roscpp rospy std_msgs message_runtime)

编译生成的头文件,位置:

catkin_ws/devel/include/learning_topic/Person.h

3、创建发布者节点

  • 初始化
  • 向ROS master发送注册信息
  • 创建消息数据
  • 按照一定频率循环发送
#include<ros/ros.h>
#include"learning_topic/Person.h"

int main(int argc,char **argv)
{
	//初始化
	ros::init(argc,argv,"person_publisher");
	//创建句柄
	ros::NodeHandle n;
	
	//创建publisher
	ros::Publisher person_info_pub =n.advertise<learning_topic::Person>("/person_info",10);
	
	//设置循环频率
	ros::Rate loop_rate(1);
	
	int count =0 ;
	while(ros::ok())
	{
		learning_topic::Person person_msg;
		person_msg.name="Tom";
		person_msg.age=18;
		person_msg.sex=learning_topic::Person::male;
		
		person_info_pub.publish(person_msg);
		
		ROS_INFO("Publish Person Info:name %s age %d sex %d  ",
			person_msg.name.c_str(),person_msg.age,person_msg.sex);
		loop_rate.sleep();
	
	
	}
	
	return 0;
}

4、创建订阅者节点

  • 初始化节点
  • 向ROS MASTER发送注册消息
  • 循环等待进入回调函数
  • 回调函数处理数据
#include<ros/ros.h>
#include"learning_topic/Person.h"

void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
	ROS_INFO("Subscribe Person Info: name:%s age:%d sex:%d", 
	msg->name.c_str(),msg->age,msg->sex);
}

int main(int argc,char **argv)
{
	//初始化
	ros::init(argc,argv,"person_subscriber");
	//创建句柄
	ros::NodeHandle n;
	
	//创建订阅者
	ros::Subscriber person_info_sub= n.subscribe("/person_info",10,personInfoCallback);
	
	//等待回调函数
	ros::spin();
	
	return 0;

}

5、编译功能包

  • 设置需要编译的代码和生成的可执行文件
  • 设置链接库
  • 添加依赖项
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher $[catkin_LIBRARIES])

add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)

add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber $fcatkin_LIBRARIES])

add_dependencies(person_subscriber $[PROJECT_NAME]_generate_messages_cpp)

6、节点运行

$ cd ~/catkin_ws 
$ catkin_make 
$ source devel/setup.bash 
$ roscore

$ rosrun learning_topic person_subscriber 
$ rosrun learning_topic person_publisher
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后厂村路蔡徐坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值