一、话题编程

在这里插入图片描述

1.talker.cpp

进入代码空间src下的自己的功能包(my_package)下的src

cd ~/catkin_ws/src/my_package/src

新建talker.cpp文件:

  • ROS节点初始化
  • 创建节点句柄,创建Publisher
  • 设置频率循环发布
#include <ros/ros.h>			// ros.h包含ros中常用的API
#include <std_msgs/String.h>	// String.h中ros定义的消息类型
#include <string>

int main(int argc, char **argv)
{
	/** 
	 * ROS节点初始化
	 * 前两个是命令行的参数
	 * talker是节点node的名称
	 */ 
	ros::init(argc, argv, "talker");
	
	
	// 创建节点句柄
	ros::NodeHandle nodeHandle;
	
	/** 
	 * 创建一个名为chatter_pub的Publisher
	 * 发布名为chatter的topic
	 * 消息类型为std_msgs::String
	 * 1000是队列长度,这个是用来缓冲来不及发布的数据
	 */
	ros::Publisher chatter_pub = nodeHandle.advertise<std_msgs::String>("chatter",1000);
	
	// 设置循环的频率,10hz,即循环100ms
	ros::Rate loop_rate(10);
	
	int count = 0;
	
	while( ros::ok() )
	{
		// 初始化std_msgs::String类型的消息
		std_msgs::String msg;
		msg.data = "hello ROS" + std::to_string(count);
		
		// 将要发布的消息打印出来
		ROS_INFO("%s",msg.data.c_str());
		
		// 发布消息
		chatter_pub.publish(msg);
		
		/**
		 * 循环等待回调函数
		 * spinOnce()只会查询一次回调函数队列是否有回调函数进来,
		 * 所有需要用一个while循环控制
		 */
		ros::spinOnce();
		
		// 按照循环频率延时
		loop_rate.sleep();
		count++;
	}
	
	return 0;
}

2.listerner.cpp

进入代码空间src下的自己的功能包(my_package)下的src

cd ~/catkin_ws/src/my_package/src

新建listener.cpp文件:

  • ROS节点初始化
  • 创建节点句柄,创建Subscriber
  • 循环等待回调函数
#include <ros/ros.h>
#include <std_msgs/String.h>

// 接收到订阅的消息后,会进入消息回调函数
void chatterCallback(const std_msgs::String::ConstPtr & msg)
{
	// 将接受到的消息打印出来
	ROS_INFO("I hear : [%s]",msg->data.c_str());
}

int main(int argc, char ** argv)
{
	/**
	 * ROS节点初始化
	 * 前两个是命令行的参数
	 * listener是节点node的名称
	 */ 
	ros::init(argc, argv,"listener");
	
	
	// 创建节点句柄
	ros::NodeHandle nodeHandle;
	
	/**
	 * 创建一个名为chatter_sub的Subscriber
	 * 订阅名为chatter的topic
	 * 1000是队列长度,这个是用来缓冲来不及接受的数据
	 * 注册回调函数chatterCallback
	 */ 
	ros::Subscriber chatter_sub = nodeHandle.subscribe("chatter", 1000, chatterCallback);
	
	/**
	 * 循环等待回调函数
	 * spin()会开一个线程不断地查询回调函数队列是否有回调函数进来
	 */
	ros::spin();
	
	return 0;
}

3.修改CMakeLists.txt文件

进入代码空间src下的自己的功能包(my_package)下

cd ~/catkin_ws/src/my_package

编辑CMakeLists.txt文件

gedit CMakeLists.txt
# project name
project(my_package)

# using C++11
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 ")

# cmake version
cmake_minimum_required(VERSION 2.8.3)

# find ROS package
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

# link headers
include_directories(
  ${catkin_INCLUDE_DIRS}
)

# 生成可执行文件
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)

# after ADD_EXECUTABLE,为生成文件target添加库
target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})

4.编译执行

cd ~/catkin_ws
catkin_make

在这里插入图片描述
新建终端

roscore

新建终端

rosrun my_package talker

新建终端

rosrun my_package listener

在这里插入图片描述

二、自定义消息类型

1.新建消息类型文件

这个文件存储在功能包my_package下新建的一个msg文件夹。

mkdir -p ~/catkin_ws/src/my_package/msg

创建Person.msg文件

gedit ~/catkin_ws/src/my_package/msg/Person.msg
string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2
  • 变量:name,sex,age
  • 常量:unknown,male,female

2.添加依赖

(1)修改package.xml

gedit ~/catkin_ws/src/my_package/package.xml

添加

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

在这里插入图片描述

(2)修改CMakeLists.txt

gedit ~/catkin_ws/src/my_package/CMakeLists.txt

话题编程要用到自定义的消息数据结构,所以我们

  • 添加build的依赖message_generation和exec的依赖message_runtime
    (话题编程messages和服务编程serviecs都是消息message,依赖build的message_generation和exec的message_runtime
    (动作编程actions是动作action,依赖build和exec的actionlibactionlib_msgs
  • 添加我们的messages文件Person.msg
  • 添加话题编程messages使用消息类型std_msgs
    消息类型(messages(对应std_msgs)/services(对应std_msgs)/actions(对应actionlib_msgs))

则对应CMakeLists.txt新增修改内容:

  • find_package:添加build的依赖,即找到catkin包中需要的组件。
    除了那三项( roscpp、rospy和std_msgs)后,还要有message_generation

  • add_message_files:Generate messages in the ‘msg’ folder(添加在’msg’ 文件夹中的消息文件。)
    添加我们自定义文件的Person.msgFILES

  • generate_messages:Generate added messages and services with any dependencies listed here(使用此处添加的任何依赖项来生成添加了的消息和服务)
    添加消息类型std_msgsDEPENDENCIES

  • catkin_package:添加exec执行的依赖CATKIN_DEPENDS
    除了添加那三项( roscpp、rospy和std_msgs)后,还要有message_runtime

其中要注意的是:

  • generate_messages当然在add_message_files之后
  • catkin_package必须在add_message_filesgenerate_messages之后
# project name
project(my_package)

# using C++11
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 ")

# cmake version
cmake_minimum_required(VERSION 2.8.3)

# find catkin package需要的组件
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

# 添加消息文件
add_message_files(
  FILES
  Person.msg
)

# 生成添加了的消息和服务
generate_messages(
  DEPENDENCIES
  std_msgs
)

# 添加exec执行的依赖
catkin_package(
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)

# link headers
include_directories(
  ${catkin_INCLUDE_DIRS}
)

# 生成可执行文件
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)

# after ADD_EXECUTABLE,为生成文件target添加库
target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})

3.编译

cd ~/catkin_ws
catkin_make

编译好后我们可以使用命令查看消息:

rosmsg show Person

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