本文主要是介绍NO.2 Ros 第一个程序(cpp py),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
零蚀
Hello Ros(C++开发)
-
程序构建
首先要构建一个入口函数,然后在CMakeList.txt中添加这个可执行函数(在build的add_executable下)
# 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补全功能的文件,为了更准确的定位到我们的项目文件,可以将路径设置到项目路径外的专门设置临时文件的场所。
然后我们原有的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(非必须)。
-
clion配置python的环境(⚠️ ros 目前只能用python2,要等到下一个版本才可以使用python3),ubuntu自带了python2和python3,所以我们可以直接填写,python位于/usr/bin下。
-
-
编写&运行
工具运行
# 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
系统架构使用C++11.
- CMakeLists.txt
🔗 前言
🔗 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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!