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 rospy
    
    if __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 rospy
    
    if __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的第一个程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零蚀zero eclipse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值