ROS中不同情况下配置文件的编写

这篇具有很好参考价值的文章主要介绍了ROS中不同情况下配置文件的编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

话题中自定义msg

1. 编写msg

在功能包(如plumbing_pub_sub)下创建msg目录,然后在msg目录中创建.msg文件,例如:Test.msg,内容:

float32[] data
float32 vel
geometry_msgs/Pose pose
string name

2. 编辑package.xml

package.xml中添加编译时依赖(message_generation)与执行时依赖(message_runtime)

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

3. 编辑CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
  geometry_msgs
)
#上面的msg文件中用到了geometry_msgs/Pose类型,那么必须查找geometry_msgs
# 配置 msg 源文件
add_message_files(
  FILES
  Test.msg
)
# 生成消息时依赖于 std_msgs和geometry_msgs
# generate_messages必须在catkin_package前面
generate_messages(
  DEPENDENCIES
  std_msgs
  geometry_msgs
)
#执行时依赖
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs geometry_msgs message_runtime
)

4. 编译

编译之后,在/devel/include/pkg/下就会出现对应的Test.h头文件方便调用。

5. 使用

使用就是正常导入头文件即可。
需要注意的是,如果没有执行步骤4,那么需要在CMakeLists.txt中添加:

#node 是要编译的目标文件, 就是add_executable()中的第一个名字。因此add_dependencies要写在add_executable之后
add_dependencies(node ${PROJECT_NAME}_gencpp)

5. 在其他功能包中调用msg

以下步骤仅在需要调用的包下设置:

5.1 编辑package.xml

维护软件包清单的更新

<build_depend>plumbing_pub_sub</build_depend>
<exec_depend>plumbing_pub_sub</exec_depend>

5.2 编辑CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
  plumbing_pub_sub
)
add_dependencies(current_node plumbing_pub_sub_gencpp)  
#current_node 是当前要编译的目标二进制文件
#add_dependencies要写在add_executable之后

add_dependencies是防止编译当前功能包时plumbing_pub_sub还没有被编译。并不是必须,但是最好加上。

服务中自定义srv

1. 编写srv

在功能包下创建srv目录,然后在msg目录中创建.srv文件,例如:Test.srv,内容:

int32 num1
int32 num2
---
int32 sum

2. 其他

除了在CMakelist.txt中将add_message_files的部分改成add_service_files对应部分:

add_service_files(
  FILES
  Test.srv
)

其他与写msg都相同。

C++调用头文件

1. 编写头文件

编写头文件 a.h, 放入pkg/include/head_dict/a.h
例如: 在功能包plumbing_head下写了hello/hello.h,那么应该放在 plumbing_head/include/hello/hello.h
其中, hello.h内容如下:

#ifndef _HELLO_H   //避免重复定义
#define _HELLO_H
namespace hello_ns{
class MyHello{
public:
    void run();
};
}

#endif

2. (可选,为了编程时有代码提示)

在VSCode中的c_cpp_properties.json文件中添加

"includePath": [,
        "自己的路径/plumbing_head/include/**"
      ]

3. 编写源文件来调用头文件

例如:编写hello.cpp

#include "ros/ros.h"
#include "hello/hello.h"


namespace hello_ns{
    void MyHello::run(){
        ROS_INFO("running ......");
    }
}


int main(int argc, char* argv[]){
    ros::init(argc, argv, "hello_head");
    hello_ns::MyHello myHello;
    myHello.run();

    return 0;
}

4. 编写CMakeLists.txt

include 取消注释

include_directories(
include   #就是将当前包下的include路径加进去
  ${catkin_INCLUDE_DIRS}
)

其他正常:

add_executable(hello src/hello.cpp)
# add_dependencies似乎不是必须
add_dependencies(hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})  
target_link_libraries(hello
  ${catkin_LIBRARIES}
)

C++调用源文件

1 2(与之前相同)

第一步和第二步与之前相同

3. 编写源文件来对头文件实现

例如:编写hello.cpp

#include "ros/ros.h"
#include "hello/hello.h"


namespace hello_ns{
    void MyHello::run(){
        ROS_INFO("running ......");
    }
}

4. 编写源文件来调用实现

例如:编写test_hello.cpp

#include "ros/ros.h"
#include "hello/hello.h"

int main(int argc, char* argv[]){
    ros::init(argc, argv, "hello_head");
    hello_ns::MyHello myHello;
    myHello.run();

    return 0;
}

5. 编写CMakeLists.txt

源文件添加到库中,

include_directories(
  include 			
  ${catkin_INCLUDE_DIRS}
)

