ROS工程中C++调用python函数

2023-05-16

在ROS api程序中,大部分函数的实现是用的python,python语言简单易学,特别做一些测试和调试非常简单。

因此,在C++中调用python函数会极大地减少工作量。


在C++中调用python函数


C++调用python函数,python中用有Python.h头文件起到了很大作用。相关的函数介绍可在 Extending Python with C or C++ 中找到。(这个是针对python2.7的说明)。

在ros工程中,需在CMakeLists.txt中添加相关依赖项即可,关键代码如下:

link_directories(/usr/lib/python2.7/config-i386-linux-gnu)

include_directories(${catkin_INCLUDE_DIRS} /usr/include)

add_executable(test src/test.cpp)
target_link_libraries(test ${catkin_LIBRARIES} python2.7)   //用于找到libpython2.7.so库

关于C++部分代码如下:

#include <ros/ros.h>
#include <iostream>
#include <python2.7/Python.h>

int main()
{
    Py_Initialize();

    PyRun_SimpleString("print 'test simple demo'");
	//load python functions 
    PyRun_SimpleString("import sys");
    std::string dirs = std::string("sys.path.append('/home/user/test/')");
    PyRun_SimpleString(dirs.c_str());
    //load module
    PyObject *module = PyString_FromString("for_test");
    PyObject *pyModule = PyImport_Import(module);
    if(!pyModule) //failed
    {
        std::cout << "Get python module failed." << std::endl;
        return 0;
    }
    //load function
    PyObject *pyfun = PyObject_GetAttrString(pyModule, "main");
    if(!pyfun || !PyCallable_Check(pyfun))
    {
        std::cout << "Cannot find python function" << std::endl;
        return 0;
    }else{
        std::cout << "load python funtion ok" << "\n";
    }
    //callback funtion
    PyObject *argss = PyTuple_New(1);
    PyObject *arg = PyString_FromString("127.0.0.1");
    PyTuple_SetItem(argss, 0, arg);
    PyObject *pyRes = PyObject_CallObject(pyfun, argss);
    //get result
    if(pyRes)
    {
        std::string ret = PyString_AsString(pyRes);
        std::cout << "result: " << ret << "\n";
    }

    Py_Finalize();
    return 0;
}

其for_test.py的python代码如下:

import logging
import socket
import time

def main(ip):
    proctime = time.strftime("%y%m%d_%H%M%S")
    logging.basicConfig(level=logging.INFO, filename=proctime+'.log')
    logging.info("Start program")
    port = 8080
    clientsocket_ = socket.create_connection((ip, port))
    clientsocket_.send("for test")
    logging.info("write file success")
    logging.info("Ending program")
    return "Test OK"

if __name__ == "__main__":
    main("127.0.0.1")         ## 运行前提为开启了服务器端

上面例子是传入一个参数并得到返回值的python函数调用,更多的调用方式可在网上找到大量相关资料。注意将for_test.py文件放到/home/user/test/下,否则会找不到相应python模块。

通过上述例子,便可以很方便地实现python调用。

不过,发现调用ros自身提供的python函数,比如rostopic中的get_topic_type("/rosout")函数,rosservice中的get_service_list()函数,这些函数都非常好用非常方便。只是通过上述方法总是调用不成功,会出现以下提示:


说“'module' object has no attribute 'argv'" in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored”。但即使删除了threading.pyc也还是不行,原因暂时不明,不知道是否有人已经解决。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS工程中C++调用python函数 的相关文章

