NO.2 Ros 第一个程序(cpp py)

2023-11-23 10:50
文章标签 程序 第一个 py ros cpp no.2

本文主要是介绍NO.2 Ros 第一个程序(cpp py),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

零蚀


Hello Ros(C++开发)

  • 程序构建

    首先要构建一个入口函数,然后在CMakeList.txt中添加这个可执行函数(在build的add_executable下)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohau62BG-1585034598335)(media/15850136278503/15850138097347.jpg)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s56M8LzC-1585034598336)(media/15850136278503/15850139435989.jpg)]

    # add_executable(${PROJECT_NAME}_node src/first_demo_node.cpp)
    add_executable(firstdemo src/main.cpp)
    #   ${catkin_LIBRARIES}
    # )target_link_libraries(firstdemo${catkin_LIBRARIES}
    )
    

    这里的add_executable(打包的项目名,入口文件路径),target_link_libraries(打包的项目路径,加入catkin链接库)

  • 编写&运行

    第一次导入ros的头文件,需要链接到库,所以编译器会在编写后报错,需要等待一会。

    #include "ros/ros.h"
    #include <iostream>using namespace std;int main(int argc,char **argv){string node_name="first_blood_node";// ros初始化ros::init(argc,argv,node_name);ros::NodeHandle node;cout<<"hello ROS"<<endl;return 0;
    }
    

    运行需要用master来启动Node程序,而启动master需要用到roscore命令。

    ➜  ros_ws roscore    
    

    点击运行:

    print
    hello ROS
    

    ⚠️ 一是要在devel/setup.bash的环境下,二是要在用roscore来保证

  • 命令行运行

    用rosrun命令,如果tab键没有提示项目名,则是说明,你没有环境,需要source一下。

    $ cd ws/ros_ws
    ~/ws/ros_ws$ source devel/setup.bash
    ~/ws/ros_ws$ rosrun first_demo firstdemo 
    //print hello ROS
    

    rosrun first_demo 然后tab你会发现很多的可执行文件,出了我们的项目执行入口外,还有很多的是临时文件,其中还有为我们提供ros补全功能的文件,为了更准确的定位到我们的项目文件,可以将路径设置到项目路径外的专门设置临时文件的场所。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CeuRK6aS-1585034598337)(media/15850136278503/15850198551728.jpg)]

    然后我们原有的cmake_build_debug 将失效,删除项目里的cmake_build_debug文件。

    重新编译c++代码,如此tab提示的只有firstdemo一个可执行项目了。

    ~/ws/ros_ws$ catkin_make
    ~/ws/ros_ws$ rosrun first_demo firstdemo 
    hello ROS
    

Hello Ros(Python开发)

  • 项目构建
    • 按照国际惯例创建一个文件,文件名叫做scripts(非必须)。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z47QEv3L-1585034598337)(media/15850136278503/15850207073757.jpg)]

    • clion配置python的环境(⚠️ ros 目前只能用python2,要等到下一个版本才可以使用python3),ubuntu自带了python2和python3,所以我们可以直接填写,python位于/usr/bin下。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZKviCwR-1585034598337)(media/15850136278503/15850212505254.jpg)]

  • 编写&运行

    工具运行

    # coding:utf-8
    # python2 对中文的支持不好,多以必须加了以上注释才能在代码里使用中文
    import rospyif __name__ == '__main__':node_name = 'py_node'# 创建node节点rospy.init_node(node_name)print('hello ros')
    

    命令行运行

    我们用rosrun并不能发现pyhi.py的文件,根据权限可以看出,pyhi.py是一个不可执行文件,无论是当前用户,当前组,还是其他。

    ~/ws/ros_ws/src/first_demo/scripts$ ll
    总用量 12
    drwxr-xr-x 2 parallels parallels 4096 3月  24 11:56 ./
    drwxr-xr-x 6 parallels parallels 4096 3月  24 11:30 ../
    -rw-r--r-- 1 parallels parallels  260 3月  24 11:56 pyhi.py
    

    修改权限

    $ chmod u+x pyhi.py
    # 权限已经设置为当前用户可以执行
    $ ll
    总用量 12
    drwxr-xr-x 2 parallels parallels 4096 3月  24 11:56 ./
    drwxr-xr-x 6 parallels parallels 4096 3月  24 11:30 ../
    -rwxr--r-- 1 parallels parallels  260 3月  24 11:56 pyhi.py*
    

    此时提示中就可以找到python文件了

    ~/ws/ros_ws$ rosrun first_demo 
    firstdemo  pyhi.py 
    

    但是目前是不能运行的,他会把我们的python文件当成一个shell脚本,所以我们需要子python文件中添加 ‘#! /usr/bin/env python’ 告诉编译器这是一个python文件(⚠️是#+!+空格(可以不写),格式问题会导致失效)

    #! /usr/bin/env python
    # coding:utf-8
    # python2 对中文的支持不好,多以必须加了以上注释才能在代码里使用中文
    import rospyif __name__ == '__main__':node_name = 'py_node'# 创建node节点rospy.init_node(node_name)print('hello ros')
    

    否则会出现以下的错误

    /home/parallels/ws/ros_ws/src/first_demo/scripts/pyhi.py:11: 未预期的符号 `node_name' 附近有语法错误
    /home/parallels/ws/ros_ws/src/first_demo/scripts/pyhi.py:11: `    rospy.init_node(node_name)'
    

