ubuntu22.04 安装ros操作系统(但这个方法在执行的時候出錯)
官方网站讲解手动安装(这个也是一直不出现opt/ros文件夹)
于是重新创建了一个ubuntu,成功了。。。。我真的不理解。FINE ubuntu22.04安装ROS2 详细教程
ros1的文档
ros2的英文文档
ros2的中文文档 by鱼香ros
动手学ROS2
ros2 run
:运行可执行文件。eg:要运行turtlesim,请打开一个新终端,然后输入以下命令ros2 run turtlesim turtlesim_node
ros2 node list
查找正在运行的节点。
ros2 node info
:与该节点交互的订阅者、发布者、服务和动作 (ROS图连接) 的列表。
eg:ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
重新映射到my_turtle节点上
一个工作空间里面有若干功能包,一个功能包有若干个节点。这个工作空间里面有一个src目录:
mkdir -p ~/code/ros/turtle_ws/src
cd ~/code/ros/turtle_ws/dev_ws/src
功能包的两种获取方式:
sudo apt install ros--package_name
。eg:在我的ubuntu上为:sudo apt install ros-humble-turtlesim
功能包相关指令:
-ros2 create
:创建功能包 。
-ros2 pkg executables [功能包]
:列出所有功能包或者某个功能包的可执行文件。
-res2 pkg list
:列出所有的包。
-ros2 pkg prefix
:列出某个功能包的前缀。
ros pkg xml
:列出包的清单描述文件。功能包的构建工具,编译代码。
mkdir -p turtle_ws/src
、 cd turtle_ws/src
sudo git clone https://github.com/ros2/examples.git src/examples -b humble
cd ..
、sudo colcon build
echo "source ~/Documents/code/turtle_ws/install/setup.bash" >> ~/.bashrc
、~/.bashrc
ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
ros2 run examples_rclcpp_minimal_publisher publisher_member_function
ros2 node list
code ./
打开vscode进行代码编写。ros2 pkg create village_li --build-type ament_python --dependencies rclpy
。如果在创建中,出现如下报错,请将src目录的权限改为可写sudo chmod 777 src
:import rclpy
from rclpy.node import Node
def main(args=None):
"""
ros2运行该节点的入口函数
编写ROS2节点的一般步骤
1. 导入库文件
2. 初始化客户端库
3. 新建节点对象
4. spin循环节点
5. 关闭客户端库
"""
rclpy.init(args=args) # 初始化rclpy
node = Node("li4") # 新建一个节点
node.get_logger().info("大家好,我是作家li4.")
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
rclpy.shutdown() # 关闭rclpy
entry_points={
'console_scripts': [
"li4_pop_node = village_li.li4_pop:main"
],
},
sudo colcon build
,source install/setup.bash
,ros2 run village_li li4_pop_node
,ros2 node list
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
class WriterNode(Node):
"""
创建一个作家节点,并在初始化时输出一个话
"""
def __init__(self,name):
super().__init__(name)
self.get_logger().info("大家好,我是%s,我是一名作家!" % name)
def main(args=None):
"""
ros2运行该节点的入口函数
1. 导入库文件
2. 初始化客户端库
3. 新建节点
4. spin循环节点
5. 关闭客户端库
"""
rclpy.init(args=args) # 初始化rclpy
node = WriterNode("li4") # 新建一个节点
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
rclpy.shutdown() # 关闭rclpy
entry_points={
'console_scripts': [
"li4_oop_node = village_li.li4_oop:main"
],
},
sudo colcon build
,source install/setup.bash
,ros2 run village_li li4_oop_node
,ros2 node list
ros2 pkg create village_wang --build-type ament_cmake --dependencies rclcpp
#include "rclcpp/rclcpp.hpp"
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
/*产生一个Wang2的节点*/
auto node = std::make_shared<rclcpp::Node>("wang2");
// 打印一句自我介绍
RCLCPP_INFO(node->get_logger(), "大家好,我是单身狗wang2.");
/* 运行节点,并检测退出信号*/
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
//添加这两行代码的目的是让编译器编译wang2.cpp这个文件,不然不会主动编译。
add_executable(wang2_node src/wang2.cpp)
ament_target_dependencies(wang2_node rclcpp)
//需要手动将编译好的文件安装到install/village_wang/lib/village_wang下
install(TARGETS
wang2_node
DESTINATION lib/${PROJECT_NAME}
)
sudo colcon build
,source install/setup.bash
,ros2 run village_wang wang2_node
,ros2 node list
#include "rclcpp/rclcpp.hpp"
/*
创建一个类节点,名字叫做SingleDogNode,继承自Node.
*/
class SingleDogNode : public rclcpp::Node
{
public:
// 构造函数,有一个参数为节点名称
SingleDogNode(std::string name) : Node(name)
{
// 打印一句自我介绍
RCLCPP_INFO(this->get_logger(), "大家好,我是单身狗%s.",name.c_str());
}
private:
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
/*产生一个Wang2的节点*/
auto node = std::make_shared<SingleDogNode>("wang2");
/* 运行节点,并检测退出信号*/
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
可以通过命令来看到节点和节点之间的数据关系的。
ros2 run demo_nodes_py listener
ros2 run demo_nodes_cpp talker
rqt_graph
ros2 topic -h
:topic帮助命令ros2 topic list
:返回系统中当前活动的所有主题的列表ros2 topic list -t
:增加消息类型ros2 topic echo /<话题名>
:打印实时话题内容ros2 topic info /<话题名>
:查看主题信息ros2 interface show <某个话题的type名>
:查看消息类型ros2 topic pub /<话题名> <话题的type名> 'data: "xxx"'
:手动发布命令ros2 pkg create py_pubsub --build-type ament_python --dependencies rclpy
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class WriterNode(Node):
def __init__(self,name):
super().__init__(name)
self.name=name
self.get_logger().info("I am a publisher, my name is %s"%name)
self.publisher=self.create_publisher(String,"TOPIC",10)
self.i=0
self.timer_period=5
self.timer=self.create_timer(self.timer_period,self.time_callback)
def time_callback(self):
msg=String()
container="qwertyuiopasdfghjklzxcvbnm-=[];',./"
msg.data=f"{container[self.i%34]}"
self.get_logger().info(f"This is my {self.i} times publish the message for you. And please save the message below:{msg.data}")
self.publisher.publish(msg)
self.i+=1
def main(args=None):
rclpy.init(args=args)
node=WriterNode("wjy")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
# 鱼香ROS的代码
# import rclpy
# from rclpy.node import Node
# """
# 导入消息类型
# 声明并创建发布者
# 编写发布逻辑发布数据
# """
# from std_msgs.msg import String
# class WriterNode(Node):
# """
# 创建一个李四节点,并在初始化时输出一个话
# """
# def __init__(self,name):
# super().__init__(name)
# self.get_logger().info("大家好,我是%s,我是一名作家!" % name)
# # 2.创建并初始化发布者成员属性pubnovel
# self.pub_novel = self.create_publisher(String,"sexy_girl", 10)
# #create_publisher has 3 params:method type,topic name,message length
# # use this cli to see all the message type in std_msg : ros2 interface package std_msgs
# # use this cli to see all the message type in ros2 : ros2 interface list
# #3. 编写发布逻辑
# # 创建定时器成员属性timer
# self.i = 0 # i 是个计数器,用来算章节编号的
# timer_period = 5 #每5s写一章节话
# self.timer = self.create_timer(timer_period, self.timer_callback) #启动一个定时装置,每 timer_period s,调用一次time_callback函数
# def timer_callback(self):
# """
# 定时器回调函数
# """
# msg = String()
# msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)
# self.pub_novel.publish(msg) #将小说内容发布出去
# self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.data) #打印一下发布的数据,供我们看
# self.i += 1 #章节编号+1
# def main(args=None):
# """
# ros2运行该节点的入口函数
# 1. 导入库文件
# 2. 初始化客户端库
# 3. 新建节点
# 4. spin循环节点
# 5. 关闭客户端库
# """
# rclpy.init(args=args) # 初始化rclpy
# node = WriterNode("publisher") # 新建一个节点
# rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
# rclpy.shutdown() # 关闭rclpy
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class ReceiveNode(Node):
def __init__(self,name):
super().__init__(name)
self.get_logger().info(f"Hi, i am a subscriber, my name is {name}.")
self.subscription=self.create_subscription(String,"TOPIC",self.listener_callback,10)
# self.subscription #prevent unused variable warning
def listener_callback(self,msg):
print(msg)
self.get_logger().info(f"I have already receive the message:{msg.data}")
def main(args=None):
rclpy.init(args=args)
node=ReceiveNode("Larissa")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
# 导入话题消息类型
from std_msgs.msg import String,UInt32
class WriterNode(Node):
"""
创建一个李四节点,并在初始化时输出一个话
"""
def __init__(self,name):
super().__init__(name)
self.get_logger().info("大家好,我是%s,我是一名作家!" % name)
# 创建并初始化发布者成员属性pubnovel
self.pubnovel = self.create_publisher(String,"sexy_girl", 10)
# 创建定时器成员属性timer
self.i = 0 # i 是个计数器,用来算章节编号的
timer_period = 5 #每5s写一章节话
self.timer = self.create_timer(timer_period, self.timer_callback) #启动一个定时装置,每 1 s,调用一次time_callback函数
# 账户钱的数量
self.account = 80
# 创建并初始化订阅者成员属性submoney
self.submoney = self.create_subscription(UInt32,"sexy_girl_money",self.recv_money_callback,10)
def timer_callback(self):
"""
定时器回调函数
"""
msg = String()
msg.data = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)
self.pubnovel.publish(msg) #将小说内容发布出去
self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.data) #打印一下发布的数据,供我们看
self.i += 1 #章节编号+1
def recv_money_callback(self,money):
"""
4. 编写订阅回调处理逻辑
"""
self.account += money.data
self.get_logger().info('李四:我已经收到了%d的稿费' % self.account)
def main(args=None):
"""
ros2运行该节点的入口函数,可配置函数名称
"""
rclpy.init(args=args) # 初始化rclpy
node = WriterNode("li4") # 新建一个节点
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
rclpy.shutdown() # rcl关闭
entry_points={
'console_scripts': [
"publisher_node=py_pubsub.publisher:main",
"subscriber_node=py_pubsub.subscriber:main",
"mergepubsub_node=py_pubsub.mergepubsub:main",
],
},