add_library(hello_lib
  src/hello.cpp
)
add_executable(test_hello src/test_hello.cpp)
add_dependencies(test_hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries添加所有依赖库

target_link_libraries(test_hello 
  ${catkin_LIBRARIES}
  hello_lib
)

C++功能包之间互调库函数(A包调B包的库函数)

对B包编写CMakeLists.txt

继续用上面例子,catkin_package用于指定该包的一些基本信息,提供头文件和库供其他软件包使用。
catkin_package让其他包在使用 find_package(catkin REQUIRED COMPONENTS ...) 后自动引入你的软件包提供的头文件和库,而不需要显式指定。

catkin_package(
INCLUDE_DIRS include
 LIBRARIES hello_lib
)

include_directories(
  include 			
  ${catkin_INCLUDE_DIRS}
)

add_library(hello_lib
  src/hello.cpp
)

INCLUDE_DIRS include是将自己的INCLUDE_DIRS指定为的include的绝对路径,LIBRARIES hello_lib就是将自己的hello_lib加入到该包的库中。
这样其他包可以使用找到此头文件头文件的实现

对A包编写package.xml

<build_depend>B_PKG_NAME</build_depend>
<exec_depend>B_PKG_NAME</exec_depend>

对A包编写CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
  B_PKG_NAME
)

CMake可以使用message来查看一些信息

message(STATUS "B_PKG_NAMEd_LIBRARIES = ${B_PKG_NAME_INCLUDE_DIRS}")
message(STATUS "B_PKG_NAME_LIBRARIES = ${B_PKG_NAME_INCLUDE_DIRS}")

Python引入(import)其他模块(功能包内部、功能包之间)

1.原理

假设

假设我们的python文件都放在workspace/src/pkg1_name/scripts/下,例如我们写了如下的内容:

  • 一个功能模块:tools.py
  • 一个运行文件:run.py
  • 一个带有py文件的目录:arg/arg_tool.py

我们依赖情况是run.py依赖于tools.pyarg/arg_tool.py
即我们的run.py中有如下内容:

import tools
import arg.arg_tool

问题

我们知道当我们执行rosrun的时候,是工作空间的根目录下,所以我们run.py需要找到tools.pyarg的路径才行,为此往上主要有两者方法:

  • 第一种是在run.py中加入这些模块所在的目录。
  • 第二种是根据官网教程写setup.py

这两种方法都是可以的,但是第一种的问题就是过于繁琐,如果我们需要在功能包之间互相引入模块,就需要在run.py开头加入很多路径。第二种的问题是通过那种cmake生成的tools.py在VsCode中写代码时无法提示

思路

我们可以参考消息message的引用:
当我们自定义了例如workspace/src/pkg2_name/msg/Test.msg这样的message进行编译之后,我们可以在任何py文件中使用from pkg2_name.msg import Test
这是因为编译之后,python相关的可调用模块被放在了workspace/devel/lib/python3/dist-packages/pkg2_name/msg下。
也就是说python会优先在workspace/devel/lib/python3/dist-packages中查找需要的模块。所以我们将tools.pyarg/arg_tool.py也放在这里就好了。

2. 编写CMakeLists.txt

在CMakeLists.txt末尾加入以下内容即可。

set(target_dir ${CATKIN_DEVEL_PREFIX}/lib/python3/dist-packages/${PROJECT_NAME})  # 设置目标目录名称
# 需要的模块python文件
set(files_to_link
    tools.py
    arg/arg_tool.py
)

file(MAKE_DIRECTORY ${target_dir}) #创建目标目录
#建立软链接
foreach(file ${files_to_link})
    get_filename_component(file_dir ${file} DIRECTORY) 
    file(MAKE_DIRECTORY ${target_dir}/${file_dir})
    file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/scripts/${file} ${target_dir}/${file} SYMBOLIC)
endforeach()   

需要修改的就是在这部分加入自己想要添加的python文件。
这里是建立软链接的方式,而不是直接复制。
这是因为这样占用空间较小(仅保存一个路径),而且源py文件改写后,不需要重新编译就可以直接使用。

set(files_to_link
    tools.py
    arg/arg_tool.py
)

3. 编译和改写python代码

最后编译一遍,然后就可以在任意功能包引入刚刚导入的文件了。
需要注意的是直接使用以下代码是不行的:

import tools
import arg.arg_tool

这是因为在workspace/devel/lib/python3/dist-packages下创建的是pkg1_name目录,因此这部分代码要改为:

from pkg1_name import tools
from pkg1_name.arg import arg_tool

4. 最后

编译之后,在任何功能包下就都可以调用刚刚加入的模块了。

当然,如果想使用:

import tools
import arg.arg_tool

也是可以的,只是需要在CMakeLists.txt中略微修改即可,具体怎么改,莫非就是将建立软链接的地方修改一下。文章来源地址https://www.toymoban.com/news/detail-849952.html