ROS的那些API

c++代码改动后,运行前,一定需要catkin_make,来重新编译。目前ros用的是1.0的API所以c++和python有些API是不一样的,2.0之后才开始统一

  • 进程阻塞

    当我们代码执行结束之后,我们的node就挂掉了。所以我们经常需要阻塞进程。

    // 阻塞当前进程
    ros::spin();
    
  • 控制帧率
    • C++
    // 常用
    while(true){sleep(1);// TODO
    }
    // ros
    // 一秒钟执行10次
    ros::Rate(10);
    while(true){// TODO
    }
    
    • Python
    rospy.Rate(10)
    while True:pass
    
  • 状态获取

    如果在while ture的情况下,终端不能用ctr c来终止命令行的运行,只能通过,判断是否ros状态正常,来终止死循环。这样就能通过ctr c来阻止运行。

    • c++
    // 当前进程是否正常运行
    ros::ok();
    
    • Python
    rospy.is_shutdown() # 是ok()的相反的状态。
    
  • rosnode 节点操作
    # 当前所有的正在运行的节点,包括ros_master(/rosout)
    ~/ws/ros_ws$ rosnode list
    # 链接测试node是否存活
    ~/ws/ros_ws$ rosnode ping /rosout 
    rosnode: node is [/rosout]
    pinging /rosout with a timeout of 3.0s
    xmlrpc reply from http://zero-ubuntu:46451/	time=7.163048ms
    xmlrpc reply from http://zero-ubuntu:46451/	time=1.075983ms
    xmlrpc reply from http://zero-ubuntu:46451/	time=1.006842ms
    xmlrpc reply from http://zero-ubuntu:46451/	time=1.015186ms# kill掉节点,虽然kill之后,但是list仍然会记录,需要clearup
    rosnode kill /节点名
    rosnode cleanup 
  • 配置文件介绍
    • CMakeLists.txt
      src 下CMakeLists.txt,CMakeLists.txt 是系统的配置的文件,不要自己改动。
    parallels@zero-ubuntu:~/ws/ros_ws$ ls src
    CMakeLists.txt  first_demo
    
    • package.xml
    <build_depend>roscpp</build_depend>
    <build_depend>rosmsg</build_depend>
    <build_depend>rospy</build_depend><build_export_depend>roscpp</build_export_depend>
    <build_export_depend>rosmsg</build_export_depend>
    <build_export_depend>rospy</build_export_depend><exec_depend>roscpp</exec_depend>
    <exec_depend>rosmsg</exec_depend>
    <exec_depend>rospy</exec_depend>
    

    roscpp 等也是一个package,而当前项目,导入了这个package调用,方便我们开发。

    ~/ws/ros_ws$ roscd roscpp
    parallels@zero-ubuntu:/opt/ros/melodic/share/roscpp$ ls
    cmake  msg  package.xml  rosbuild  srv
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05X8vST8-1585034771317)(media/15850136278503/15850325804251.jpg)]

    系统架构使用C++11.


🔗 前言
🔗 Robot ROS 操作系统列表
🔗 NO.1 Ros 安装&介绍
🔗 NO.3 Ros Topic 通讯
🔗 NO.4 Ros 消息补充&小乌龟
🔗 NO.5 Ros Turtle &日志开发
🔗 NO.6 Ros Service 简单通讯
🔗 NO.7 Ros Service 复杂通讯
🔗 NO.8 Ros PID算法案例
🔗 NO.9 PID原理&曲线计算原理
🔗 NO.10 Action 通讯 上
🔗 NO.11 Action 通讯 下
🔗 NO.12 Param & Launch & TF 案例
🔗 NO.13 ROS 2 Foxy安装(Mac OS)
🔗 NO.14 关于ROS2的第一个程序

这篇关于NO.2 Ros 第一个程序(cpp py)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/417419

相关文章

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动