文章目录
1 同一文件级下
假设同一个工作空间中的pkg_d需要调用pkg_a中的某个消息文件。
jw@G5-5500:~/catkin_ws/src$ ls
CMakeLists.txt pkg_a pkg_b pkg_c pkg_d
1.1 方法(1):创建pkg_d时就添加依赖pkg_a
1.1.1 cpp
创建包pkg_d时就添加对pkg_a的依赖:
catkin_create_pkg pkg_d std_msgs roscpp rospy pkg_a
首先对依赖包pkg_a进行单独编译。
catkin_make -DCATKIN_WHITELIST_PACKAGES='pkg_a'
如果近期已经单编过pkg_a并且没有对pkg_a进行修改的话,可以省略该步骤。
之后可以在pkg_d中进行源代码编辑,创建cpp文件:
//hello.cpp
#include "ros/ros.h"
#include "pkg_a/my_message.h"
#include "sstream"
int main(int argc, char **argv)
{
std::stringstream ss;
pkg_a::my_message msg; // 使用了其他包的消息类型
ros::init(argc, argv, "hello_d");
ros::NodeHandle h;
ROS_INFO("Im %s", ros::this_node::getName().c_str());
ss << "A 10";
ss >> msg.name;
ss >> msg.num;
ROS_INFO("I Send [name:%s, num:%d]", msg.name.c_str(), msg.num);
return 0;
}
C++编程结束后,为了生成可执行文件,还需修改CMakeLists.txt,增加:
add_executable(hello_d src/hello.cpp)
target_link_libraries(hello_d ${catkin_LIBRARIES})
hello_d即最终生产的c++可执行文件。
最后,回到工作空间下编译整个工作空间:
catkin_make -DCATKIN_WHITELIST_PACKAGES=''
完成!执行看看:
roscore
# 另外开启终端,执行:
jw@G5-5500:~/catkin_ws$ rosrun pkg_d hello_d
[ INFO] [1618811910.589905810]: Im /hello_d
[ INFO] [1618811910.590591329]: I Send [name:A, num:10]
1.1.2 python
- 创建pkg_d:
jw@G5-5500:~/catkin_ws$ cd src/
jw@G5-5500:~/catkin_ws/src$ catkin_create_pkg pkg_d std_msgs roscpp rospy pkg_a
- 创建scripts目录并编辑hello_d.py文件:
jw@G5-5500:~/catkin_ws/src$ cd pkg_d/
jw@G5-5500:~/catkin_ws/src/pkg_d$ mkdir scripts && cd scripts
jw@G5-5500:~/catkin_ws/src/pkg_d/scripts$ gedit hello_d.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from pkg_a.msg import my_message # 从pkg_a的msg目录下导入my_message.msg
def talker():
rospy.init_node('hello_d', anonymous=True) # 初始化节点信息
rospy.loginfo("Im %s"%rospy.get_name()) # 等同ROS_INFO
rate = rospy.Rate(10)
a = my_message() # 实例化消息
while not rospy.is_shutdown():
a.name = "PY"
a.num = 100
rospy.loginfo("I sended :%s %d"%(a.name, a.num)) # 等同ROS_INFO
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
- 修改hello_d.py的执行权限:
jw@G5-5500:~/catkin_ws/src/pkg_d/scripts$ chmod +x hello_d.py
- 首先对依赖包pkg_a进行单独编译。
catkin_make -DCATKIN_WHITELIST_PACKAGES='pkg_a'
如果近期已经单编过pkg_a并且没有对pkg_a进行修改的话,可以省略该步骤。
完成!执行看看:
roscore
# 另外开启终端,执行:
jw@G5-5500:~/catkin_ws/src/pkg_d/scripts$ rosrun pkg_d hello_d.py
[INFO] [1618813192.217028]: Im /hello_d_17147_1618813192082
[INFO] [1618813192.218188]: I sended :PY 100
1.2 方法(2):手动修改依赖关系
1.2.1 cpp
- 创建pkg_d时没有加入依赖pkg_a
jw@G5-5500:~/catkin_ws$ cd src/
jw@G5-5500:~/catkin_ws/src$ catkin_create_pkg pkg_d roscpp
- 在src/目录下创建hello.cpp, 内容与1.1.1一样
jw@G5-5500:~$ roscd pkg_d/src
jw@G5-5500:~/catkin_ws/src/pkg_d/src$ gedit hello.cpp
- 修改CMakeLists.txt文件:找到find_package并添加依赖pkg_a
find_package(catkin REQUIRED COMPONENTS
roscpp
pkg_a
)
- 修改CMakeLists.txt文件:找到include_directories取消注释(删除#)
include_directories(
include
${catkin_INCLUDE_DIRS}
)
catkin_INCLUDE_DIRS一般是指向工作空间目录下的devel/include
- C++编程结束后,为了生成可执行文件,还需修改CMakeLists.txt,增加:
add_executable(hello_d src/hello.cpp)
target_link_libraries(hello_d ${catkin_LIBRARIES})
- 修改package.xml文件,手动添加依赖:
<build_depend>pkg_a</build_depend>
<build_export_depend>pkg_a</build_export_depend>
<exec_depend>pkg_a</exec_depend>
- 确保依赖包pkg_a单编成功
jw@G5-5500:~/catkin_ws$ catkin_make -DCATKIN_WHITELIST_PACKAGES='pkg_a'
- 整编
jw@G5-5500:~/catkin_ws$ catkin_make -DCATKIN_WHITELIST_PACKAGES=''
完成!执行看看:
roscore
# 另外开启终端,执行:
jw@G5-5500:~/catkin_ws$ rosrun pkg_d hello_d
[ INFO] [1618811910.589905810]: Im /hello_d
[ INFO] [1618811910.590591329]: I Send [name:A, num:10]
1.2.2 python
不需要修改依赖,因为py文件的运行不需要经过编译
步骤与1.1.2一模一样~~