ROS进阶学习手记 5 -- 使用Eclipse开发robot_cleaner

本文档详细介绍了如何使用Eclipse进行ROS的robot_cleaner包开发,包括创建package,生成Eclipse项目文件,编写cpp源文件,编辑Catkin MakeLists文件,并进行编译、运行和调试executables。内容中还提到了练习,如让turtle画圆和走到特定位置。

接上一节,

=======  开始用Eclipse写一个发布给Turtlesim_node驱动和角度Msg的 my_node1 =====

参考Youtube上两个视频:

       [CS460] ROS Tutorial 4.1 Turtlesim Cleaner Application - An Overview

       [CS460] ROS Tutorial 4.2 Moving in a Straight Line (Turtlesim Cleaner)

我们来在Eclipse里写这个node的代码。


2015年7月21日09:59:26

建立一个名为robot_cleaner的Package,生成robot_cleaner_node,向turtlesim_node发送msg.
topic info:
    topic_name:    /turtle1/cmd_vel
    topic_type:    geometry_msgs/Twist
Message info:

    $ rosmsg show geometry_msgs/Twist

    show the data struct:
            geometry_msgs/Vector3 linear
              float64 x
              float64 y
              float64 z
            geometry_msgs/Vector3 angular
              float64 x
              float64 y
              float64 z

$ rostopic echo /turtle1/cmd_vel

得到:

  linear: 
    x: 0.0
    y: 0.0
    z: 0.0
  angular: 
    x: 0.0
    y: 0.0
    z: 2.0

Package Dependency:
              roscpp
              rospy
              std_msgs
              geometry_msgs
              message_generation
===============

1. Create the Package:

    $ cd ~/catkin_ws/src/
    $ catkin_create_pkg robot_cleaner     roscpp rospy std_msgs geometry_msgs message_generation

2. Generate the Eclipse Files for dev. in Eclipse IDE

    $ cd ~/catkin_ws    //这实际上是Workspace的路径,catkin_ws = catkin workspace
    $ catkin_make --force-cmake -G"Eclipse CDT4 - Unix Makefiles"
    $ . ~/catkin_ws/devel/setup.bash


    to generate the .project file and then run:

    $ awk -f $(rospack find mk)/eclipse.awk build/.project > build/.project_with_env && mv build/.project_with_env build/.project

   此时刷新Eclipse里的Project Explorer,可以看到“robot_cleaner”这个项目。
  【问题】: 为何要在Terminal里建立Package再生成Eclipse File,不能直接在Eclipse里创建Package么?怎么创建?

3. 在Eclipse里创建cpp源文件

   Project@Build -> [Source directory] -> robot_cleaner ->src ->单击鼠标右键-> new ->file ->File name:robot_cleaner.cpp
   [如图片]:
    
   

4. 编辑cpp源文件

  

/* File: robot_cleaner.cpp
 * source file
 * auther : sonic
 * 
 */

#include "ros/ros.h"
#include "geometry_msgs/Twist.h"

ros::Publisher velocity_publisher;  //Declare a ros Publisher: velocity_publisher

//Declare the method to move the robot straight
void move(double speed, double distance, bool isForward);

int main(int argc, char **argv){
  //Initiate new ROS node named "talker"
  ros::init(argc, argv, "robot_cleaner");
  ros::NodeHandle n;
  ROS_INFO("Your robot cleaner node starts!");  //打印,用于调试。
  velocity_publisher = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);  //initiate the ros publisher 
  move(2.0, 5.0, 1);

}

