先在CMakeLists.txt中要填有这几项
cmake_minimum_required(VERSION 3.0.2)
project(simple_ros_test)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_message_files(
FILES
Parent.msg
Child.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES simple_ros_test
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
include_directories(
# include
../../devel/include/
${catkin_INCLUDE_DIRS}
)
add_executable(rosmsg_test_node src/rosmsg_test_main.cpp)
target_link_libraries(rosmsg_test_node
${catkin_LIBRARIES}
)
在package.xml中记得添加
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
比如:Parent.msg中定义
Child[] childs
在Chlid.msg中定义
string Toys
string Name
uint8 Age
其含义是一个父母有很多孩子,而每个孩子有玩具,名字,年龄等元素。
#!/usr/bin/env python
import rospy
import sys
sys.path.insert(0, "/home/wzy/vins_ws/devel/lib/python2.7/dist-packages") # 这一步要加,不然报错ImportError: No module named relative_pose_backend.msg
from relative_pose_backend.msg import Parent
from relative_pose_backend.msg import Child
P = Parent()
C1 = Child()
C2 = Child()
C1.Toys = 1
C1.Name = "jerry"
C1.Age = 10
P.childs.append(C1)
C2.Toys = 2
C2.Name = "Tom"
C2.Age = 8
P.childs.append(C2)
print(P)
# 对循环添加子消息,这里以新增Parent中childs数量为例
for i in range(2):
Ci = Child() # 这里若要新增对象 要在循环内初始化对象Child(),不能在循环外初始化。和C++中vector push_back()不一样
Ci.Name = "name" + str(i)
Ci.Toys = "toy_name" + str(i*2)
Ci.Age = Ci.Age + 1
P.childs.append(Ci)
print(P)
Ci = Child() # 这里若要新增对象 但在在循环外初始化对象Child(),append函数会依据字典方式,将Name,Toys,Age视作键key,
# 所以添加进去的值都被覆盖为循环中最后一次的值
for i in range(2):
Ci.Name = "name" + str(i)
Ci.Toys = "toy_name" + str(i*2)
Ci.Age = Ci.Age + 1
P.childs.append(Ci)
print(P)
# 对循环添加子消息,这里以修改Parent中childs属性为例
for i in range(len(P.childs)):
P.childs[i].Name = "name" + str(i)
P.childs[i].Age = P.childs[i].Age + 2
print(P)
childs:
-
childs:
-
Toys: "Toys1"
Name: "jerry"
Age: 10
-
Toys: "Toys2"
Name: "Tom"
Age: 8
childs:
-
Toys: "Toys1"
Name: "jerry"
Age: 10
-
Toys: "Toys2"
Name: "Tom"
Age: 8
-
Toys: "toy_name0"
Name: "name0"
Age: 1
-
Toys: "toy_name2"
Name: "name1"
Age: 1
childs:
-
Toys: "Toys1"
Name: "jerry"
Age: 10
-
Toys: "Toys2"
Name: "Tom"
Age: 8
-
Toys: "toy_name0"
Name: "name0"
Age: 1
-
Toys: "toy_name2"
Name: "name1"
Age: 1
-
Toys: "toy_name2"
Name: "name1"
Age: 2
-
Toys: "toy_name2"
Name: "name1"
Age: 2
childs:
-
Toys: "Toys1"
Name: "name0"
Age: 12
-
Toys: "Toys2"
Name: "name1"
Age: 10
-
Toys: "toy_name0"
Name: "name2"
Age: 3
-
Toys: "toy_name2"
Name: "name3"
Age: 3
-
Toys: "toy_name2"
Name: "name5"
Age: 6
-
Toys: "toy_name2"
Name: "name5"
Age: 6
#include "simple_ros_test/Parent.h"
#include "ros/ros.h"
#include "iostream"
int main(int argc, char **argv) {
// Launch our ros node
ros::init(argc, argv, "rosmsg_test_node");
ros::NodeHandle nh;
// ros::NodeHandle nh("~");
ros::Rate rate(10);
simple_ros_test::Parent parent;
simple_ros_test::Child child_0;
simple_ros_test::Child child_1;
child_0.Age = 8;
child_0.Name = "Jerry";
child_0.Toys = "hhh";
child_1.Age = 10;
child_1.Name = "Tom";
child_1.Toys = "kkk";
parent.childs.emplace_back(child_0);
parent.childs.emplace_back(child_1);
//在循环中添加,循环外定义,可以。这一点与python不同
simple_ros_test::Child child_i;
for (int i = 0; i < 2; ++i) {
child_i.Toys = "toy" + std::to_string(i);
child_i.Name = "name" + std::to_string(i);
child_i.Age = i;
parent.childs.emplace_back(child_i);
}
//在循环中添加,循环内定义,也可以
for (int i = 0; i < 2; ++i) {
simple_ros_test::Child child_j;
child_j.Toys = "toy" + std::to_string(i*2);
child_j.Name = "name" + std::to_string(i*2);
child_j.Age = i*2;
parent.childs.emplace_back(child_j);
}
//打印结果
for (int i = 0; i < parent.childs.size(); ++i) {
std::cout << "parent child = " << std::to_string(parent.childs[i].Age) << "\t" << parent.childs[i].Name << "\t" << parent.childs[i].Toys << std::endl;
}
return 0;
}
parent child = 8 Jerry hhh
parent child = 10 Tom kkk
parent child = 0 name0 toy0
parent child = 1 name1 toy1
parent child = 0 name0 toy0
parent child = 2 name2 toy2
把新建的python文件赋权限chmod a+x *.py,对C++文件生成的节点,重新source devel/setup.bash
请查看如下目录有没有消息文件生成
python需要查看$HOME/vins_ws/devel/lib/python2.7/dist-packages/relative_pose_backend/msg/有类似目录结构
.
├── __init__.py
└── msg
├── _Child.py
├── __init__.py
└── _Parent.py
C++需要查看$HOME/vins_ws/devel/include/relative_pose_backend/有如下目录结构
.
├── Child.h
├── Parent.h