ROS 2 接口参考
通过 ROS 2 话题、服务与参数调用 D1 的控制能力。第一次使用请先完成连接与状态读取。本页不是底层 CAN FD SDK 的接口说明。
实机控制
本页包含会使机器人运动的示例。执行前请核对机器人构型、命名空间和交付版本,并按产品安全说明确认操作条件。只读验证不需要执行运动示例。
ROS2 SDK
D1_sdk_ros2 是基于ROS2开发,将高层逻辑封装成ROS2节点,提供ROS2 API给用户使用,用户通过ROS2 topic 发送指令给机器人,完成机器人控制。
查看ros话题
robot@d1:~$ ros2 topic list
/d13007137/command/cmd_key # 控制指令,状态机切换
/d13007137/command/cmd_pose # 控制指令,位姿
/d13007137/command/cmd_twist # 控制指令,速度
/d13007137/command/joint_command # 控制指令,速度
/d13007137/d1_rl_controller/transition_event
/d13007137/d1h_rl_controller/transition_event
/d13007137/dynamic_joint_states
/d13007137/imu_sensor_broadcaster/imu # imu状态
/d13007137/imu_sensor_broadcaster/transition_event
/d13007137/joint_state_broadcaster/transition_event
/d13007137/joint_states # 关节信息 位置速度力据
/d13007137/joy # 遥控器stick值相关
/d13007137/rl_controller/fsm # rl控制器状态机
/d13007137/rl_controller/joint_command # rl控制器实际输出:kp kd p v t
/d13007137/robot_description
/d13007137/system_status_broadcaster/battery1 # 主机电池信息
/d13007137/system_status_broadcaster/battery2 # 从机电池信息
/d13007137/system_status_broadcaster/dock # 拼接机构状态
/d13007137/system_status_broadcaster/motors_status # 电机状态
/d13007137/system_status_broadcaster/transition_event
/parameter_events
/rosout
/tf
/tf_static
如果没有,将下文添加在~/.bashrc结尾后执行source ~/.bashrc再输入查看ros话题命令
export ROS_LOCALHOST_ONLY=1
export ROS_DOMAIN_ID=42
source /opt/ros/humble/setup.bash
source /opt/d1_ros2/setup.bash
获取四足控制器/双足控制器状态
获取状态
source /opt/d1_ros2/namespace.sh
ros2 service call /$ROBOT_NS/command/get_controller_status std_srvs/srv/Trigger
# requester: making request: std_srvs.srv.Trigger_Request()
# response:
# std_srvs.srv.Trigger_Response(success=True, message='biped') # quadruped代表四足
设置状态
source /opt/d1_ros2/namespace.sh
ros2 service call /$ROBOT_NS/command/set_controller_status std_srvs/srv/SetBool data:\ false # true 代表四足, false 代表双足
# requester: making request: std_srvs.srv.SetBool_Request(data=False)
# response:
# std_srvs.srv.SetBool_Response(success=True, message='biped')
上层command_sdk 接口
08 SDK Mode带*后遥控不发送command话题,可由用户发送话题来控制机器状态机切换,速度控制。
例程参考: https://github.com/DDTRobot/D1-ROS2-SDK-Demo.git
切换sdk模式
source /opt/d1_ros2/setup.bash
source /opt/d1_ros2/namespace.sh
# 开启sdk模式
ros2 param set /$ROBOT_NS/teleop_command use_sdk true
# 关闭sdk模式
ros2 param set /$ROBOT_NS/teleop_command use_sdk false
command/user_command使用一个话题来进行机器人状态机切换,速度控制,位姿控制
机器人状态机切换:状态机包含以下:
transform_up,transform_down,loco,joint_pd,car,rl_1,rl_2,rl_3,jump
说明:
1、双轮足的状态切换,包含以下:transform_up transform_down、car、 loco,而idle是空闲状态,transform_down之后,自动转入idle状态。
2、四轮足的状态切换,包含以下:transform_up、transform_down、 loco,而idle是空闲状态,transform_down之后,自动转入idle状态。
示例:
source /opt/d1_ros2/setup.bash
source /opt/d1_ros2/namespace.sh
# 站立
ros2 topic pub /$ROBOT_NS/command/user_command ddt_msgs/msg/UserCommand "{
fsm_mode : 'transform_up'
}"
# 趴下
ros2 topic pub /$ROBOT_NS/command/user_command ddt_msgs/msg/UserCommand "{
fsm_mode : 'transform_down'
}"
# 平地
ros2 topic pub /$ROBOT_NS/command/user_command ddt_msgs/msg/UserCommand "{
fsm_mode : 'loco'
}"
# 策略1
ros2 topic pub /$ROBOT_NS/command/user_command ddt_msgs/msg/UserCommand "{
fsm_mode : 'rl_1'
}"
速度控制
source /opt/d1_ros2/setup.bash
source /opt/d1_ros2/namespace.sh
ros2 topic pub /$ROBOT_NS/command/user_command ddt_msgs/msg/UserCommand "{
header: 'auto',
twist: { linear: { x: 0.0, y: 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 0.5 } }
}"
此时机器以一定的恒速自转。 实际最大速度由内部控制器决定,此处为指令输入最大限制。以四足为例:lin_vel_x为3.0(m/s)、max_twist_angular: 6.0(rad/s)
位姿控制
source /opt/d1_ros2/setup.bash
source /opt/d1_ros2/namespace.sh
ros2 topic pub /$ROBOT_NS/command/user_command ddt_msgs/msg/UserCommand "{
header: 'auto',
pose: {
position: {x: 0.0, y: 0.0, z: 0.0}, # 暂时不可控
orientation: {x: 0.0, y: 0.171, z: 0.0, w: 0.985}
}
}"
此时头部应该低下一定角度。 此处指令输入最大限制:
max_roll: 0.2
max_pitch: 0.4
控制器状态反馈
source /opt/d1_ros2/setup.bash
source /opt/d1_ros2/namespace.sh
ros2 topic echo /$ROBOT_NS/rl_controller/fsm
---
data: idle
---
说明:控制器状态反馈主要用于反馈机器人当前状态
关节控制
新增关节控制接口,控制器进入到debug状态,先发送
source /opt/d1_ros2/namespace.sh
source /opt/d1_ros2/setup.bash
ros2 topic pub /$ROBOT_NS/command/user_command ddt_msgs/msg/UserCommand "{
fsm_mode : 'debug'
}"
此时:

source /opt/d1_ros2/namespace.sh
source /opt/d1_ros2/setup.bash
ros2 topic pub /$ROBOT_NS/command/joint_command ddt_msgs/msg/JointControlCommand "{
header: 'auto',
name: ['FL_foot_joint'],
kp: [0.0],
kd: [0.5],
position: [0.0],
velocity: [1.0],
effort: [0.0]
}" --rate 10
此时可以发现左腿轮子在旋转,Ctrl+c后停止旋转