//Definition of the method move()
void move(double speed, double distance, bool isForward){
	geometry_msgs::Twist vel_msg;
	//distance = speed * time
	
	//set a random linear velocity in the x-axis
	if (isForward)
		vel_msg.linear.x = abs(speed);
	else
		vel_msg.linear.x = -abs(speed);
	
	vel_msg.linear.y = 0;
	vel_msg.linear.z = 0;
	
	//set a random angular velocity in the y-axis
	vel_msg.angular.x = 0;
	vel_msg.angular.y = 0;
	vel_msg.angular.z = 0;

	//t0: the current time
	double t0 = ros::Time::now().toSec();
	double current_distance = 0;
	ros::Rate loop_rate(10);
	do{
		velocity_publisher.publish(vel_msg);
		double t1 = ros::Time::now().toSec();
		current_distance = speed * (t1 - t0);
		ros::spinOnce();
		loop_rate.sleep();
	}while (current_distance < distance);
	vel_msg.linear.x = 0; //stop it
	velocity_publisher.publish(vel_msg);
	//loop
	//publish the velocity
	//estimate the distance = speed *(t1-t0)
	//current_distance_moved_by_robot <= distance

	
}
 

5. 修改Catkin Make List文件

    文件: CMakelists.txt

    加入如下代码:

   add_executable(robot_cleaner_node src/robot_cleaner.cpp)    #specify which cpp should be compile and create the execute
   target_link_libraries(robot_cleaner_node ${catkin_LIBRARIES})
   add_dependencies(robot_cleaner_node robot_cleaner_gencpp)

   

6. 编译、运行和调试你的executables

    Eclipse -> Project -> Build Project...

7. 运行和调试你的executables

    先来看看能不能动哈:

    $ rosrun turtlesim turtlesim_node

    $ rosrun robot_cleaner robot_cleaner_node
    我们看到robot_cleaner_node 打印出:“The robot cleaner node starts!”, 并且乌龟向右移动了。
   


   OK, 至此,我们就完成了一个可以发布geometry_msg的node.

练习1:让turtle画个圆,如何?
练习2:让turtle走到pose = 特定位置的点,怎么弄?(涉及到从turtlesim_node接收topic="/turtle1/pose"的信息,并实时规划linear.x 和 angular.z 的值)

欢迎通过评论提交各位的代码~ :)


