可以在 catkin 工作空间之外创建 ROS 节点吗?
Posted
技术标签:
【中文标题】可以在 catkin 工作空间之外创建 ROS 节点吗?【英文标题】:Can a ROS node be created outside a catkin workspace? 【发布时间】:2018-05-14 06:38:47 【问题描述】:我想在 catkin 工作区之外创建一个 ROS 发布者节点。 可以创建吗?
【问题讨论】:
【参考方案1】:当然可以。像对待任何其他 cpp 库或 python 包一样对待 ROS。
在python中,你必须保持PYTHONPATH
环境变量指向/opt/ros/kinetic/lib/python2.7/dist-packages
中的ros包。
在 cpp 中,您必须告诉编译器在哪里查找包含 (/opt/ros/kinetic/include
)、库 (/opt/ros/kinetic/lib
) 以及要导入的库。对于最简单的应用程序-lroscpp -lrostime -lrosconsole
应该足够了。例如:
g++ node.cpp -o node -I/opt/ros/kinetic/include -L/opt/ros/kinetic/lib -lroscpp -lrostime -lrosconsole
记住你仍然需要像ROS_MASTER_URI
这样的ros环境变量。
但是,我不知道是否有一种简单的方法可以在不使用catkin_make
和 cmake 文件的情况下生成自定义 ros 消息。
【讨论】:
【参考方案2】:是的,在 Python 中,您可以在 catkin 工作区之外编写 ROS 节点。
启动您的 roscore
,然后在新终端中运行 Python 脚本,通常类似于 python filename
,它会像您放置在 catkin 工作区中并构建和获取它一样运行。
我已成功创建订阅者和发布者节点,并在实际的 TurtleBot2 上运行它们,而节点不在 catkin 工作区中。
我认为我描述的方法不适用于 C++。它仅适用于 Python。在 C++ 中,您必须在编译时链接库。所以,检查一下。例如,我们执行 g++ filename.cpp -lm,其中 -lm 链接要在 filename.cpp 中使用的数学库,因此您可能需要检查如何执行此操作。另一方面,将文件添加到你的 catkin 工作区或只是转移到 Python 会更容易。
您必须包含 ros/ros.h 和 std_msgs/message_name.h ,其中 message_name 将替换为您在代码中使用的任何消息。您可能会在某个地方找到这些文件,或者您可以通过搜索在线获取文件的源代码。
【讨论】:
感谢@akshayk07 的回复。我在 cpp 中创建了一个发布者节点。当我像在终端窗口中编译任何其他 cpp 文件一样编译时。我遇到错误,例如 "未定义对 ros::init() 的引用,未定义对 ros::ok() * 的引用"。当我们在终端中编译时,只需添加 ros 的路径就可以了,或者我们必须做的其他事情以及添加 */opt/ros/kinetic/include 路径。对不起,我在堆栈溢出中的写作格式 我认为我描述的方法不适用于 C++。它仅适用于 Python。在 C++ 中,您必须在编译时链接库。所以,检查一下。例如,我们执行g++ filename.cpp -lm
,其中-lm
链接要在filename.cpp
中使用的数学库,因此您可能需要检查如何执行此操作。另一方面,将文件添加到 catkin 工作区或只是转移到 Python 会更容易。
这肯定行不通。我认为我们必须指定专用的库目录并链接库。但我不确定我必须指定哪些库。如果我必须在 catkin 中为我尝试创建的节点创建一个包,在 CMakeLists.txt 的 add_package 部分中,我正在添加std_msgs,roscpp。对于这个正在使用哪些库,我无法弄清楚。 .如果我能得到比我尝试过的那些,在 catkin_ws 之外执行 .cpp 文件。如果你有什么建议,你愿意分享吗?谢谢
您必须包含ros/ros.h
和std_msgs/message_name.h
,其中message_name 将替换为您在代码中使用的任何消息。您可能会在某个地方找到这些文件,或者您可以通过搜索在线获取文件的源代码。
我已将此信息添加到答案中。如果此答案令人满意,请单击绿色勾号接受答案。如果您还有其他问题,请将它们作为单独的问题发布,而不是在 cmets 中,因为这有助于保持网站的井井有条。谢谢。以上是关于可以在 catkin 工作空间之外创建 ROS 节点吗?的主要内容,如果未能解决你的问题,请参考以下文章