(ROS-5)功能包之间的互相调用

本文介绍两种在ROS中配置包间依赖的方法:一种是在创建pkg_d时直接添加依赖pkg_a;另一种是创建后手动修改依赖关系。文中详细展示了如何通过C++和Python实现这两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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一模一样~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值