<think>嗯,用户现在的问题是关于ROS2中的`ros2 run controller_manager ros2_control_node`命令为什么不包含.yaml配置文件,以及如何正确加载这些配置。首先,我需要回顾之前的对话,用户之前询问的是命令行中的反斜杠作用,现在转向配置文件的加载,这可能涉及到ROS2的参数管理机制。 用户提到参考了站内引用中的内容,其中提到通过YAML文件加载参数到ROS参数服务器,但当前的命令中并没有使用到。用户可能想知道为什么没有直接导入YAML文件,是否有其他方法替代,比如使用`--ros-args`参数,或者是否有其他方式正确加载这些配置。 首先,我需要确认ROS2中参数传递的方式。ROS2的参数可以通过命令行、YAML文件、或者代码中动态设置。在之前的回答中,提到过使用`--ros-args`来传递参数,例如`-p`选项。但用户现在的问题是为什么在示例中没有使用YAML文件,而是可能通过其他方式加载。 可能需要解释`ros2 run`命令本身并不直接支持加载YAML文件,而是需要结合其他工具或参数。例如,`ros2 launch`命令更常用于加载复杂的配置,包括YAML文件。而`ros2 run`通常用于直接运行节点,参数需要通过命令行传递。 另外,用户可能想知道如何在`ros2 run`命令中加载YAML文件。根据ROS2的文档,可以使用`--params-file`参数来指定YAML文件,例如`--ros-args --params-file my_config.yaml`。这可能是在`ros2 run`中加载YAML文件的方法。 但是,用户提供的原始命令示例中并没有包含这个参数,因此需要解释为什么没有包含,以及可能的替代方法。例如,可能在某些情况下,参数直接通过命令行传递更为方便,或者YAML文件被其他方式加载,比如通过launch文件。 此外,需要说明`controller_manager`节点的作用,它可能需要在启动时加载控制器的配置参数,这些参数通常存储在YAML文件中,并通过`ros2 launch`来加载。如果用户使用`ros2 run`,可能需要手动指定每个参数,或者使用`--params-file`来加载整个配置文件。 还需要注意,用户可能混淆了ROS1和ROS2中的参数加载方式,因为在ROS1中,`rosparam load`命令可以直接加载YAML文件,但在ROS2中,参数需要在节点启动时指定,或者通过launch文件加载。 最后,需要确保回答中引用了之前提到的引用[^1],即关于参数加载到ROS参数服务器的方法,并说明如何在ROS2中应用这些方法,可能结合`--params-file`参数来实现。</think>### ROS2 节点运行与 YAML 配置文件加载详解 在 ROS2 中,`ros2 run controller_manager ros2_control_node` 命令未直接包含 YAML 配置文件的原因是 **ROS2 参数传递机制与 ROS1 存在差异**,且节点启动方式需显式指定参数来源。以下从场景特性、参数加载方式及实际操作方法进行详细说明: --- ### 一、为何示例命令未包含 YAML 文件? #### 1. **`ros2 run` 的定位差异** - `ros2 run` 主要用于快速启动单个节点,其参数通常通过命令行直接传递(如 `-p` 参数),而非依赖外部配置文件。 - 复杂配置(如控制器参数)更推荐通过 `ros2 launch` 或 `--params-file` 加载 YAML 文件,以提升可维护性[^1]。 #### 2. **`controller_manager` 的初始化依赖** `ros2_control_node` 的核心功能是加载硬件接口和控制器,其关键参数 `--robot-description` 通常直接指定 URDF 路径(而非通过 YAML),而控制器配置参数需通过 ROS 参数服务器动态加载(如引用中的 YAML 配置)[^2]。 --- ### 二、如何通过 `ros2 run` 加载 YAML 配置文件? #### 1. **使用 `--params-file` 参数** 在命令中通过 `--ros-args` 指定 YAML 配置文件路径: ```bash ros2 run controller_manager ros2_control_node \ --robot-description /path/to/robot.urdf \ --ros-args --params-file /path/to/controller_config.yaml ``` **YAML 文件示例**(参考引用内容调整): ```yaml controller_manager: ros__parameters: my_robot: joint_state_controller: type: joint_state_controller/JointStateController publish_rate: 50 position_trajectory_controller: type: position_controllers/JointTrajectoryController joints: ["joint1", "joint2"] constraints: goal_time: 5.0 joint1: {trajectory: 0.60, goal: 0.15} joint2: {trajectory: 0.60, goal: 0.15} ``` #### 2. **参数优先级规则** - 若同时使用 `--params-file` 和命令行 `-p` 参数,命令行参数会覆盖 YAML 文件中的同名参数。 - 示例:覆盖 YAML 中的 `publish_rate`: ```bash ros2 run controller_manager ros2_control_node \ --robot-description /path/to/robot.urdf \ --ros-args --params-file controller_config.yaml -p my_robot.joint_state_controller.publish_rate:=100 ``` --- ### 三、替代方案:`ros2 launch` 集成 YAML 配置 对于复杂系统,推荐使用 launch 文件统一管理节点和参数: ```python from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package="controller_manager", executable="ros2_control_node", parameters=[ "/path/to/robot.urdf", {"robot_description": "/path/to/robot.urdf"}, "/path/to/controller_config.yaml" # 直接加载 YAML ], arguments=["--ros-args --log-level INFO"] ) ]) ``` --- ### 四、关键注意事项 1. **YAML 文件命名空间对齐** 需确保 YAML 中的参数层级与节点期望的命名空间一致。例如,若节点命名空间为 `/my_robot`,则 YAML 中的参数应包含对应前缀。 2. **参数动态重加载** ROS2 支持通过 `rqt_reconfigure` 或服务调用动态修改参数,但部分控制器参数需重启节点才能生效[^1]。 3. **URDF 与控制器配置分离** URDF 描述机器人物理结构,而控制器配置(如 PID 参数、关节约束)通过 YAML 文件独立管理,二者通过 ROS 参数服务器关联。 --- ### 五、关联技术点 1. **ROS2 参数类型验证** YAML 文件中的参数需与节点声明的类型(如 `double`、`string[]`)严格匹配,否则加载会失败[^2]。 2. **控制器生命周期管理** 加载控制器配置后,需通过 `controller_manager` 服务接口激活控制器: ```bash ros2 service call /controller_manager/load_controller controller_manager_msgs/srv/LoadController "{name: 'position_trajectory_controller'}" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值