随机推荐

  • STM32——硬件IIC从机通信

    前言 xff1a 根据网上的资料 xff0c 大部分网友表示STM32自带的硬件IIC存在bug xff0c 读写时很容易卡死 自己在调试的时候也出现卡死的情况 xff0c 最后一点一点调试 xff0c 也还是调通了 本文将记录自己调试ST
  • HI3516的编译参数-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4

    前言 Hi3516A具有浮点运算单元和neon 文件系统中的库是采用软浮点和neon编译而成 xff0c 因此所有Hi3516A板端代码编译时需要在Makefile里面添加选项 mcpu 61 cortex a7 mfloat abi 61
  • 算法移植优化基础

    PS xff1a 为了面试准备的 xff0c 总结的有点粗糙 ARM xff1a Advanced RISC Machines xff0c ARM架构是面向低预算市场设计的第一款RISC微处理器 xff0c 基本是32位单片机的行业标准 x
  • DBoW2在windows上的vs工程搭建方法

    xfeff xfeff 注释 xff1a 蓝体字是 opencv249 专用的修改 xff1b 黑体字是 opencv3 需要的修改 环境 xff1a vs2012 32bit 叙述比较简略 不明之处可以留言 1 配置 opencv 2 4
  • MSCKF_vio学习笔记

    最近因为项目需求 xff0c 对MSCKF vio的论文和代码进行了一番研读 xff0c 现将学习过程记下 MSCKF vio是一种基于多状态约束卡尔曼滤波器的双目视觉里程计 其中多状态约束是指将多帧图像的相机位姿加入卡尔曼状态向量中 xf
  • MSCKF2.0(Mingyang Li-IJRR2013) 论文要点总结

    论文 xff1a Li M Mourikis A I High precision consistent EKF based visual inertial odometry J The International Journal of R
  • SLAM,SLAM+IMU的状态估计问题描述-个人理解

    1 状态估计问题 令状态变量为x 61 x1 x2 x3 观测变量为z 61 z1 z2 z3 状态估计问题等同于求解条件概率分布 xff1a P x z xff0c 在当前观测状态z下的状态x分布 xff0c 也就是最可能的状态是什么 由
  • VINS-Fusion运行时的段错误(核心已转储)解决方法

    平台 ubuntu16 04 43 ROS 问题描述 xff1a 前两天VINS的原作者开源了VINS Fusion的双目版以及给出了和GPS融合的一个demo xff0c 所以试着运行下数据集 每次单目运行10s左右 xff0c 双目1
  • Jetson Xavier NX 刷机+更换清华源完美讲解

    当你拿到梦寐以求的NVIDIA Jetson Xavier NX开发板时 xff0c 第一个工作就是要刷机 究竟要怎么做呢 xff1f Let s go 这种板子有两种 xff0c 一种是带Micro SD卡槽的 xff0c 可以插入小型S
  • vmware下vmdk文件越来越大的解决方法探讨

    前段时间在vmware下面安装了ubuntu镜像 xff0c 用了一段时间后发现ubuntu的vmdk文件越来越大 xff0c 达到了31 6GB xff0c 如下图所示 而且随着继续安装新的软件仍然在增大中 即使在ubuntu里面删除了文
  • 工作日志的作用

    朱金灿 公司提倡我们每天都写工作日志 这使得我思考工作日志的作用 我想了一下 xff0c 工作日志应该要起两个作用 xff1a 1 计划作用 俗话说 xff1a 凡事预则立 xff0c 不预则废 最好在每天开始工作前先在工作日志上写下今天要
  • Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)

    原文 xff1a http blog csdn net zcshoucsdn article details 54670473 最近公司搞新项目 xff0c 需要使用FreeRTOS xff0c 之前只有Linux的基础 xff08 学了个
  • 职场 | Intel因特尔2019届软件工程师秋招笔试题

    同样的本文是对笔试过程中 xff0c 仍然记得的考点的查漏补缺 一共分为三部分 xff1a 选择题 编程题 附加题 时间是两个小时 xff0c 个人感觉因特尔的笔试题对于内核 xff0c 内存管理等方面的考点较多 xff0c 具体属于什么科
  • Linux-LCD驱动实现

    一 帧缓冲设备驱动在Linux子系统中的结构 xff1a 二 帧缓冲相关的重要数据结构 从帧缓冲设备驱动程序结构 看 xff0c 该驱动主要跟fb info结构体有关 xff0c 该结构体记录了帧缓冲设备的全部信息 xff0c 包括设备的设
  • ROS之命名空间

    已经学ROS快两个月了 xff0c 一开始对ROS 命名空间 xff0c 参数 xff0c 参数服务器 xff0c 重映射没认真看 xff0c 后来发现很重要 xff0c 它是学习ROS代码的基础 我们都知道ros以topic通信 xff0
  • CircleProgressBar 一个界面漂亮功能强大的圆形进度条,支持多种属性

    CircleProgressBar 项目地址 xff1a HuTianQi CircleProgressBar 简介 xff1a 一个界面漂亮功能强大的圆形进度条 xff0c 支持多种属性 xff0c 如圆环的大小颜色 xff0c 进度条的
  • Android 串口调试助手

    Android SerialPort Tool 项目地址 xff1a licheedev Android SerialPort Tool 简介 xff1a Android 串口调试助手 更多 xff1a 作者 提 Bug 标签 xff1a
  • 树莓派IIC通讯获取BMI08x IMU数据进行姿态解算,并通过UART/TCP在rviz上显示

    截至2021年 xff0c 树莓派出的最新款应该是Raspberry Pi 400 xff0c 设计得跟键盘一样 xff0c 很难想象到这是个树莓派 xff0c 尤其是它的标语写的很好 你的下一个电脑 xff0c 何必是电脑 xff0c 不
  • 运用ROS和OpenCV进行简单的图像处理之检测

    本文主要讲述在ROS下使用opencv进行图像处理 xff0c 并给出了一个详细示例 首先建立一个ros包 xff0c 在CMakeLists txt中加入以下代码段 xff0c 用于找到并链接OpenCV 安装完整版的ROS会顺带把Ope
  • ROS工程中C++调用python函数

    在ROS api程序中 xff0c 大部分函数的实现是用的python xff0c python语言简单易学 xff0c 特别做一些测试和调试非常简单 因此 xff0c 在C 43 43 中调用python函数会极大地减少工作量 在C 43