(一)colcon指令
# 1. 只编译一个包
colcon build --packages-select YOUR_PKG_NAME
# 2. 允许通过更改src下的部分文件来改变install(重要)
colcon build --symlink-install
(二)topic 指令
#RQT工具之rqt_graph:
ros2 run demo_nodes_py listener
ros2 run demo_nodes_cpp talker
rqt_graph
topic 相关的CLI工具
#1.返回系统中当前活动的所有主题的列表
ros2 topic list
#2.增加消息类型
ros2 topic list -t
#3.打印实时话题内容
ros2 topic echo /chatter
#4.查看主题信息
ros2 topic info /chatter
#5.查看消息类型
ros2 interface show std_msgs/msg/String
#6.手动发布命令
ros2 topic pub /chatter std_msgs/msg/String 'data: "123"'
(三)发布与订阅话题
python版本
发布:
#1.创建一个publish
self.pub_novel = self.create_publisher(String,"sexy_girl",10)
#------------------------非连续代码(功能语句块)------------------------------
#2.发布内容语句块
msg = String()
msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.count,self.count)
self.pub_novel.publish(msg)
订阅:
#1.创建一个subsribe
self.sub_novel = self.create_subscription(UInt32,"sexy_girl_money",self.recv_money_callback,10)
#------------------------非连续代码(功能语句块)------------------------------
#2.编写回调函数逻辑
def recv_money_callback(self,money):
pass
CPP版本
发布:
class SingleNode : public rclcpp::Node
{
private:
rclcpp::Publisher<std_msgs::msg::UInt32>::SharedPtr pub_money;//先声明
public:
SingleNode(string name) : Node(name)
{
pub_money = this->create_publisher<std_msgs::msg::UInt32>("sexy_girl_money",10);//后创建
};
};
//使用以下语句发布内容,根据内容类型执行选择赋值方式
pub_money->publish(sub_money);
订阅:
class SingleNode : public rclcpp::Node
{
private:
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_novel;//先声明
void sub_callback(const std_msgs::msg::String::SharedPtr msg){
//编写回调逻辑
}
public:
SingleNode(string name) : Node(name)
{
sub_novel = this->create_subscription<std_msgs::msg::String>("sexy_girl",10, bind(&SingleNode::sub_callback,this,_1)); //后创建,回调函数用std::bind进行指定,包含变量使用_1,_2占位
};
};
(四)自定义接口
ROS2自定义接口
1.创建接口功能包your_interfaces,在接口功能包下创建msg文件夹并创建Xxx.msg接口文件
话题接口格式:xxx.msg
int64 num
服务接口格式:xxx.srv
int64 a
int64 b
---
int64 sum
动作接口格式:xxx.action
int32 order
---
int32[] sequence
---
int32[] partial_sequence
2.修改接口功能包下Cmakelist.txt如下
find_package(rosidl_default_generators REQUIRED)
#添加消息文件和依赖
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Xxx.msg"
DEPENDENCIES your_dependencies
)
3.修改package.xml
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
ROS2接口常用CLI命令
#查看接口列表(当前环境下)
ros2 interface list
#查看所有接口包
ros2 interface packages
#查看某一个包下的所有接口
ros2 interface package std_msgs
#查看某一个接口详细的内容
ros2 interface show std_msgs/msg/String
#输出某一个接口所有属性
ros2 interface proto sensor_msgs/msg/Image
(五)launch文件
ament-python
创建xxx.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
# 定义函数名称为:generate_launch_description
def generate_launch_description():
# 创建Actions.Node对象li_node,标明李四所在位置
li4_node = Node(
package="village_li",
executable="li4_node"
)
# 创建Actions.Node对象wang2_node,标明王二所在位置
wang2_node = Node(
package="village_wang",
executable="wang2_node"
)
# 创建LaunchDescription对象launch_description,用于描述launch文件
launch_description = LaunchDescription([li4_node,wang2_node])
# 返回让ROS2根据launch描述执行节点
return launch_description
set.py:
from glob import glob
import os
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),#加这句话
],
ament-cmake
创建xxx.launch.py与ament-python方法不变
Cmakelist.txt:
install(DIRECTORY launch
DESTINATION share/${PROJECT_NAME})
将参数加入launch文件
li4_node = Node(
package="village_li",
executable="li4_node",
output='screen', #四个可选项
parameters=[{'write_timer_period': 1}]
)