ros2创建一个工程

第一步:创建src目录

$ mkdir ros2-demo
$ cd ros2-demo/
$ mkdir src
$ cd src/

第二步:创建功能包

cd src$
ros2 pkg create --build-type ament_cmake ros2_demo --dependencies rclcpp std_msgs

ros2 pkg create --build-type ament_python learning_pkg_python # Python
ros2命令中:
pkg:表示功能包相关的功能;
create:表示创建功能包;
build-type:表示新创建的功能包是C++还是Python的,如果使用C++或者C,那这里就跟ament_cmake,如果使用Python,就跟ament_python
package_name:新建功能包的名字。比如在终端中分别创建C++和Python版本的功能包:

第三步:确定功能包

  1. c++/c功能包

  1. 首先看下C++类型的功能包,其中必然存在两个文件:package.xml和CMakerLists.txt。

  1. package.xml文件的主要内容如下,包含功能包的版权描述,和各种依赖的声明。

  1. CMakeLists.txt文件是编译规则,C++代码需要编译才能运行,所以必须要在该文件中设置如何编译,使用CMake语法。

2.python功能包

  1. C++功能包需要将源码编译成可执行文件,但是Python语言是解析型的,不需要编译,所以会有一些不同,但也会有这两个文件:package.xmlsetup.py

  1. package.xml文件的主要内容和C++版本功能包一样,包含功能包的版权描述,和各种依赖的声明。

  1. setup.py文件里边也包含一些版权信息,除此之外,还有“entry_points”配置的程序入口。

第四步:创建节点文件

cd ~/ros2-demo/src/ros2_demo
sudo gedit sub_node.cpp

sub_node.cpp代码具体如下:

#include <chrono>
#include "rclcpp/rclcpp.hpp"
using namespace std::chrono_literals;
/* This example creates a subclass of Node and uses a fancy C++11 lambda
 * function to shorten the timer syntax, at the expense of making the
 * code somewhat more difficult to understand at first glance if you are
 * unaccustomed to C++11 lambda expressions. */
class MinimalTimer : public rclcpp::Node
{
public:
  MinimalTimer()
  : Node("minimal_timer")
  {
    auto timer_callback = [this]() -> void { RCLCPP_INFO(this->get_logger(), "Hello, world!") };
    timer_ = create_wall_timer(500ms, timer_callback);
  }
private:
  rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalTimer>());
  rclcpp::shutdown();
  return 0;
}

第五步:修改CMakeLists.txt和package.xml

  1. 修改CMakeLists.txt;

cd ~/ros2-demo/src/ros2_demo
sudo gedit CMakeLists.txt
  1. find_package(ament_cmake REQUIRED)下面添加

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
  1. 添加可执行文件的名字为ros2_demo

add_executable(ros2_demo src/sub_node.cpp)
ament_target_dependencies(ros2_demo rclcpp std_msgs)
  1. 添加 install(TARGETS…) 把可执行文件安装到install去

install(TARGETS
  ros2_demo
  DESTINATION lib/${PROJECT_NAME})

第六步:编译和运行

  1. 编译节点

cd ~/ros2-demo
colcon build --packages-select ros2_demo
source install/setup.bash
  1. 运行节点

ros2 run ros2_demo sub_node
要在ROS 2创建一个专门处理串口通讯的功能包,您可以按照以下步骤来进行操作。这里我们将一步步指导您完成从创建新工作空间到最后编写及编译代码的过程。 ### 步骤一:创建工作空间与功能包结构 首先确认已安装好ROS 2环境,并选择合适的版本(如Humble)。然后开启终端窗口执行下列命令建立一个新的ROS 2工作区并生成初始目录架构: ```bash mkdir -p ~/ros2_ws/src cd ~/ros2_ws/ ``` 接着利用`ros2 pkg create`工具快速建立起名为`serial_interface`的基础功能包框架,其中包含必要的C++模板文件和其他资源。请注意,在此过程中我们会添加对某些特定依赖的支持,比如用于管理串口设备访问权限的库。 ```bash source /opt/ros/humble/setup.bash # 根据实际安装路径调整 ros2 pkg create --build-type ament_cmake serial_interface \ --dependencies rclcpp std_msgs serial ``` > 注意: 上述命令中的“humble”应替换为您使用的具体ROS 2发行版名称;而`serial`则是指之前提到过的第三方跨平台C++串口库[wjwwood/serial](https://github.com/wjwwood/serial),请确保已在系统环境中成功安装该库及其对应的开发文档。 此时您的项目树应该看起来像这样: ``` ~/ros2_ws/ ├── build ├── install └── src └── serial_interface ├── CMakeLists.txt ├── package.xml ├── resource │   └── serial_interface.urdf ├── setup.cfg ├── test └── src └── main.cpp (自动生成) ``` ### 步骤二:修改功能包描述 编辑位于`package.xml`内的元数据记录有关于本软件包的基本信息——包括作者姓名邮箱、许可证声明等等。同时增加对于额外外部依赖项的需求列表: ```xml <!-- ...其余保持不变... --> <maintainer email="you@example.com">Your Name</maintainer> <!-- Add dependency on the 'serial' library used for handling RS232 ports --> <depend>wjwwood_serial</depend> <exec_depend>rclcpp</exec_depend> <exec_depend>std_msgs</exec_depend> <test_depend>ament_catchall</test_depend> <!-- ...其余保持不变... --> ``` 接下来更新`CMakeLists.txt` 文件以指示编译器找到所需的头文件位置并且链接正确的静态或共享库。这一步非常重要,因为如果没有正确配置的话就无法正常使用第三方API函数! ```cmake # 修改后的部分内容如下所示: find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) find_package(wjwwood_serial REQUIRED COMPONENTS thread) add_executable(serial_node src/main.cpp) ament_target_dependencies(serial_node wjwwood_serial rclcpp std_msgs ) # 确保可以定位到wjwwood/serial.h这样的头部文件 target_include_directories(serial_node PRIVATE ${wjwwood_SERIAL_INCLUDE_DIRS}) target_link_libraries(serial_node ${wjwwood_SERIAL_LIBRARIES}) install(DIRECTORY launch rviz config DESTINATION share/${PROJECT_NAME}/ ) install(TARGETS serial_node EXPORT export_${PROJECT_NAME} RUNTIME DESTINATION lib/${PROJECT_NAME} ) ``` ### 步骤三:实现核心业务逻辑 现在进入最激动人心的部分——编码!在刚才由`ros2 pkg create`自动生成出来的`src/main.cpp`基础上进一步补充具体的交互流程控制代码,使之成为一个完整的应用程序入口点。参考前一个问题的回答内容来设计如何通过串口发送指令以及接收返回结果的相关算法吧~ ### 编译部署验证成果 当所有准备工作完成后就可以开始编译整个工程项目了~只需切换回根级`ros2_ws`目录并在里面输入两条简单的命令即可触发自动化的构建过程: ```bash cd ~/ros2_ws/ colcon build --packages-select serial_interface source ./install/local_setup.bash ``` 最后别忘了启动刚做好的节点测试一下效果呀!看看是否真的能顺利连通指定的硬件外设并与之交换有用的信息咯~
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值