博客中大量介绍了将Ubuntu等Linux系统借助机器人操作系统ROS实现机器人控制设计开发和物联网功能案例,并可基于OpenAI等实现人工智能相关训练。
这篇博文围绕windows系统展开,之前也写过一些类似的文章,为何现在又写一遍呢?
之前的方法过程繁琐,现在windows系统安装ROS简单易行,效果非常好,并且之前课程中在Linux下所有案例无需移植修改代码直接可以在windows使用!
以前Windos系统安装ROS效果是这样的:
在Windows系统安装ROS机器人操作系统
现在是这样的!!!如下图所示:
ROS 1 Melodic
ROS 2 Eloquent
ROS 2 Foxy
嗯,这只是安装过程的截图,和正常安装windows应用程序一样啦,那么使用过程还没有完善到双击图标或单击APP的那种程度,但几乎和在Linux一样简单易用。
我在2020年ROS暑期学校直播中有两个课程分享,分别如下:
- 原创 ROS机器人TF基础(坐标相关概念和实践)
- 原创 ROS机器人URDF建模
- 还有一篇由于时间关系没有更新到博客中
这些课程是全云端环境的,具体如下:
一个网页学习机器人操作系统ROS2-1
一个网页学习机器人操作系统ROS2-2
一个网页学习机器人操作系统ROS2-3
一个网页学习机器人操作系统ROS2-4
现在来补充一下在windows跑这些案例的例子,就用刚才装好了ROS1Melodic和ROS2Foxy试一下。
先看一下默认包有哪些?使用ros2 pkg list
C:\ros_ws\mobot>ros2 pkg list action_msgs action_tutorials_cpp action_tutorials_interfaces action_tutorials_py actionlib_msgs ament_clang_format ament_clang_tidy ament_cmake ament_cmake_auto ament_cmake_clang_format ament_cmake_clang_tidy ament_cmake_copyright ament_cmake_core ament_cmake_cppcheck ament_cmake_cpplint ament_cmake_export_definitions ament_cmake_export_dependencies ament_cmake_export_include_directories ament_cmake_export_interfaces ament_cmake_export_libraries ament_cmake_export_link_flags ament_cmake_export_targets ament_cmake_flake8 ament_cmake_gmock ament_cmake_gtest ament_cmake_include_directories ament_cmake_libraries ament_cmake_lint_cmake ament_cmake_mypy ament_cmake_nose ament_cmake_pclint ament_cmake_pep257 ament_cmake_pycodestyle ament_cmake_pyflakes ament_cmake_pytest ament_cmake_python ament_cmake_ros ament_cmake_target_dependencies ament_cmake_test ament_cmake_uncrustify ament_cmake_version ament_cmake_xmllint ament_copyright ament_cppcheck ament_cpplint ament_flake8 ament_index_cpp ament_index_python ament_lint ament_lint_auto ament_lint_cmake ament_lint_common ament_mypy ament_package ament_pclint ament_pep257 ament_pycodestyle ament_pyflakes ament_uncrustify ament_xmllint angles behaviortree_cpp_v3 builtin_interfaces camera_calibration_parsers camera_info_manager cartographer_ros cartographer_ros_msgs class_loader common_interfaces composition composition_interfaces connext_cmake_module console_bridge_vendor control_msgs controller_interface controller_manager costmap_queue cv_bridge demo_nodes_cpp demo_nodes_cpp_native demo_nodes_py depthimage_to_laserscan diagnostic_msgs diff_drive_controller domain_coordinator dummy_map_server dummy_robot_bringup dummy_sensors dwb_core dwb_critics dwb_msgs dwb_plugins effort_controllers eigen3_cmake_module eigen_stl_containers example_interfaces examples_rclcpp_minimal_action_client examples_rclcpp_minimal_action_server examples_rclcpp_minimal_client examples_rclcpp_minimal_composition examples_rclcpp_minimal_publisher examples_rclcpp_minimal_service examples_rclcpp_minimal_subscriber examples_rclcpp_minimal_timer examples_rclcpp_multithreaded_executor examples_rclpy_executors examples_rclpy_minimal_action_client examples_rclpy_minimal_action_server examples_rclpy_minimal_client examples_rclpy_minimal_publisher examples_rclpy_minimal_service examples_rclpy_minimal_subscriber examples_tf2_py fake_joint_driver fastrtps_cmake_module forward_command_controller gazebo_dev gazebo_msgs gazebo_plugins gazebo_ros gazebo_ros_pkgs geometric_shapes geometry2 geometry_msgs hardware_interface image_common image_geometry image_tools image_transport interactive_markers intra_process_demo joint_state_controller joint_state_publisher joint_state_publisher_gui joint_trajectory_controller joy joy_linux joy_teleop kdl_parser key_teleop laser_geometry launch launch_ros launch_testing launch_testing_ament_cmake launch_testing_ros launch_xml launch_yaml libcurl_vendor libstatistics_collector libyaml_vendor lifecycle lifecycle_msgs logging_demo map_msgs message_filters mimick_vendor mobot mobot_follow mouse_teleop move_base_msgs moveit_common moveit_core moveit_fake_controller_manager moveit_kinematics moveit_msgs moveit_planners_ompl moveit_resources moveit_resources_fanuc_description moveit_resources_fanuc_moveit_config moveit_resources_panda_description moveit_resources_panda_moveit_config moveit_resources_pr2_description moveit_ros_benchmarks moveit_ros_move_group moveit_ros_occupancy_map_monitor moveit_ros_planning moveit_ros_planning_interface moveit_ros_robot_interaction moveit_ros_visualization moveit_simple_controller_manager nav2_amcl nav2_behavior_tree nav2_bringup nav2_bt_navigator nav2_common nav2_controller nav2_core nav2_costmap_2d nav2_dwb_controller nav2_gazebo_spawner nav2_lifecycle_manager nav2_map_server nav2_msgs nav2_navfn_planner nav2_planner nav2_recoveries nav2_rviz_plugins nav2_system_tests nav2_util nav2_voxel_grid nav2_waypoint_follower nav_2d_msgs nav_2d_utils nav_msgs navigation2 object_recognition_msgs octomap_msgs opencv_tests osrf_pycommon pcl_conversions pcl_msgs pendulum_msgs perception_pcl pluginlib position_controllers python_cmake_module python_qt_binding qt_dotgraph qt_gui qt_gui_app qt_gui_core qt_gui_cpp qt_gui_py_common quality_of_service_demo_cpp quality_of_service_demo_py random_numbers rcl rcl_action rcl_interfaces rcl_lifecycle rcl_logging_log4cxx rcl_logging_noop rcl_logging_spdlog rcl_yaml_param_parser rclcpp rclcpp_action rclcpp_components rclcpp_lifecycle rclpy rcpputils rcutils realtime_tools resource_retriever rmw rmw_connext_cpp rmw_connext_shared_cpp rmw_cyclonedds_cpp rmw_dds_common rmw_fastrtps_cpp rmw_fastrtps_dynamic_cpp rmw_fastrtps_shared_cpp rmw_implementation rmw_implementation_cmake robot_state_publisher ros2_control ros2_controllers ros2action ros2bag ros2cli ros2component ros2doctor ros2interface ros2launch ros2lifecycle ros2lifecycle_test_fixtures ros2multicast ros2node ros2param ros2pkg ros2run ros2service ros2test ros2topic ros2trace ros_base ros_core ros_environment ros_testing rosbag2 rosbag2_compression rosbag2_converter_default_plugins rosbag2_cpp rosbag2_storage rosbag2_storage_default_plugins rosbag2_test_common rosbag2_tests rosbag2_transport rosgraph_msgs rosidl_adapter rosidl_cmake rosidl_default_generators rosidl_default_runtime rosidl_generator_c rosidl_generator_cpp rosidl_generator_dds_idl rosidl_generator_py rosidl_parser rosidl_runtime_c rosidl_runtime_cpp rosidl_runtime_py rosidl_typesupport_c rosidl_typesupport_connext_c rosidl_typesupport_connext_cpp rosidl_typesupport_cpp rosidl_typesupport_fastrtps_c rosidl_typesupport_fastrtps_cpp rosidl_typesupport_interface rosidl_typesupport_introspection_c rosidl_typesupport_introspection_cpp rpyutils rqt rqt_action rqt_common_plugins rqt_console rqt_graph rqt_gui rqt_gui_cpp rqt_gui_py rqt_image_view rqt_msg rqt_plot rqt_publisher rqt_py_common rqt_py_console rqt_reconfigure rqt_service_caller rqt_shell rqt_srv rqt_top rqt_topic run_move_group run_moveit_cpp rviz2 rviz_assimp_vendor rviz_common rviz_default_plugins rviz_ogre_vendor rviz_rendering rviz_rendering_tests rviz_visual_testing_framework sdl2_vendor sensor_msgs shape_msgs shared_queues_vendor spdlog_vendor sqlite3_vendor srdfdom sros2 sros2_cmake statistics_msgs std_msgs std_srvs stereo_msgs tango_icons_vendor teleop_tools teleop_tools_msgs teleop_twist_joy teleop_twist_keyboard test_interface_files test_launch_ros test_launch_testing test_msgs test_robot_hardware test_tf2 tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools tinyxml2_vendor tinyxml_vendor topic_monitor tracetools tracetools_launch tracetools_read tracetools_test tracetools_trace trajectory_msgs transmission_interface turtlebot3_msgs turtlesim uncrustify_vendor unique_identifier_msgs urdf urdfdom_py velocity_controllers vision_opencv visualization_msgs xacro yaml_cpp_vendor zstd_vendor C:\ros_ws\mobot>
可能显示会出问题,看截图吧:
ros2 pkg list
显示不全。
打开默认测试,一切正常:
ros2 run turtlesim turtlesim_node
测试一下,基本工具:
查看可用节点和启动键盘遥控
遥控小乌龟在环境中运动并触发消息
终端显示提示信息
rqt图形化控制台界面显示提示
这样所有原来在linux可以测试的代码与应用,都可以到windows测试了。
来咱们再来看一个酷炫一些的案例:
#ROS 2 编译
rosdep install --from-paths . --ignore-src -r -y
colcon build
#ROS 2 运行
call install/setup.sh
roslaunch aws_robomaker_racetrack_world view_racetrack.launch
在windows环境下的ros和gazebo
启动的launch文件:
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import ExecuteProcess, DeclareLaunchArgument
from launch.actions import IncludeLaunchDescription
from launch_ros.actions import Node
from launch.conditions import IfCondition
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
# this is the function launch system will look for
def generate_launch_description():
robot_name = 'mobot'
world_file_name = 'racetrack.world'
# full path to urdf and world file
world = os.path.join(get_package_share_directory(robot_name), 'worlds', world_file_name)
urdf = os.path.join(get_package_share_directory(robot_name), 'urdf', 'mobot.urdf')
#urdf1 = os.path.join(get_package_share_directory('mobot'), 'urdf', 'mobot.urdf')
#urdf2 = os.path.join(get_package_share_directory('mobot'), 'urdf', 'mobot.urdf')
# read urdf contents because to spawn an entity in
# gazebo we need to provide entire urdf as string on command line
#small_house = launch.actions.IncludeLaunchDescription(
# launch.launch_description_sources.PythonLaunchDescriptionSource(
# os.path.join(
# get_package_share_directory('aws_robomaker_small_house_world'),
# 'launch',
# 'small_house.launch.py')))
# Spawn mobot1
spawn_mobot = Node(
package='gazebo_ros',
node_executable='spawn_entity.py',
node_name='spawn_entity',
node_namespace='mobot',
output='screen',
#emulate_tty=True,
arguments=['-entity',
'mobot',
'-x', '2.75', '-y', '-15.00', '-z', '0.2',
'-file', urdf
]
)
# Spawn mobot2
#spawn_mobot2 = Node(
# package='gazebo_ros',
# node_executable='spawn_entity.py',
# node_name='spawn_entity',
# node_namespace='mobot2',
# output='screen',
# emulate_tty=True,
# arguments=['-entity',
# 'mobot2',
# '-x', '0.5', '-y', '1.8', '-z', '0.1',
# '-file', urdf
# ]
#)
#xml = open(urdf, 'r').read()
# double quotes need to be with escape sequence
#xml = xml.replace('"', '\\"')
# this is argument format for spwan_entity service
#spwan_args = '{name: \"mobot\", xml: \"' + xml + '\"}'
# create and return launch description object
return LaunchDescription([
# start gazebo, notice we are using libgazebo_ros_factory.so instead of libgazebo_ros_init.so
# That is because only libgazebo_ros_factory.so contains the service call to /spawn_entity
ExecuteProcess(
cmd=['gazebo', '--verbose', world, '-s', 'libgazebo_ros_factory.so'],
output='screen'),
# tell gazebo to spwan your robot in the world by calling service
# ExecuteProcess(
# cmd=['ros2', 'service', 'call', '/spawn_entity', 'gazebo_msgs/SpawnEntity', spwan_args],
# output='screen'),
#small_house,
spawn_mobot,
#spawn_mobot2,
])
如果觉得还是不过瘾,需要玩玩夜景模式,来看一下吧,不清楚能否成功呢???
夜景模式
看看细节效果如何?
赛道--灯光效果
红绿灯效果
等等,感觉跑题了,物联网的部分在哪里???
ESP8266和ESP32完全支持,没有任何问题。
具体参考:
ESP8266和ESP32配置(需使用ROS1和ROS2)
使用内容等有空再补充吧,机器人操作系统ROS1和ROS2已经完全支持windows,macos和linux,并且支持PC和ARM。还在快速发展中。