零蚀
Hello Ros(C++开发)
-
程序构建
首先要构建一个入口函数,然后在CMakeList.txt中添加这个可执行函数(在build的add_executable下)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohau62BG-1585034598335)(media/15850136278503/15850138097347.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/314caa4b193e51f42f640e6871b13714.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s56M8LzC-1585034598336)(media/15850136278503/15850139435989.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/b7e034f431ef5bb4ae6fa152e485c26a.png)
# 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 ROSrosrun first_demo 然后tab你会发现很多的可执行文件,出了我们的项目执行入口外,还有很多的是临时文件,其中还有为我们提供ros补全功能的文件,为了更准确的定位到我们的项目文件,可以将路径设置到项目路径外的专门设置临时文件的场所。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CeuRK6aS-1585034598337)(media/15850136278503/15850198551728.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/f7c25868db45d263e46cf5c247765862.png)
然后我们原有的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)]](https://i-blog.csdnimg.cn/blog_migrate/159ab648270b221f78b00fe13b657149.png)
-
clion配置python的环境(⚠️ ros 目前只能用python2,要等到下一个版本才可以使用python3),ubuntu自带了python2和python3,所以我们可以直接填写,python位于/usr/bin下。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZKviCwR-1585034598337)(media/15850136278503/15850212505254.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/a291250ee1fcb41c1e96f45421445577.png)
-
-
编写&运行
工具运行
# 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)]](https://i-blog.csdnimg.cn/blog_migrate/a1d7ea1afd545f1c469bc89e367051d8.png)
系统架构使用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的第一个程序
967

被折叠的 条评论
为什么被折叠?



