在ROS1下创建自定义消息msg
**自定义消息(Custom Message)**通常需要以下步骤:
1. 创建一个自定义消息 MyMsg.msg
假设你希望定义一个消息类型,叫做:
my_package/msg/MyMsg.msg
内容如下:
string name
int32 age
float32 height
步骤一:创建 msg 文件
在你的包目录下创建:
mkdir msg
touch msg/MyMsg.msg
编辑 MyMsg.msg
内容如下:
string name
int32 age
float32 height
步骤二:修改 CMakeLists.txt
确保以下内容存在:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)
## 声明消息文件
add_message_files(
FILES
MyMsg.msg
)
## 自动生成消息
generate_messages(
DEPENDENCIES
std_msgs
)
## 声明 catkin 包
catkin_package(
CATKIN_DEPENDS message_runtime roscpp std_msgs
)
步骤三:修改 package.xml
添加依赖:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
步骤四:使用自定义消息
你可以在 src/demo_pub.cpp
中这样使用:
#include <ros/ros.h>
#include "my_package/MyMsg.h"
int main(int argc, char **argv) {
ros::init(argc, argv, "my_publisher");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<my_package::MyMsg>("custom_topic", 10);
ros::Rate rate(10);
while (ros::ok()) {
my_package::MyMsg msg;
msg.name = "Alice";
msg.age = 30;
msg.height = 1.75;
pub.publish(msg);
ros::spinOnce();
rate.sleep();
}
return 0;
}
编译
cd ~/catkin_ws
catkin_make
source devel/setup.bash
测试
rosrun my_package my_publisher
rostopic echo /custom_topic
2. 自定义消息相互嵌套
第一步:定义消息内容
创建目录并添加 .msg
文件:
mkdir -p ~/catkin_ws/src/my_package/msg
cd ~/catkin_ws/src/my_package/msg
touch ControlCommand.msg
ControlCommand.msg
内容如下:
std_msgs/Header header
uint32 Command_ID # 控制命令编号
string source # 消息来源
uint8 Mode # 控制模式
uint8 Idle=0
uint8 Takeoff=1
uint8 Hold=2
uint8 Land=3
uint8 Move=4
uint8 Disarm=5
uint8 User_Mode1=6
uint8 User_Mode2=7
my_package/PositionReference Reference_State # 控制参考量
注意:你使用了
PositionReference
,需要 另外定义一个 PositionReference.msg。
第二步:定义 PositionReference.msg
在同一 msg/
目录下创建:
touch PositionReference.msg
内容示例:
float32[3] position # x, y, z
float32[3] velocity # vx, vy, vz
float32[3] acceleration # ax, ay, az
float32 yaw # 偏航角
float32 yaw_rate # 偏航角速度
第三步:配置 CMakeLists.txt
确保包含以下部分:
find_package(catkin REQUIRED COMPONENTS
std_msgs
message_generation
)
add_message_files(
FILES
ControlCommand.msg
PositionReference.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS std_msgs message_runtime
)
第四步:修改 package.xml
添加依赖项:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>std_msgs</exec_depend>
第五步:测试使用
发布/订阅代码示例:
发布端(src/pub_command.cpp
):
#include <ros/ros.h>
#include "my_package/ControlCommand.h"
int main(int argc, char **argv) {
ros::init(argc, argv, "command_publisher");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<my_package::ControlCommand>("control_command", 10);
ros::Rate rate(10);
while (ros::ok()) {
my_package::ControlCommand cmd;
cmd.header.stamp = ros::Time::now();
cmd.Command_ID = 1;
cmd.source = "GroundStation";
cmd.Mode = my_package::ControlCommand::Takeoff;
cmd.Reference_State.position = {0.0, 0.0, 10.0};
cmd.Reference_State.velocity = {0.0, 0.0, 0.0};
cmd.Reference_State.yaw = 0.0;
pub.publish(cmd);
ros::spinOnce();
rate.sleep();
}
return 0;
}
第六步:构建 & 测试
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun my_package command_publisher
rostopic echo /control_command