到了这里,关于ROS中不同情况下配置文件的编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器人开发环境配置(双系统(Ubuntu)安装、ROS安装、VScode环境配置)

    目录 /安装经历分享以及给电脑为天选4的可避坑操作/ 一.双系统Ubuntu安装(20.04) 1.查看引导模式 2.下载Ubuntu的安装映像文件 3.开始制作安装盘 4.关闭BitLocker! 5.关闭独显直连(若有用到独立显卡) 6.压缩Windows分区 7.关闭Secure Boot 二.ROS安装(Noetic) 1.ros官方安装步骤 2.设置安

    2024年04月25日
    浏览(39)
  • UR5机器人+ROS+Ubuntu 18.04 配置方法

    UR机械臂版本 驱动选择 version≤3.9 ur_modern_driver version≥3.9 ur_robot_driver 这里机器人开机示教器会显示版本,我的机器人版本号是3.15.3 1.将Fixed Frame坐标系改为base 2.需要在Add选项中找到上面两个模块(motionPlanning 和 robotModel) 1.1在实体UR机器人端安装 externalcontrol-1.0.5.urcap 操作如

    2023年04月08日
    浏览(95)
  • 4.1底盘基础功能:nmcli命令配置机器人无线网 Xshell中进行(冰达ros机器人例程运行)

    4.1.3nmcli命令配置机器人无线网 Xshell中进行(Xshell此软件安装包在3.windows实用软件当中下载)注:如果没有办法使用直接百度上搜索Xshell官网下载最新版本 配置无线网络视频教程首先准备一台路由器和网线 如下图所示连接小车(注:路由器可以没有互联网) 连上小车后需等

    2024年04月25日
    浏览(49)
  • Handsfree_ros_imu:ROS机器人IMU模块的hfi_a9.py文件学习记录

    之前的博客写了关于Handsfree_ros_imu:ROS机器人IMU模块ARHS姿态传感器(A9)Liunx系统Ubuntu20.04学习启动和运行教程: https://blog.csdn.net/qq_54900679/article/details/135539176?spm=1001.2014.3001.5502 与Handsfree_ros_imu:ROS机器人IMU模块的get_imu_rpy.py文件学习记录: https://blog.csdn.net/qq_54900679/article/det

    2024年01月22日
    浏览(44)
  • ros2机器人urdf内<gazebo>标签解释(非传感器)(源自sdf文件官网)

    原文链接SDFormat extensions to URDF (the \\\'gazebo\\\' tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了: Toggle navigation  Specification API Documentation Download Back Edit                  Version: 1.6            Table of Contents SDFormat extensions to URDF (the gazebo tag) gazebo Element

    2024年02月01日
    浏览(47)
  • xacro机器人模型文件转urdf文件怎么编写launch文件启动gazebo仿真和在rviz2内显示模型

    urdf文件很直白,每个零件的/link  /joint都要编写一遍,每个零件数据都要自己算出来结果,很麻烦,但是用起来很简单。xacro写的模型文件可以把好多常量提前定义出来,不同大小的机器人只要只要改一下常量,机器人模型就可以重新生成,代码可以复用,编写起来简单多了

    2024年02月12日
    浏览(39)
  • ROS的机器人协议:实现机器人之间的有效通信

    作者:禅与计算机程序设计艺术 ROS(Robot Operating System)是一个开源的机器人操作系统,其功能主要包括以下几个方面: 消息传递:ROS通过消息传递的方式进行通信,各个节点之间可以通过发布、订阅等方式互相通讯。 资源管理:ROS可以对进程、线程、资源进行管理,使得不

    2024年02月06日
    浏览(42)
  • ROS机器人实战,对标古月老师HRMRP机器人(一)——机器人总体方案设计

    咳咳!这个是自己的毕业设计,内容比较多就拆开发。设计实现了一款SLAM移动机器人,加机械臂完成视觉识别抓取的,同时还有语音识别控制、QT上位机控制、Web网页控制。前几年看古月老师的视频,看到古月老师设计的HRMRP(混合实时移动机器人平台),就也来对标一下!

    2024年04月28日
    浏览(35)
  • ROS实现机器人移动

    使用是github上六合机器人工坊的项目。 https://github.com/6-robot/wpr_simulation.git 运动模型如下所示:👇   机器人运动的消息包: 实现思路:👇   为什么要使用/cmd_vel话题。因为这个是约定俗成的,项目中订阅的就是这个话题,否则无法订阅到主题或者更改项目的订阅者的源码

    2024年02月14日
    浏览(44)
  • ROS:机器人系统仿真

    通过计算机对实体机器人系统进行模拟的技术,在 ROS 中,仿真实现涉及的内容主要有三:对机器人建模(URDF)、创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现。 仿真在机器人系统研发过程中占有举足轻重的地位,在研发与测试中较之于实体机器人实现,仿真有如下几点的

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包