帮我用ROS完成Topic编程通迅协议编程 1. 创建 工作空间 ch3_ws 2. 创建 功能包 stud_topic 3. 创建学生消息类型:stud_msg 包括消息成员:学号,姓名,专业, 班级, 年龄,性别 4. 创建 学生信息发布功能节点 stud_publisher 要求,1) 定义学生信息时,是自己的 学号,姓名 等信息 2)要打印出自已的 学号,姓名 等信息 5. 创建 学生信息订阅功能节点 stud_subscriber 要求,1) 在回调函数中打印,是自己的 学号,姓名 等信息,以上代码用C++来编写
时间: 2024-02-21 20:59:38 浏览: 185
ROS使用python3的cv-bridge功能所需的功能包
好的,下面是实现的具体步骤:
1. 创建工作空间 ch3_ws
在终端输入以下命令:
```
mkdir -p ~/ch3_ws/src
cd ~/ch3_ws/
catkin_make
```
2. 创建功能包 stud_topic
在终端输入以下命令:
```
cd ~/ch3_ws/src
catkin_create_pkg stud_topic roscpp rospy std_msgs message_generation
```
3. 创建学生消息类型:stud_msg
在终端输入以下命令:
```
cd ~/ch3_ws/src/stud_topic
mkdir msg
cd msg
touch stud_msg.msg
```
打开 stud_msg.msg 文件,并添加以下内容:
```
string student_id
string name
string major
string class
int32 age
bool gender
```
保存并关闭文件。
4. 创建学生信息发布功能节点 stud_publisher
在终端输入以下命令:
```
cd ~/ch3_ws/src/stud_topic
mkdir src
cd src
touch stud_publisher.cpp
```
打开 stud_publisher.cpp 文件,并添加以下内容:
```cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "stud_topic/stud_msg.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "stud_publisher");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<stud_topic::stud_msg>("stud_info", 1000);
stud_topic::stud_msg msg;
msg.student_id = "123456";
msg.name = "Tom";
msg.major = "Computer Science";
msg.class = "Class A";
msg.age = 20;
msg.gender = true;
ROS_INFO("My student id is %s", msg.student_id.c_str());
ROS_INFO("My name is %s", msg.name.c_str());
ROS_INFO("My major is %s", msg.major.c_str());
ROS_INFO("My class is %s", msg.class.c_str());
ROS_INFO("My age is %d", msg.age);
ROS_INFO("My gender is %s", msg.gender ? "Male" : "Female");
ros::Rate loop_rate(10);
while (ros::ok())
{
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
```
代码解释:
- 首先,我们引入必要的头文件,包括 ROS 的核心头文件、消息类型头文件以及 std_msgs/String 头文件。
- 然后,我们初始化节点并创建一个节点句柄 nh。
- 接下来,我们创建一个发布者 pub,它发布的消息类型为 stud_topic::stud_msg,话题名称为 stud_info。
- 然后,我们创建一个 stud_topic::stud_msg 类型的消息 msg,并填充它的各个成员变量。
- 接下来,我们使用 ROS_INFO 宏来打印出我们的学号、姓名、专业、班级、年龄和性别信息。
- 最后,我们进入一个循环中,每隔 0.1 秒发布一次消息,并调用 ros::spinOnce() 来处理回调函数。
5. 创建学生信息订阅功能节点 stud_subscriber
在终端输入以下命令:
```
cd ~/ch3_ws/src/stud_topic
cd src
touch stud_subscriber.cpp
```
打开 stud_subscriber.cpp 文件,并添加以下内容:
```cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "stud_topic/stud_msg.h"
void stud_info_callback(const stud_topic::stud_msg::ConstPtr& msg)
{
ROS_INFO("Received stud info:");
ROS_INFO(" student_id: %s", msg->student_id.c_str());
ROS_INFO(" name: %s", msg->name.c_str());
ROS_INFO(" major: %s", msg->major.c_str());
ROS_INFO(" class: %s", msg->class.c_str());
ROS_INFO(" age: %d", msg->age);
ROS_INFO(" gender: %s", msg->gender ? "Male" : "Female");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "stud_subscriber");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("stud_info", 1000, stud_info_callback);
ros::spin();
return 0;
}
```
代码解释:
- 首先,我们引入必要的头文件,包括 ROS 的核心头文件、消息类型头文件以及 std_msgs/String 头文件。
- 然后,我们定义了一个回调函数 stud_info_callback,它接收一个 stud_topic::stud_msg 类型的消息指针 msg,并使用 ROS_INFO 宏打印出学生信息。
- 接下来,我们初始化节点并创建一个节点句柄 nh。
- 然后,我们创建一个订阅者 sub,它订阅的话题名称为 stud_info,回调函数为 stud_info_callback。
- 最后,我们进入一个循环中,调用 ros::spin() 来等待消息的到来。
6. 编译并运行
在终端输入以下命令:
```
cd ~/ch3_ws/
catkin_make
source devel/setup.bash
```
然后,在两个新的终端分别输入以下命令,分别运行发布者和订阅者:
```
rosrun stud_topic stud_publisher
rosrun stud_topic stud_subscriber
```
你应该能看到发布者输出的学生信息以及订阅者打印出的学生信息。
阅读全文