本帖最后由 最靓的仔 于 2022-1-18 14:54 编辑
拍个ros连续剧,这次尽量不挖坑了。
之前发了一个ROS的串口例程,但是没有发出代码,代码都在github上,直接下载就好,下面贴出地址:
https://github.com/hipnuc/products/tree/master/examples/ROS
测试环境:Ubuntu16.04 ROS版本:ROS Kinetic Kame 测试设备:HI226 HI229 1、创建工作空间 在编写ros的程序时,首先要创建一个工作空间,类似一个编译环境,用来运行ros程序的编译环境,这个工作空间的名字是自定义的,不必像许多教程那样,都统统写成catkin_ws,一般来说,一些小的ros程序,都可以在这个工作空间中编译运行,比如,我命名成ros_test_ws,那么我一些关于ros的程序都可以在这个文件下编译运行调试,除非是新成立了一个项目,而且这个项目很大,那么为了以后的代码管理,最好是重新创建一个工作空间。 在创建工作空间之前,先确认一下ros的环境变量是否设置成功, 打开terminal,输入:export | grep ROS 如果出现如下信息 declare -x ROSLISP_PACKAGE_DIRECTORIES="\" declare -x ROS_DISTRO="\"kinetic\"" declare -x ROS_ETC_DIR="\"/opt/ros/kinetic/etc/ros\"" declare -x ROS_MASTER_URI="\"http://localhost:11311\"" declare -x ROS_PACKAGE_PATH="\"/home/linux/ros_ws/src:/opt/ros/kinetic/share\"" declare -x ROS_PYTHON_VERSION="\"2\"" declare -x ROS_ROOT="\"/opt/ros/kinetic/share/ros\"" declare -x ROS_VERSION="\"1\"" 如果有已经创建好的工作空间,那么他的路径就会跟在 ROSLISP_PACKAGE_DISECTORIES的后边。 如果没有这些提示,请先配置工作环境。 接下来创建工作空间: 打开termina,依次l输入: $ mkdir -p ~/serial_imu_ws/src //创建两个目录 $ cd ~/serial_imu_ws/src //进入到子目录 $ catkin_init_workspace //初始化工作空间 $ cd ~/serial_imu_ws //回到工作空间的主目录 $ catkin_make //编译环境 $ ls //查看编译成功之后,产生了什么 一般会出现两个新的文件:build 和 devel 文件,还有一个用户自己创建的src文件。 在这里得说一下ros的目录结构,不然容易懵: (穷的没有干净的A4纸了,就用卫生纸对付一下,别喷我) 位于最上层就是工作空间了,编译ros工程时,一定要回到这个目录下,进行编译,也就执行catkin_make 然后它有三个子目录,src,build,devel,完整的应该是四个,第四个是install src是源码空间 build是编译环境 devel是开发环境 install是安装环境 工作空间的名称可以任意命名,再强调一下,执行catkin_make命令,必须在这个目录执行,catkin是ros自己定义的一套编译系统,是CMake的扩展。 src文件夹是需要自己创建,而且这个源码空间只能叫src,不可以随意变动 build 和 devel 这两个文件夹由编译命令 -> catkin_make 命令自动创建的 install 文件夹是由编译命令加install -> catkin_make install 命令自动创建。 (1)、src叫源码空间 故名思意,这个目录下就是用来存放用户自己构建的代码。这些代码是用来实现一些功能,也叫功能包。默认自带一个CMakeList.txt文件,这个文件是 自动生成的,基本不用修改。 这个目录下可以创建多个功能包,每个功能包是ros文件系统种组织程序文件的基本的单元,是编译系统的基本单元。一个功能包下必须包含CMakeList.txt和package.xml这两个文件,不过这两个文件也是在创建功能包的时候自动生成的,但是需要用户进行相应的修改。注意这里的CMakeList.txt,是功能包里边的,上一段说到的CMakeList是在src的目录下,不要混了。
src的目录下有:CMakeList.txt A_package B_package C_package ...... A_package目录下有:CMakeList.txt package.xml src msg ...... 之后,本文说到的修改CMakeList文件,默认就是修改具体的某个功能包里边的CMakeList.txt文件。(达成共识) 那么接下来就简单说说,CMakeList.txt和package.xml这俩文件 先聊CMakeList吧,聊完CMakeList,在谈package。
CMakeList.txt文件简单说说 catkin是基于这个CMake实现的,用的语法都基本一致,就说一下常用的吧,都说完的话,估计可以出书了,哈哈。 cmake_minimum_required(): CMake的版本号 project():工程名字 find_package():添加外部依赖 加载catkin种的变量,同时添加roscpp,std_msgs,rospy,serial等用户定义的依赖包。
include_directories():添加头文件路径
这个很好理解,有时候这个头文件太多了,如果都分散开,那个在管理维护的时候,就很不方便,所以往往都会把这些头文件集中起来,放在一个文件中,比如在功能包文件夹下创建一个include这么个文件夹,我把该功能包所有的头文件集中存放在这里,那么在就得把这个路径写在这个语句的括号里边,如果在其他的路径,正好又要使用这个头文件,就把这个头文件的路径添加到这里。不过目前我还菜的一批,没那么多头文件,所以就没有集中,都散开了。
add_library(): 生成库文件
就是可以把多个源文件编译成库文件
add_library(lib_d libsrc_a.cpp libsrc_b.cpp libsrc_c.cpp ...)
add_executable(): 生成可执行文件
就是可以把多个源文件编译成可执行文件
add_executable(node_d src_a.cpp src_b.cpp src_c.cpp src_x.c ....)
对,你没看错,还可以添加 .c 文件
add_dependencies():添加依赖项,在使用message,action,serivce的时候需要使用
add_dependencies(A_target &{catkin_EXPORTED_TARGETS})
add_dependencies(A_target &{&{PROJECT_NAME}_EXPORTED_TARGETS}
add_definitions():在我这里是添加编译标准
add_definitions(-std=c99)
target_link_libraries():链接库文件
为可执行文件链接库文件
target_link_libraries(node_d &{catkin_LIBRARIES})
(2)、build叫编译环境 (3)、devel叫开发环境 (4)、install是安装环境 2、创建topic 3、添加自定义msg 4、编写launch文件 未完,继续补充中。。。。。
|